sheng的学习笔记-网络爬虫scrapy框架

基础知识:

scrapy介绍

何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分,请求、响应、解析、存储,scrapy框架都已经搭建好了。scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架,scrapy使用了一种非阻塞的代码实现并发的

整体架构图

各组件:

数据处理流程

项目示例

环境搭建

下载依赖包

pip install wheel
下载twisted:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
安装twisted:pip install Twisted-17.1.0-cp36m-win_amd64.whl   (这个文件的路劲)
pip install pywin32
pip install scrapy
测试:在终端输入scrapy指令,没有报错表示安装成功
在anaconda中,可以直接装scrapy,会自动把依赖的包都装好

pyopenssl要改成22.0.0版本,否则调用request的时候报错,anaconda会自动改一下依赖的别的包的版本

创建项目

创建项目叫spider

1、打开pycharm的terminal
2、scrapy startproject spider    创建项目
3、cd spider
4、scrapy genspider douban www.xxx.com  创建爬虫程序  
5、需要有main.py里面的输出,则修改settings.py里面的ROBOTSTXT_OBEY = True改为False
6、scrapy crawl main
  不需要额外的输出则执行scrapy crawl main --nolog
   或者在settings.py里面添加LOG_LEVEL='ERROR',main.py有错误代码会报错(不添加有错误时则不会报错)(常用)

打开spider项目,里面有个spiders文件夹,称为爬虫文件夹,在这里放爬虫业务文件

项目代码

在douban.py里,写爬虫程序

此处是爬虫业务逻辑,爬到网站地址,对于爬虫返回结果的解析,在parse中做

根据应答的数据,解析,可以用xpath或者css解析,找到对应的数据

import scrapy
from scrapy import Selector, Request
from scrapy.http import HtmlResponsefrom spider.items import MovieItemclass DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = ['movie.douban.com']start_urls = ['https://movie.douban.com/top250']def start_requests(self):for page in range(10):yield Request(url=f'https://movie.douban.com/top250?start={page * 25}&filter=')def parse(self, response: HtmlResponse, **kwargs):sel = Selector(response)list_items = sel.css("#content > div > div.article > ol > li")for list_item in list_items:movie_item = MovieItem()movie_item['title'] = list_item.css('span.title::text').extract_first()movie_item['rank'] = list_item.css('span.rating_num::text').extract_first()movie_item['subject'] = list_item.css('span.inq::text').extract_first()yield movie_item# href_list = sel.css('div.paginator > a::attr(href)')# for href in href_list:#     url =  response.urljoin(href.extract())

其中,将返回的值转化为对象,需要在item.py里改一下代码

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapy#爬虫获取到到数据需要组装成item对象
class MovieItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()rank = scrapy.Field()subject = scrapy.Field()

执行爬虫

执行工程:scrapy crawl douban -o douban.csv (运行douban爬虫文件,并将结果生成到douban.csv里面)
如果被识别了是爬虫程序,在setting中设置一下user agent的值

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36' # User-Agent字符串

保存数据

默认可以支持保存到csv,json

保存到excel

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import openpyxl#将爬虫返回的数据持久化,先存放到excel
class ExcelPipeline:# 创建excel工作簿和工作表def __init__(self):self.wb = openpyxl.Workbook()# wb.create_sheet()self.ws = self.wb.active  #激活工作表self.ws.title = "Top250"   #改名字self.ws.append(('标题','评分','主题'))def close_spider(self,spider):self.wb.save('电影数据.xlsx')# item就是数据def process_item(self, item, spider):title = item.get('title','')rank = item.get('rank', '')subject = item.get('subject', '')self.ws.append((title,rank,subject))return item

在setting.py中改一下配置,找到这个注释,去掉注释

前面是管道名称,如果多个管道,在这里配置多个值,数字小的先执行,数字大的后执行

值要和类名字一致,我改了名字

ITEM_PIPELINES = {'spider.pipelines.ExcelPipeline': 300,
}

