Scrapy介绍
- 什么是Scrapy
Scrapy是一个为了爬取数据网站,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取。
Scrapy使用了Twisted异步网络框架,可以加快我们的爬取速度
http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
-
异步和非阻塞的区别
image.png
异步:调用在发出之后,这个调用就直接返回,不管有无结果
非阻塞:关注的是程序在等待调用结果时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。
Scrapy工作流程
image.png
另一种爬虫方式
image.png
Scrapy工作流程
image.png
image.png
Scrapy入门
1.创建一个Scrapy项目
Scrapy startproject 项目名
2.生成一个爬虫
Scrapy genspider 爬虫名 "域名(example.com/cn)"
3.提取数据
完善spider 提取xpath等
4.保存数据
pipline中保存数据
在命令行中运行爬虫
Scrapy crawl qb # 爬虫的名字
在pycharm中运行爬虫
from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())
或者
cmdline.execute("scrapy","crawl","pb")
注意:
- pipeline上面有一条注释语句(Don't forget to add your pipeline to the ITEM_PIPELINES setting)不要忘记在settings中操作
- settings中不要忘记添加在DEFAULT_REQUEST_HEADERS添加UA
- spiders中返回数据时要用yield不要用return,return默认返回一条数据,scrapy速度很快
- LOG_LEVEL = 'WARNING'提高日志等级,取出一些不需要的东西
- 在Scrapy当中 get() extract_first() <div>这个是一个数据</div>
get()就是获取带有标签的数据 ---> <div>这个是一个数据</div>
extract_first() 得到文本的数据 --> 这个是一个数据
pipeline使用
从pipeline的字典形可以看出来,pipeline可以有多个
为什么需要多个pipeline
- 可能有多个spider,不同的pipeline处理不同的item内容
- 一个spider内容可以做不同的操作,不如存入不同的数据库
class SpiderPipeline1:
def process_item(self, item, spider):
if spider.name == 'taobao':
# print(item)
return item
# 方法中的spider参数,可通过spider.name的方式获取爬虫名字,然后不同的管道处理不同的爬虫
ITEM_PIPELINES = {
'spider.pipelines.SpiderPipeline': 300,
'spider.pipelines.SpiderPipeline1': 301
}
# settings中要设置两个爬虫
注意:
- pipeline的权重越小,优先级越高
- pipeline中process_item方法名不能修改为其它名称