写点什么

通过淘宝数据学习爬虫,python scrapy requests 与 response 对象

作者:梦想橡皮擦
  • 2021 年 12 月 16 日
  • 本文字数:2446 字

    阅读完需:约 8 分钟

本篇博客复盘一下 scrapy 相关知识,首先从 Resquest 和 Response 对象开始。


@[toc]

Request 对象

在 scrapy 中 Request 对象代表着请求,即向服务器发送数据,该对象的构造函数原型如下所示:


def __init__(self, url, callback=None, method='GET', headers=None, body=None,                 cookies=None, meta=None, encoding='utf-8', priority=0,                 dont_filter=False, errback=None, flags=None, cb_kwargs=None)
复制代码


其中只有 url 为必填参数,具体说明如下:


  • callback:页面解析函数,当 Request 请求获取到 Response 响应之后,设定的函数会被调用,默认是 self.parse 方法;

  • method:请求类型,默认为 GET,所以使用 Request 是可以发送 POST 的请求的,FormRequest 类是 Request 类的子类;

  • headers:请求头,字典类型;

  • body:请求的正文,需要 bytes 类型或 str 类型;

  • cookies:Cookie 字典,dict 类型;

  • meta:元数据字典,dict 类型,可以给其它组件传递信息;

  • encoding:url 和 body 参数的编码,注意不是数据响应编码;

  • priority:请求的优先级,默认为 0,数值越大,优先级越高;

  • dont_filter:默认值为 False,该参数表示是否重复请求相同地址;

  • errback:请求异常时的回调函数。

Response 对象

在 scrapy 中,Response 对象表示请求响应对象,即服务器返回给爬虫的数据,其构造函数原型如下:


def __init__(self,url,status=200,headers=None,body=b"",    flags=None, request=None,certificate=None,ip_address=None,protocol=None,)
复制代码


与 Request 一致,该方法中仅 url 为必填参数,不过一般很少用到手动创建一个 Response 对象实例的场景。


Response 类衍生出来一个子类 TextResponse,然后 TextResponse 又衍生出来 HtmlResponseXmlResponse


Response 包括的属性和方法如下:


属性清单


  • url:响应地址;

  • status:响应状态码;

  • headers:响应头;

  • encoding:响应正文的编码;

  • body:响应正文,bytes 类型;

  • text:文本形式的响应正文,将 body 进行编码之后的数据;

  • request:获取请求对象;

  • meta:元数据字典,dict 类型,请求传递过来的参数;

  • selector:选择器对象。


方法清单


  • xpath():XPath 选择器;

  • css():CSS 选择器;

  • urljoin():就是 urllib.parse 模块的 urljoin()

  • json():将响应数据序列化为 JSON 格式;


关于 Request 和 Response 类的相关源码,可以在 scrapy\http 目录查看。

ItemPipeline

数据管道在 scrapy 中主要对数据进行处理,在实际开发过程中需要注意一个 ItemPipeline ,只负责一种功能的数据处理,当然在 scrapy 中你可以创建多个 ItemPipeline


ItemPipeline 的使用场景


  1. 数据清洗,例如去重,去除异常数据;

  2. 数据保存方式编写,例如存储 Mongodb,MySQL,Redis 数据库。


在编写 ItemPipeline 类的时候,不需要其继承特定类,只需要实现固定名称的方法即可,在之前的博客中已经反复提及,自定义 ItemPipeline 类需要实现 process_item()open_spider()close_spider() 方法,其中 process_item() 必须实现。


process_item() 返回值是 Item 或者字典,也可以返回一个 DropItem 类型的数据,此时该项 item 会被忽略,不会被后面的 ItemPipeline 处理。


过滤数据的逻辑实现


如果希望在 ItemPipeline 实现过滤数据,使用集合即可,发现集合中已经存在数据了,抛出 DropItem 即可。

LinkExtractor 提取链接

scrapy 编写的爬虫在提取大量链接时,使用 LinkExtractor 会更加便捷。使用 from scrapy.linkextractors import LinkExtractor 导入 LinkExtractor ,该类的构造函数如下所示:


def __init__(self, allow=(), deny=(),allow_domains=(),deny_domains=(),restrict_xpaths=(),        tags=('a', 'area'),attrs=('href',),canonicalize=False,unique=True,process_value=None,        deny_extensions=None,restrict_css=(),strip=True,restrict_text=None,    )
复制代码


其中各个参数说明如下:


  • allow:一个正则表达式或正则表达式列表,提取正则表达式匹配的 url,默认全部提取;

  • deny:与 allow 相反;

  • allow_domains:字符串或者列表,domain 限制;

  • deny_domains:与上面相反;

  • restrict_xpaths:按照 xpath 提取;

  • restrict_css:安装 css 选择器提取;

  • tags:提取指定标签内的链接;

  • attrs:提取指定属性内的链接;

  • process_value:函数类型,传入该参数之后,LinkExtractor 会将其匹配到的所有链接,都传入该函数进行处理。


下面的代码是提取 Response 对象中的链接,需要使用 extract_links() 方法。


def parse(self, response):    link = LinkExtractor()    all_links = link.extract_links(response)    print(all_links)
复制代码


  1. 创建一个 LinkExtractor 对象;

  2. 使用构造器参数描述提取规则;

  3. 调用 LinkExtractor 对象的 extract_links 方法传入一个 Response 对象,返回一个列表;

  4. 使用列表中的任意元素调用 .url 或者 .text 获取链接和链接文本。

爬虫编码时间

本次的目标站点是:淘数据-行业报告



完整代码编写如下所示,使用 LinkExtractor 提取页面超链接。


import scrapyfrom tao.items import TaoItemfrom scrapy.linkextractors import LinkExtractor

class TaoDataSpider(scrapy.Spider): name = 'tao_data' allowed_domains = ['taosj.com'] start_urls = [f'https://www.taosj.com/articles?pageNo={page}' for page in range(1, 124)]
def parse(self, response): link_extractor = LinkExtractor(allow=r'www\.taosj\.com/articles/\d+', restrict_css='a.report-page-list-title') links = link_extractor.extract_links(response) for l in links: item = { "url": l.url, "text": l.text } yield item
复制代码

写在后面

今天是持续写作的第 <font color=red>256</font> / 365 天。期待 <font color=#04a9f4>关注</font>,<font color=#04a9f4>点赞</font>、<font color=#04a9f4>评论</font>、<font color=#04a9f4>收藏</font>。


发布于: 2 小时前阅读数: 6
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
通过淘宝数据学习爬虫,python scrapy requests与response对象