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 内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

通过淘宝数据爬虫学习python scrapy requests与response对象的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  3. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  4. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  5. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  6. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  7. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  8. ios – 保存从查询中获取的用户的属性(即不在currentUser上)

    我有兴趣根据currentUser执行的操作将属性保存到数据库中的用户.基于以下代码,我收到错误消息“除非已通过logIn或signUp验证用户,否则无法保存用户”我想知道是否有一个解决方法,我可以将属性保存到foundUser,而无需登录该用户.谢谢你的帮助!解决方法如果要更新当前不是登录用户的用户,则需要使用主密钥调用Parse.您可以从CloudCode执行此操作;并从您的iOS项目中调用它;

  9. 在iOS中使用NSJSONSerialization进行JSON解析

    解决方法首先在您的JSON响应字典中,在“RESPONSE”键下,您有一个数组而不是字典,该数组包含字典对象.所以要提取用户名和电子邮件ID,如下所示

  10. Xcode:Alamofire获得String响应

    我是IOS开发的新手,目前正在与Alamofire学习网络我正在尝试登录…每当凭证正确时,.PHP文件返回一个json,我可以通过以下代码从Alamofire获取json:现在……当凭证错误时,.PHP不会给json..而且它返回一个字符串..例如“wrong_password”或“userLocked”等等……如何通过Alamofire获得String响应?解决方法如果您希望JSON响应使用.responseJSON,如果您想要String响应,请使用.responseString.如果你想两者同时使用

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部