好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

通过淘宝数据爬虫学习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测试数据']
    start_urls = [f'https://HdhCmsTesttaosj测试数据/articles?pageNo={page}' for page in range(1, 124)]
    def parse(self, response):
        link_extractor = LinkExtractor(allow=r'www\.taosj\测试数据/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 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

查看更多关于通过淘宝数据爬虫学习python scrapy requests与response对象的详细内容...

  阅读:42次