万事须己运,他得非我贤。这篇文章主要讲述#yyds干货盘点# 通过淘宝数据学习爬虫,python scrapy requests与response对象相关的知识,希望能为你提供帮助。
本篇博客复盘一下 scrapy 相关知识,首先从 Resquest 和 Response 对象开始。
@[toc]
Request 对象【#yyds干货盘点# 通过淘宝数据学习爬虫,python scrapy requests与response对象】在 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
:请求异常时的回调函数。
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 格式;
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=https://www.songbingjia.com/android/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 LinkExtractorclass TaoDataSpider(scrapy.Spider):
name = tao_data
allowed_domains = [taosj.com]
start_urls = [fhttps://www.taosj.com/articles?pageNo=page for page in range(1, 124)]def parse(self, response):
link_extractor = LinkExtractor(allow=rwww\\.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.textyield item
写在后面
推荐阅读
- k8s-day2-名词解释(master)
- 阿里云基本概念与基础架构 #yyds干货盘点#
- #yyds干货盘点# CoCon: A Self-Supervised Approach for Controlled Text Generation | ICLR 2021 论文
- 来自面试官一面MySQL索引的连续灵魂拷问
- #私藏项目实操分享#如何利用 onlyoffice 实现文档格式转换
- 我嗨了,竟然能直接访问github了,真不是标题党
- # yyds干货盘点 # 怎么在第一个PDF文件的中间,插入第二个PDF文件的内容()
- #yyds干货盘点#HCIE-Security Day15(防火墙双机热备实验防火墙透明接入,上下行连接交换机)
- #yyds干货盘点#Android C++系列(访问Assets 文件夹)