Scrapy- 异步爬虫框架-分布式爬虫scrapy-redis-python爬虫知识点8
Scrapy异步爬虫框架
- 一、scrapy简介
-
- (一)scrapy 的工作流程
- (二)要用到的方法
- 二、scrapy 的快速入门
-
- (一)前期准备
- (二)items.py封装文件
- (三)settings.py配置项文件
- (三)爬虫程序名字.py文件
- (四)pipelines.py爬虫管道文件
- (五)middlewares.py中间键文件
- 三、scrapy 的多种请求方式
-
- (一)get请求
- (二)post请求
- (三)添加cookies
- (四)设置代理ip
- 四、crawlspider自动获取url
-
- (一)准备程序
- (二)爬虫程序名字.py文件
- 五、scrapy-redis分布式爬虫
-
- (一)scrapy_redis工作流程
- (二)实现分布式爬虫步骤
- 六、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)
CSDN-Ada助手: 为什么React 要提供 React Hooks 这种组件,普通的Component类不好么?
Passerby_Wang: 写得也太详细了吧,学到了好多 也欢迎博主来我这里指点一二呀
zkzap: network只能看自己电脑到服务器的请求信息?
鲍金昌: 写的鞭辟入里,学到了很多,感谢博主分享
洋芋本人: 是不是没有加浏览器驱动,driver = webdriver.Chrome()