运行命令。  scrapy crawl douban 

保存到数据库mysql

新增一个mysql的持久化逻辑,init的时候创建连接,process的时候插入,close的时候提交和关闭连接

建表语句

create table tb_top_move(
movie_id INT AUTO_INCREMENT PRIMARY KEY comment '编号',
title varchar(50) not null comment '标题',
rating decimal(3,1) not null comment '评分',
subject varchar(200) not null comment '主题'
) engine=innodb comment='Top电影表'
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import openpyxl
import pymysql#将爬虫返回的数据持久化,先存放到mysql
class MysqlPipeline:# 创建excel工作簿和工作表def __init__(self):#todo 设置db信息self.conn = pymysql.connect(host='127.0.0.1',port=,user='',password='',database='',charset='utf8mb4')self.cursor = self.conn.cursor()def close_spider(self,spider):self.conn.commit()self.conn.close()# item就是数据def process_item(self, item, spider):title = item.get('title', '')rank = item.get('rank', 0)subject = item.get('subject', '')self.cursor.execute('insert into tb_top_move(title,rating,subject) values (%s,%s,%s)',(title,rank,subject))return item#将爬虫返回的数据持久化,先存放到excel
class ExcelPipeline:# 创建excel工作簿和工作表def __init__(self):self.wb = openpyxl.Workbook()# wb.create_sheet()self.ws = self.wb.active  #激活工作表self.ws.title = "Top250"   #改名字self.ws.append(('标题','评分','主题'))def close_spider(self,spider):self.wb.save('电影数据.xlsx')# item就是数据def process_item(self, item, spider):title = item.get('title','')rank = item.get('rank', '')subject = item.get('subject', '')self.ws.append((title,rank,subject))return item

改下setting的配置

ITEM_PIPELINES = {'spider.pipelines.MysqlPipeline': 200,'spider.pipelines.ExcelPipeline': 300,
}

如果需要代理,可以用这种方式,在douban的py中修改

运行爬虫

scrapy crawl douban

多层爬虫

在爬了第一个页面,跟进内容爬第二个页面,比如在第一个汇总页面,想要知道《霸王别姬》中的时长和介绍,要点进去看到第二个页面

核心是douban.py中,parse函数yield返回的,是一个新的请求,并通过parse_detail作为回调函数进行第二层页面的解析

代码:

douban.py

import scrapy
from scrapy import Selector, Request
from scrapy.http import HtmlResponsefrom spider.items import MovieItemclass DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = ['movie.douban.com']start_urls = ['https://movie.douban.com/top250']def start_requests(self):for page in range(1):yield Request(url=f'https://movie.douban.com/top250?start={page * 25}&filter=')def parse(self, response: HtmlResponse, **kwargs):sel = Selector(response)list_items = sel.css("#content > div > div.article > ol > li")for list_item in list_items:detail_url = list_item.css("div.info > div.hd > a::attr(href)").extract_first()movie_item = MovieItem()movie_item['title'] = list_item.css('span.title::text').extract_first()movie_item['rank'] = list_item.css('span.rating_num::text').extract_first()movie_item['subject'] = list_item.css('span.inq::text').extract_first() or ''# yield movie_itemyield Request(url=detail_url, callback=self.parse_detail,cb_kwargs={'item':movie_item})# href_list = sel.css('div.paginator > a::attr(href)')# for href in href_list:#     url =  response.urljoin(href.extract())def parse_detail(self,response,**kwargs):movie_item = kwargs['item']sel = Selector(response)movie_item['duration']=sel.css('span[property="v:runtime"]::attr(content)').extract()movie_item['intro']=sel.css('span[property="v:summary"]::text').extract_first() or ''yield movie_item

/items.py

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapy#爬虫获取到到数据需要组装成item对象
class MovieItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()rank = scrapy.Field()subject = scrapy.Field()duration = scrapy.Field()intro = scrapy.Field()

