from:Mp
ps:内容均为自我总结
简介
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
借助框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
Scrapy 使用了Twisted 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求
官方文档 https://doc.scrapy.org/en/latest/
架构内容
- Scrapy Engine:引擎
- Scheduler:调度器
- Downloader:下载器
- Spider:爬虫
- Item Pipline:管道
- 两个中间件(Downloader Middlewares,Spider Middlewares)
架构图
ps: 图源官方文档
运作流程
- spider 将url给-->engine
- engine传递request-->scheduler
- scheduler处理request并返回-->engine
- engine传递处理好的request-->downloader
- downloader按照下载中间件下载request请求-->engine
- engine返还下载好的response-->spiders
- spiders处理response,返回数据和跟进的url-->engine
- engine 传递数据和跟进的url-->item pipline,scheduler
- item pipline 处理数据,跟进的url按之前的循环,直到结束
安装
pip install Scrapy
scrapy相关操作
# 创建项目
scrapy startproject 项目名
# 创建爬虫
scrapy genspider 爬虫名 爬取域范围
# 保存数据
scrapy crawl 爬虫名 -o 自建名.json # json格式,默认为Unicode编码
scrapy crawl 爬虫名 -o 自建名.jsonl # json lines格式,默认为Unicode编码
scrapy crawl 爬虫名 -o 自建名.csv # csv 逗号表达式,可用Excel打开
scrapy crawl 爬虫名 -o 自建名.xml # xml格式
# 显示当前目录中的爬虫
scrapy list
创建项目后,自动创建的文件作用
- scrapy.cfg :项目的配置文件
- mySpider/ :项目的Python模块,将会从这里引用代码
- mySpider/items.py :项目的目标文件
- mySpider/pipelines.py :项目的管道文件
- mySpider/settings.py :项目的设置文件
- mySpider/spiders/ :存储爬虫代码目录
Scrapy Shell(可用于数据提取时的测试)
启动
scrapy shell "想要获取信息的url"
启动后,Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,如request,response等
可以使用Selectors选择器进行操作
"""Selector有四个基本的方法"""
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
extract(): 序列化该节点为Unicode字符串并返回list
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4
re(): 根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表
Spider 爬虫的代码文件
主要的属性和方法
name: 定义spider名字的字符串。
allowed_domains: 包含了spider允许爬取的域名(domain)的列表,可选。
start_urls: 初始URL元祖/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。
start_requests(self): 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。
当spider启动爬取并且未指定start_urls时,该方法被调用。
parse(self, response): 当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。用来处理网页返回的response,以及生成Item或者Request对象。
# 基本结构举例:
class LiziSpider(scrapy.Spider):
name = "lizi"
allowed_domains = ["lizi.cn"]
start_urls = ["http://lizi.cn/...."]
def parse(self, response):
pass
Pipline 爬虫的管道文件
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
主要的方法
def __init__(self):
# 可选实现,做参数初始化等
def process_item(self, item, spider):
# 这个方法必须实现,每个item pipeline组件都需要调用该方法,
"""
item (Item 对象) – 被爬取的item
spider (Spider 对象) – 爬取该item的spider
"""
# 这个方法必须返回一个 Item对象,被丢弃的item将不会被之后的pipeline组件所处理。
return item
def open_spider(self, spider):
# 可选实现,当spider被开启时,这个方法被调用。
# spider (Spider 对象) – 被开启的spider
def close_spider(self, spider):
# 可选实现,当spider被关闭时,这个方法被调用
# spider (Spider 对象) – 被关闭的spider
启用Item Pipeline组件
# settings文件中将编辑好的pipline添加到ITEM_PIPELINES列表中
ITEM_PIPELINES = {
"mySpider.pipelines.LiziPipeline":300
}
Settings 提供定制Scrapy组件的方法
官方文档:http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/settings.html#topics-settings-ref
基本设定
- BOT_NAME: 项目名
- DOWNLOAD_DELAY: 下载器在下载同一个网站下一个页面前需要等待的时间
- CONCURRENT_REQUESTS: 并发请求(concurrent requests)的最大值
- USER_AGENT: 浏览器标识
- ROBOTSTXT_OBEY: 是否遵循爬虫协议
- ITEM_PIPELINES: 保存项目中启用的pipeline及其顺序的字典
- PROXIES: 代理设置
- COOKIES_ENABLED: 是否禁用cookies
- DEFAULT_REQUEST_HEADERS: Scrapy HTTP Request使用的默认header。
Downloader Middlewares 下载中间件
下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件
主要的方法
def process_request(self, request, spider):
# 当每个request通过下载中间件时,该方法被调用
...
return None
# 如果其返回None,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用
# 如果其返回response对象,其将返回该response,已安装的中间件的process_response() 方法则会在每个response返回时被调用。
# 如果其返回request对象,Scrapy则停止调用process_request方法并重新调度返回的request。
# 如果其raise一个IgnoreRequest异常,则安装的下载中间件的process_exception()方法会被调用。如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常,则该异常被忽略且不记录
def process_response(self, request, response, spider):
# 当下载器完成http请求,传递响应给引擎的时候调用
...
return response
# 如果其返回一个response,该response会被在链中的其他中间件的 process_response() 方法处理。
# 如果其返回一个Request,则中间件链停止,返回的request会被重新调度下载。
# 如果其抛出一个IgnoreRequest异常,则调用request的errback(Request.errback)。 #如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。
# settings文件中将编辑好的middlewares添加到ITEM_PIPELINES列表中
DOWNLOADER_MIDDLEWARES = {
'mySpider.middlewares.LiziMiddleware': 543,
}