我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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又衍生出来 HtmlResponse和 XmlResponse

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的使用场景:

  • 数据清洗,例如去重,去除异常数据;
  • 数据保存方式编写,例如存储 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)
  • 创建一个LinkExtractor对象;
  • 使用构造器参数描述提取规则;
  • 调用LinkExtractor对象的 extract_links 方法传入一个Response对象,返回一个列表;
  • 使用列表中的任意元素调用 .url 或者 .text 获取链接和链接文本。

爬虫编码时间

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

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

import scrapy
from tao.items import TaoItem
from 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

到此这篇关于通过淘宝数据爬虫学习python scrapy requests与response对象的文章就介绍到这了,更多相关 python response 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录