/pipelines.py

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import openpyxl
import pymysql'''
建表语句
create table tb_top_move(
movie_id INT AUTO_INCREMENT PRIMARY KEY comment '编号',
title varchar(50) not null comment '标题',
rating decimal(3,1) not null comment '评分',
subject varchar(200) not null comment '主题',
duration int comment '时长',
intro varchar(10000) comment '介绍'
) engine=innodb comment='Top电影表'
'''#将爬虫返回的数据持久化,先存放到excel
class MysqlPipeline:# 创建excel工作簿和工作表def __init__(self):#todo 设置db信息self.conn = pymysql.connect(host='127.0.0.1',port=3306,user='lzs_mysql',password='lzs',database='mysql',charset='utf8mb4')self.cursor = self.conn.cursor()def close_spider(self,spider):self.conn.commit()self.conn.close()# item就是数据def process_item(self, item, spider):title = item.get('title', '')rank = item.get('rank', 0)subject = item.get('subject', '')duration = item.get('duration', '')intro = item.get('intro', '')self.cursor.execute('insert into tb_top_move(title,rating,subject,duration,intro) values (%s,%s,%s,%s,%s)',(title,rank,subject,duration,intro))return item#将爬虫返回的数据持久化,先存放到excel
class ExcelPipeline:# 创建excel工作簿和工作表def __init__(self):self.wb = openpyxl.Workbook()# wb.create_sheet()self.ws = self.wb.active  #激活工作表self.ws.title = "Top250"   #改名字self.ws.append(('标题','评分','主题'))def close_spider(self,spider):self.wb.save('电影数据.xlsx')# item就是数据def process_item(self, item, spider):title = item.get('title','')rank = item.get('rank', '')subject = item.get('subject', '')self.ws.append((title,rank,subject))return item

运行爬虫

scrapy crawl douban

中间件

中间件分为蜘蛛中间件和下载中间件

蜘蛛中间件一般不动

如果想要在请求中加上cookie,可以在中间件上的请求加上cookie信息

在middlewares.py类中,加上一个方法,获取cookie信息

修改middle的类

修改配置setting

参考文章:

02.使用Scrapy框架-1-创建项目_哔哩哔哩_bilibili

https://www.cnblogs.com/12345huangchun/p/10501673.html

Scrapy框架(高效爬虫)_scrapy爬虫框架-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/255996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TI毫米波雷达开发——High Accuracy Demo 串口数据接收及TLV协议解析 matlab 源码

TI毫米波雷达开发——串口数据接收及TLV协议解析 matlab 源码 前置基础源代码功能说明功能演示视频文件结构01.bin / 02.binParseData.mread_file_and_plot_object_location.mread_serial_port_and_plot_object_location.m函数解析configureSport(comportSnum)readUartCallback…

LMDeploy 大模型量化部署实践

在浦语的MDeploy大模型量化部署实践课程中,可能需要完成的任务包括: 大模型部署背景 2、LMDeploy简介 环境配置:这个部分你需要安装并设置相关的开发工具和库。这可能包括Python环境、LMDeploy库等等。你需要明确写出你使用的操作系统以及安装…

UML 2.5图形库

UML 2.5图形库 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能,并实现了云端存储&#…

Java编程练习之类的继承

1.创建银行卡类,并分别设计两个储蓄卡和信用卡子类。 import javax.swing.plaf.BorderUIResource;import java.util.Scanner;class Card {int Id; //银行卡;int password; //密码;double balance2000; //账户存款金额;String A…

【SpringBootStarter】自定义全局加解密组件

【SpringBootStarter】 目的 了解SpringBoot Starter相关概念以及开发流程实现自定义SpringBoot Starter(全局加解密)了解测试流程优化 最终引用的效果&#xff1a; <dependency><groupId>com.xbhog</groupId><artifactId>globalValidation-spring…

《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)

