介绍
-
scrapy中文文档是一个为了爬取网站数据、提取结构性数据而编写的应用框架,我们只需实现少量的代码,即可快速抓取数据。
-
scrapy使用了Twisted异步网络框架,可以加快下载速度。
创建项目
- 流程:
- 创建项目:
scrapy startproject (爬虫名字)
- 创建爬虫:进入项目所在路径,执行命令
scrapy genspider (爬虫名字) ('网站的域名')
- 注意: 爬虫名字和项目名字不能相同
- 执行爬虫:进入项目所在路径,
scrapy crawl (爬虫名字)
- 注意: 爬虫名字无需加后缀
- 创建项目:
- 目录结构:
- items.py:用来存放爬虫爬取下来数据的模型。
- middlewares.py:存放各种中间文件。
- pipelines.py:将items的模型存放到本地磁盘中。
- settings.py:爬虫的设置(请求头,多久发送一次请求,ip代理池等)。
- scrapy.cfg:项目的配置文件。
- spiders文件夹:所有的爬虫,都放在这个里面。
各文件详解
爬虫文件
- 使用
logging
设置日志。 response
是一个scrapy.http.response.html.HtmlResponse
对象。可执行xpath
和css selector
来提取数据。response对象
提取数据的常用方法:extract()
:获取文本。返回列表。extract_first()
:只获取到第一个文本。返回字符串。get()
:获取的是Selector
中的第一个文本,返回字符串。getall()
:获取Selector
中的所有文本,返回列表。
- 提取到的数据,是
Selector
或者SelectorList
对象。 - 如果数据解析回来,要传给
pipline
处理,可以使用yield
来返回给pipelines
item
:建议在items.py
中定义好模型,以后就不要使用字典。- 翻页爬取:
xpath
判断是否有下一页- 有:
yield scrapy.Request(next_url,callback=self.parse)
- 无:直接
return
停止parse()
。
- 有:
- 注意:
callback
参数指向的函数,如果请求方式相同,就是原函数parse()
。否则可以自定义parse1()...
- 获取
settings
的配置参数:self.settings.attributes.keys()
settings.py
- 任何一个爬虫项目的第一步就是设置
ROBOTSTXT_OBEY = False
,默认True
- 添加请求头:给
DEFAULT_REQUEST_HEADERS
字典添加键值对,可以添加ua
,cookies
… - 限制日志的输出:添加
LOG_LEVEL='WARNING'
,这样只会打印warning
及以上的日志 - 日志保存到本地:添加
LOG_FILE='./xxx.log'
,会保存在爬虫项目同一目录下而不打印出来 - 常用参数的含义:
BOT_NAME
:项目名称。SPIDER_MODULES
、NEWSPIDER_MODULE
:爬虫的位置。CONCURRENT_REQUESTS
:最大线程数量,默认为16。DOWNLOAD_DELAY
:下载延迟。就是请求后sleep()
多少秒。CONCURRENT_REQUESTS_PER_DOMAIN
,CONCURRENT_REQUESTS_PER_IP
:
每个域名和ip的最大请求数,必须配合DOWNLOAD_DELAY使用。COOKIES_ENABLED
:下一次请求是否携带上一次的cookies
,默认开启。DEFAULT_REQUEST_HEADERS
:默认请求头,user-agent
,cookie
等都在这里添加
settings.py
自己添加的参数怎么在爬虫文件中使用:parse()
:self.settings['参数']
或self.settings.get('参数','')
from [项目名].settings import [参数]
settings.py
自己添加的参数怎么在pipelines.py
中使用:process_item()
):parse()
->spider.settings.get('参数')
pipelines
- 激活:在
settings.py
中,设置ITEM_PIPLINES
,即取消注释。 - 多个爬虫:可以给
ITEM_PIPELINES
传入多个Project0Pipeline
, 根据条件爬取多个网站 - 有3个常用方法:
open_spider(self,spider)
:爬虫开始时执行,
一般写self.fp=open(path,mode)
可在此对爬虫文件添加属性:
(open函数)spider.index = 3
-> (爬虫文件)print(self.index)
process_item(self,item,spider)
:爬虫传进来数据item
的时候执行
一般写self.fp.write()
如果不return
,另一个权重较低的pipelines
就不会获取到该item
close_spider(self,spider)
:爬虫关闭的时候执行
一般会写self.fp.close()
- 权重:
settings.py
中ITEM_PIPLINES
的数字代表权重。数字约【小】优先级越【高】。 - 为什么可能有多个
pipeline
:- 可能会有多个
spider
,不同的pipeline
处理不同的item
内容 - 一个
spider
的内容可能要做不同的操作,比如存入不同的数据库中
- 可能会有多个
- 获取settings的配置参数:
open_spider -> spider.settings.get('参数名',None)
middlewares
- 开启:
settings.py
->DOWNLOADER_MIDDLEWARES
打开 Downloader Middlewares
默认的方法:process_request(self,request,spider)
:
当每个request
通过下载中间件时调用process_response(self,request,response,spider)
:
当下载器完成http请求,传递响应给引擎时调用
logging模块
-
scrapy框架中:
settings.py
设置LOG_LEVEL='WARNING'
settings.py
设置LOG_FILE='./xxx.log'
,这样既可设置日志保存的位置,设置后终端不会显示日志内容。-
import logging #实例化logger对象,可在任何py文件中输出想要的日志 logger=logging.getlogger(__name__)
-
普通.py文件中:
import logging #设置日志样式 logging.basicConfig(...) #实例化logger对象,可在任何文件中导入调用logger logger = logging.getlogger(__name__)
CrawlSpider
寻找url地址更方便。
- 创建爬虫:
scrapy genspider -t crawl [爬虫名] [域名]
- 指定
start_urls
,对应的响应会通过规则提取url地址。 - 完善urls:添加
Rule(LinkExtractor(allow='正则',callback='',follow=''))
- 参数:
allow
: 包含url规则的LinkExtractor对象
callback
: 制定满足规则的url的解析函数字符串follow
: response中提取的链接是否继续跟进
- 参数:
- 若url不完整,
crawlspider
会自动补充完整后请求。 parse()
函数名不能改变,也不能再定义,因为它有特殊的功能需要实现(如基础url提取)spiders.Rule
常见参数:link_extractor
:是一个LinkExtractor对象
,用于定义需要提取的链接。callback
:连接读取器提起出来的url对应的响应交给它处理。follow
:连接读取器提起出来的url对应的响应是否继续被rules来过滤。process_links
:用来过滤url。指定该spider中那个的函数会被调用,
从link_extractor
中获取到链接列表时自动调用。process_request
:用来过滤request
。
指定该spider中哪个的函数将会调用,该规则提取到每个reques
t时都会调用该函数
linkExtractor
更多常见参数:allow
:满足re
的匹配,如果括号为空,匹配所有。deny
:对allow
取反,对re
全不匹配。(优先级高于allow
)allow_domains
:会被提取的url的域名。deny_domains
:对allow_domains
取反。restrict_xpaths
:使用xpath
和allow共同作用过滤。即xpath满足条件的url会被提取。
scrapy shell
- 简述:
Scrapy Shell
是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以来测试Xpath - 使用方法:
scrapy shell [网址url]
- 常用属性:
response.url
:当前响应的url地址。response.request.url
:当前响应对象请求的url。response.headers
:响应头。response.body
:响应体,即html代码,默认为byte
类型。response.requests.headers
:当前响应的请求头。
scrapy_redis
- Scrapy_redis在scrapy的基础上实现了更多、更强大的功能。具体体现在:request去重、爬虫持久化、轻松实现分布式。[参考](