通过淘宝数据爬虫学习python scrapy requests与response对象
作者:??梦想橡皮擦???? 发布时间:2021-11-07 05:46:39
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
来源:https://juejin.cn/post/7065856761462259749


猜你喜欢
- 1、前提1.1 docker 安装elasticsearch查询elasticsearch 版本docker search elastics
- 写个小教程,以期能让大家对jQuery有所了解,甚至喜欢上它(请不要怪我)。不废话,先说明我们的目的。我们知道,当代浏览器(modern b
- 手机控件查看工具uiautomatorviewer工具简介用来扫描和分析Android应用程序的UI控件的工具.如何使用 1.进入
- python使用ctypes调用C/C++1. ctpes介绍ctypes is a foreign function library fo
- 如下所示:# coding: utf-8import paramikoimport MySQLdbdef main(): connectio
- 异常的传递性在 Python 中,异常的传递性指的是,当一个异常没有被处理时,它会沿着调用栈向上抛出,直到被处理或者导致程序崩溃。具体来说,
- 概述Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。包括以下工具:在 CSS 过渡和动画中自动应用 class可以
- 1.global关键字默认情况下,在局部作用域对全局变量只能进行:读取,修改内部元素(可变类型),无法对全局变量进行重新赋值读取:CITY=
- 一般说来,你会把模板以文件的方式存储在文件系统中,但是你也可以使用自定义的 template loaders 从其他来源加载模板。Djang
- 权限级别划分如下:①、院长和财务科长:不能输入,可以无限制查询、统计;②、副院长:不能输入,可以查询、统计其分管部门的帐务;③、部门领导:不
- 本文实例讲述了python中Genarator函数用法。分享给大家供大家参考。具体如下:Generator函数的定义与普通函数的定义没有什么
- 环境描述: 某公司装了一台SQL Server数据库,为了保证数据库能够在出现故障时及时的修复,管理员做了备份操作,比如说完整备份+差异备份
- 方法:通过wxs定义indexOf方法,在页面中引用并使用栗子:wxs:命名为str.wxs,导出定义的defineIndexOf方法,命名
- 在 Python 中,集合(set)是一种无序且不重复的集合类型,它是由花括号 {} 括起来的一组元素。如果你想向集合中添加一个元素,你可以
- instr函数为字符查找函数,其功能是查找一个字符串在另一个字符串中首次出现的位置。instr函数在Oracle/PLSQL中是返回要截取的
- 一、安装写出许多有趣的可视化东西也可以画出很多奇妙的图案pip install turtule二、画布画布就是turtle为我们展开用于绘图
- 一、问题描述一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No
- 为什么说刷新页面vuex的数据会丢失刷新页面vuex的数据会丢失属于正常现象,因为JS的数据都是保存在浏览器的堆栈内存里面的,刷新浏览器页面
- 一,引言开发环境:Pycharm操作系统:Windows 10Pyhon版本:3.9.9需要自行安装Pygame 3(必须)和Python(
- 本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家本来用按键精灵是可以实现我的需求,而且更简单,但既然学py