文章目录 3.1 查询优化技巧3.1.1 基础知识3.1.2 重点案例&#xff1a;电商平台商品搜索3.1.3 拓展案例 1&#xff1a;博客平台的文章检索3.1.4 拓展案例 2&#xff1a;用户登录查询优化 3.2 索引和查询性能3.2.1 基础知识3.2.2 重点案例&#xff1a;电商平台的订单历史查询3.2.…

Java中“==”和equals方法的区别

目录 一、“”举例 二、equals举例 区别如下&#xff1a; &#xff08;1&#xff09;“”既可以用在基本数据类型&#xff0c;也可以用在引用数据类型&#xff1b;如果用在基本数据类型上&#xff0c;那么比较时比较的是具体的值&#xff0c;如果用在引用数据类型&#xff0c…

React+Antd实现省、市区级联下拉多选组件(支持只选省不选市)

1、效果 是你要的效果&#xff0c;咱们继续往下看&#xff0c;搜索面板实现省市区下拉&#xff0c;原本有antd的Cascader组件&#xff0c;但是级联组件必须选到子节点&#xff0c;不能只选省&#xff0c;满足不了页面的需求 2、环境准备 1、react18 2、antd 4 3、功能实现 …

创建一个VUE项目(vue2和vue3)

背景&#xff1a;电脑已经安装完vue2和vue3环境 一台Mac同时安装vue2和vue3 https://blog.csdn.net/c103363/article/details/136059783 创建vue2项目 vue init webpack "项目名称"创建vue3项目 vue create "项目名称"

没更新的日子也在努力呀,布局2024!

文章目录 ⭐ 没更新的日子也在努力呀⭐ 近期的一个状态 - 已圆满⭐ 又到了2024的许愿时间了⭐ 开发者要如何去 "创富" ⭐ 没更新的日子也在努力呀 感觉很久没有更新视频了&#xff0c;好吧&#xff0c;其实真的很久没有更新短视频了。最近的一两个月真的太忙了&#…

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

【Java数据结构】单向 不带头 非循环 链表实现

模拟实现LinkedList&#xff1a;下一篇文章 LinkedList底层是双向、不带头结点、非循环的链表 /*** LinkedList的模拟实现*单向 不带头 非循环链表实现*/ class SingleLinkedList {class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val …

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

Mybatis详解

MyBatis是什么 MyBatis是一个持久层框架&#xff0c;用于简化数据库操作的开发。它通过将SQL语句和Java方法进行映射&#xff0c;实现了数据库操作的解耦和简化。以下是MyBatis的优点和缺点&#xff1a; 优点&#xff1a; 1. 灵活性&#xff1a;MyBatis允许开发人员编写原生的…

GPT-4模型中的token和Tokenization概念介绍

Token从字面意思上看是游戏代币&#xff0c;用在深度学习中的自然语言处理领域中时&#xff0c;代表着输入文字序列的“代币化”。那么海量语料中的文字序列&#xff0c;就可以转化为海量的代币&#xff0c;用来训练我们的模型。这样我们就能够理解“用于GPT-4训练的token数量大…

react中hook封装一个table组件 与 useColumns组件

目录 1&#xff1a;react中hook封装一个table组件依赖CommonTable / index.tsx使用组件效果 2&#xff1a;useColumns组件useColumns.tsx使用 1&#xff1a;react中hook封装一个table组件 依赖 cnpm i react-resizable --save cnpm i ahooks cnpm i --save-dev types/react-r…

KingSCADA实现按钮点击效果

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在做SCADA项目的时候&#xff0c;按钮是不可缺少的功能&#xff0c;但软件自带的按钮太丑&#xff0c;已经无法满足现如今客户对界面美观度的要求。 这时候就需要UI小姐姐设计美观大气的SCADA界面&#xff0c;但UI设计…

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

STM32 7-8

目录 ADC AD单通道 AD多通道 DMA DMA转运数据 DMAAD多通道 ADC AD单通道 AD.c #include "stm32f10x.h" // Device header/*** brief 初始化AD所需要的所有设备* param 无* retval 无*/ void AD_Init(void) {RCC_APB2PeriphClockCmd(RCC_AP…