Scrapy异步爬虫框架
一、scrapy简介
什么是Scrapy
- Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取
Scrapy,基于异步,使用了Twisted异步网络框架,可以加快我们的下载速度
优点
- 可配置、可扩展性非常高
- 比较灵活,让稳定和快速
- 基于异步,内部封装了这个twisted异步网络框架,复杂,采用了大量闭包
- 也提供了可控的速度
异步和非阻塞的区别
- 异步:调用在发出之后,这个调用就直接返回,不管有无结果
- 非阻塞:关注的是程序在等待调用结果时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程
(一)scrapy 的工作流程
Scrapy 功能组成 | 作用 | 是否还要编写 |
---|---|---|
Scrapy engine(引擎) | 总指挥:负责数据和信号的在不同模块间的传递 发动机、统筹全局、整个框架的核心 | 不需要 , scrapy已经实现 |
Scheduler(调度器) | 一个队列,存放引擎发过来的request请求(接收从引擎发过来的url,入列,然后向引擎发送request请求,直到url全部取完) | 不需要 |
Downloader(下载器) | 接收引擎发过来的请求,发出网页请求,得到相应结果,源码给引擎 | 不需要 |
Spider(爬虫) | 处理引擎发来的response,提取数据,提取url,并交给引擎 | 需要手写 |
Item Pipline(管道) | 处理引擎传过来的数据,比如存储(数据处理、存储数据) | 需要手写 |
Downloader Middlewares(下载中间件) | 可以设置headers、代理IP等),处理引擎和下载器之间的请求和响应 | 一般不用手写 |
Spider Middlewares(爬虫中间件) | 可以自定义requests请求和进行response过滤。处理下载器之间的 请求与响应、和发出新的请求) | 一般不用手写 |
(二)要用到的方法
一些方法 | 作 用 |
---|---|
response.body | 返回网页源代码,未解码 |
response.text | 返回网页源代码,解码str形式 |
response.xpath(xpath路径) | xapth路径,和普通xpath一样 |
scrapy.Request() | 返回给下载器,翻页和爬详情页会用到 ,参数:callback回调函数、dont_filter=True,默认false去重,meta={‘item’:item}用来给回调函数传参 |
meta覆盖问题
- 利用meta参数在进行不同的解析方法之间传递数据的时候,如果需要继续的交给调度器去请求,会出现item被覆盖的问题
- 解决方案:1 用deepcopy 2 创建新的item对象
二、scrapy 的快速入门
(一)前期准备
第一步 先创建scrapy项目 (dos命令行 pycharm终端)
- scrapy startproject mySpider(scrapy项目的名称)
scrapy startproject gsw
第二步 创建爬虫程序
- scrapy genspider demo “demo.cn” (demo是你爬虫的名字 demo.cn 爬取的范围)
- demo的名字最好不要和scrapy项目的名称重合
- 记得切换工作环境 cd
scrapy genspider gs "gushiwen.cn"
第三步 运行scrapy的命令
- 1 在终端 scrapy crawl 爬虫程序名字(例如db)
- 2 可以定义一个提供运行py文件,可以存在scrapy.cfg并列的文件夹里,例如start.py,用start来运行整个框架程序
# 运行py文件,写入
from scrapy import cmdline
#cmdline.execute('scrapy crawl gs'.split())
cmdline.execute(['scrapy','crawl','gs'])
(二)items.py封装文件
- 这里封装的是爬取下来的数据item,将其封装到类里面
import scrapy class GswItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() author = scrapy.Field() dynasty = scrapy.Field() content = scrapy.Field() pass
(三)settings.py配置项文件
为什么需要配置文件:
- 配置文件存放一些公共的变量(比如数据库的地址,账号密码等)
方便自己和别人修改 - 一般用全大写字母命名变量名 SQL_HOST = ‘192.168.0.1’
- settings文件详细信息:https://www.cnblogs.com/cnkai/p/7399573.html
OBOTSTXT_OBEY = False网站的君子协议
- 我们不遵守,改成False
CONCURRENT_REQUESTS = 16并发量
- 默认的并发量16
DOWNLOAD_DELAY = 1下载延迟
- 下载延迟默认3秒,改为1秒
COOKIES_ENABLED = False
- 默认是注释的,禁用
- 取消注释
- False 找到是settings请求抱头的cookies
- True 找到是下载中间键的cookies
DEFAULT_REQUEST_HEADERS请求抱头
- DEFAULT_REQUEST_HEADERS = {
‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,
‘Accept-Language’: ‘en’,
}