【scrapy】最全爬虫攻略汇总

本文总结了爬虫框架中踩过的坑,以备不时之需,分享给大家。

目录

项目创建

相关python库与官方文档

Scrapy

Requests

pyquery

lxml

生成web请求

网页内容解析工具

CSS 选择器

调用方法

表达式语法

Xpath

pyquery库

使用方法

优点

动态内容

Javascript

Ajax

反反爬措施

代理

Useragent

Referer

解决步骤

Cookie设置方法

下载器中间件

作用示意图

说明

常用中间件

HttpProxyMiddleware

RetryMiddleware

RedirectMiddleware

UserAgentMiddleware

说明

参数值设置

相关教程

异常处理

Request.errback

Settings设置

常用参数

参考资料

Scrapy日志

使用

日志级别

相关设置

爬虫部署工具

Scrapyd——爬虫部署

安装部署

程序打包

Spiderkeeper——爬虫可视化管理

安装配置

egg上传

爬虫任务执行

 

项目创建

使用命令 :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

https://lxml.de/index.html

生成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()可以获取对应的内容,返回结果为列表。

表达式语法

  1. ::text 提取标签内容
  2. ::attr(name) 提取标签属性
  3. .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主要用于解决验证码问题,例如搜狗微信公众号的验证码(https://weixin.sogou.com/antispider/?from=http%3A%2F%2Fweixin.sogou.com%2Fweixin%3Ftype%3D2%26query%3D%E6%AD%A6%E6%B1%89)。

解决步骤

  1. 判断get请求需要的cookie。
  2. 获取可用的cookie。可以调用同一网站的没有反爬措施的网页,获得可用的cookie;某些cookie也可以用uuid随机生成,不需要重新发送请求。
  3. 设置cookie,调用重试中间件,生成请求,绕过验证码。

Cookie设置方法

  1. 设置request.headers中的cookie
  2. DownloadMiddleware的process_request方法。首先在settings.py中设置COOKIES_ENABLED = True;然后调用中间件的process_request方法,添加request.cookies={}。
  3. 爬虫主文件中重写start_request。首先在settings.py中设置COOKIES_ENABLED = True;生成请求时添加cookies:scrapy.Request(url,dont_filter=True,cookies={自己的cookie})

下载器中间件

作用示意图

https://user-gold-cdn.xitu.io/2018/11/19/1672979f95d226dc?w=426&h=117&f=png&s=20027

中间件可以实现三种方法: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上传

 

爬虫任务执行

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值