本文总结了爬虫框架中踩过的坑,以备不时之需,分享给大家。
目录
项目创建
使用命令 :scrapy startproject projectname
示例:在制定目录下(E:/pro)运行该命令,结果如下:
scrapy 是Scrapy 框架提供的命令;startproject 是 scrapy 的子命令,专门用于创建项目;spider_qichacha就是要创建的项目名(projectname)。
生成文件结构如下:
- scrapy.cfg:项目的总配置文件。
- spider_qichacha:项目的 Python 模块,程序将从此处导入 Python 代码。
- spider_qichacha/items.py:用于定义项目用到的 Item 类。类内可以自定义属性(需要爬取的字段)。
- spider_qichacha/pipelines.py:项目的管道文件,它负责处理爬取到的信息,包括数据存储、后处理、过滤等。
- spider_qichacha/settings.py:项目的配置文件,在该文件中进行项目相关配置,包括中间件参数配置、日志配置、等。有需要时,可以在此存放其他全局变量。
- spider_qichacha/spiders:在该目录下存放项目所需的蜘蛛,蜘蛛负责抓取项目感兴趣的信息。可以在此目录下新建.py文件,作为爬虫主体代码。
相关python库与官方文档
Scrapy
https://docs.scrapy.org/en/latest/index.html
Requests
https://2.python-requests.org//zh_CN/latest/user/advanced.html
pyquery
https://pythonhosted.org/pyquery/index.html
lxml
生成web请求
普通的get请求可以调用scrapy.Requests类,常用属性和方法如下:
- url: 包含request的URL的字符串
- headers: request的头信息
- meta: 一个dict,包含request的任意元数据。可以利用meta传递数据。
- replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback]): 返回一个参数相同的Request,
- 说明:修改url时,可以采用replace函数 request = request.replace(url=newurl)
网页内容解析工具
CSS 选择器
调用方法
response.css('表达式')
注意:response.css('表达式')获取的是选择器,调用extract()或getall()可以获取对应的内容,返回结果为列表。
表达式语法
- ::text 提取标签内容
- ::attr(name) 提取标签属性
- .classname 选择class=classname 的元素
Xpath
response.xpath(“表达式”)获取的是选择器,调用extract()或getall()可以获取对应的内容,返回结果为列表。
response.xpath('string(表达式)') 返回合并后的字符串,通常里面含有换行符和空格,需要进行二次处理。
注意:在进行多级选取时,需要在表达式前添加“.”,否则会获得错误的结果。
pyquery库
使用方法
from pyquery import PyQuery as pq
doc = pq("<html></html>") # 传入html字符串,构造doc
li = doc('li') # doc中传入标签名称,获得对应元素
text = li.text() # 调用text()方法,获得元素内容
优点
语法比xpath和css简单
动态内容
Javascript
有时需要模拟js代码。例如搜狗微信网页使用js代码修改链接,如下图。
修改前的链接
修改后的链接
直接访问修改前的链接,会触发验证码。此时,需要模拟js代码,获得修改后的链接。
Ajax
明确参数,构造请求即可,参数如下图。
针对返回内容进行解析,通常为json格式的数据。
反反爬措施
代理
Useragent
调用fake_useragent库的UserAgent接口,设置方法:
from fake_useragent import UserAgent
request.headers['User_Agent'] = UserAgent(verify_ssl=False).random
Referer
记录上一个网页链接,模拟网页跳转过程。
request.headers['Referer'] = 上一个网页链接
Cookie
Cookie主要用于解决验证码问题,例如搜狗微信公众号的验证码(https://weixin.sogou.com/antispider/?from=http%3A%2F%2Fweixin.sogou.com%2Fweixin%3Ftype%3D2%26query%3D%E6%AD%A6%E6%B1%89)。
解决步骤
- 判断get请求需要的cookie。
- 获取可用的cookie。可以调用同一网站的没有反爬措施的网页,获得可用的cookie;某些cookie也可以用uuid随机生成,不需要重新发送请求。
- 设置cookie,调用重试中间件,生成请求,绕过验证码。
Cookie设置方法
- 设置request.headers中的cookie
- DownloadMiddleware的process_request方法。首先在settings.py中设置COOKIES_ENABLED = True;然后调用中间件的process_request方法,添加request.cookies={}。
- 爬虫主文件中重写start_request。首先在settings.py中设置COOKIES_ENABLED = True;生成请求时添加cookies:scrapy.Request(url,dont_filter=True,cookies={自己的cookie})
下载器中间件
作用示意图
中间件可以实现三种方法:process_request/process_response/process_exception,分别用于实现对request/response/exception的处理。方法的输入输出见官方文档,解释的很详细。
说明
通常,process_request用来修改headers(user_agent/host/referrer/cookie)/proxy,process_exception用于捕获twisted error,process_response用于捕获http error。
常用中间件
HttpProxyMiddleware
设置代理
RetryMiddleware
重试中间件
RedirectMiddleware
重定向中间件。开启之后,容易自动重定向到验证码链接,不建议开启,建议在重试中间件中重构response方法,获取302/301的请求链接,并采用更换cookie等反反爬方法,进行重试。
UserAgentMiddleware
用于覆盖spider的默认user agent的中间件。要使得spider能覆盖默认的user agent,其 user_agent 属性必须被设置。
如果没有设置user_agent,建议禁用该中间件,然后在其他中间件中调用process_request方法,设置随机的user_agent。
说明
自定义中间件可以自定义一个类,也可以继承自以上默认类,通过重构类的方法,实现自己想要的功能。注意,中间件为顺序执行,避免进行重复的设置。
参数值设置
框架默认参数值如下:
注意:自定义中间件的参数值需要参考默认值进行设置,中间件的参数值大小决定其执行顺序,参数值小的中间件优先执行。可以修改spider/settings.py中的DOWNLOADER_MIDDLEWARES 参数,将不需要的默认中间件的参数设置为None,达到禁用此中间件的目的,如下图。
相关教程
官方文档:https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/downloader-middleware.html#id2
Retry 中间件:https://blog.csdn.net/sc_lilei/article/details/80702449
异常处理
Request.errback
生成请求时可以设置errback函数,捕获request处理过程中的未被process_exception捕获的异常,通常是twisted异常。
可以在errback函数中输出错误信息:
Settings设置
常用参数
-
ROBOTSTXT_OBEY
通常设为False,拒绝遵守 Robot协议
-
COOKIES_ENABLED = True
通常设为True,允许设置cookie
- DEFAULT_REQUEST_HEADERS
默认请求头
- ITEM_PIPELINES
item字段处理pipeline
- DOWNLOADER_MIDDLEWARES
下载器中间件
- HTTPERROR_ALLOWED_CODES
允许爬虫处理列表内的响应
- DOWNLOAD_TIMEOUT
等待的最大时间,单位秒,超时的请求不会处理
- DOWNLOAD_DELAY
下载等待的时间,限制爬虫速度
- CONCURRENT_REQUESTS_PER_DOMAIN
对单个网站进行并发请求的最大值
- CONCURRENT_REQUESTS_PER_IP
对单个ip进行并发请求的最大值
- RETRY_TIMES = 20
重试次数
参考资料
参考博客
https://blog.csdn.net/henry620/article/details/55505662
https://www.cnblogs.com/xueli/p/7250537.html
官方文档
https://docs.scrapy.org/en/latest/topics/settings.html
Scrapy日志
使用
导入logging库
import logging
logging.info(“***”)
logging.error(“***”)
logging.warning(“***”)
…
日志级别
debug() 调试级别,一般用于记录程序运行的详细信息,级别最低。
info() 事件级别,一般用于记录程序的运行过程
warnning() 警告级别,,一般用于记录程序出现潜在错误的情形
error() 错误级别,一般用于记录程序出现错误,但不影响整体运行
critical 严重错误级别 , 出现该错误已经影响到整体运行,级别最高。
相关设置
settings.py中的以下变量用于控制日志:
LOG_FILE 日志文件名
LOG_ENABLED =True开启日志,=False关闭日志
LOG_LEVEL 设置日志级别,低于此级别的信息不输出。可设置为‘INFO’ ‘DEBUG’ ‘WARNING’ ‘ERROR’ 等
爬虫部署工具
Scrapyd——爬虫部署
安装部署
教程:
https://www.cnblogs.com/wzbk/p/10332997.html
https://www.jianshu.com/p/ddd28f8b47fb (windows)
程序打包
命令:
scrapyd-deploy –build-egg eggname.egg
注意:
打包时需要同步修改爬虫项目的scrapy.cfg文件
教程:
https://www.cnblogs.com/Robertzewen/p/9322827.html
Spiderkeeper——爬虫可视化管理
安装配置
https://www.goldbegin.com/2019/01/24/SpiderKeeper/
egg上传