scrapy.Request 对象,爬取列表详情页面

Request对象参数说明

参数类型默认值描述
urlstr无默认值,必须指定请求的 URL
callbackcallable无默认值,必须指定用于处理响应的回调函数,通常是一个 Spider 方法,接受 response 对象作为参数
methodstrGET请求的方法,如 GETPOST
headersdictNone请求头,指定 HTTP 请求头部的信息,不包括cookie
bodystr 或 bytes'' (空字符串)请求的内容,通常在 POST 请求中使用
cookiesdict, list, CookieJar 或 NoneNone用于发送的 cookies,可以是字典、列表或 CookieJar 对象
metadictNone用于在不同的请求和响应之间传递数据。meta 是一个字典,可以存储任意数据,并且在请求之间共享
encodingstrutf-8编码方式,用于编码 body
priorityint0请求的优先级,数值越大,优先级越高。Scrapy 会优先处理高优先级的请求
dont_filterboolFalse如果设为 True,则该请求不会被过滤器过滤。通常用于强制重新抓取一个页面,即使该页面已被抓取过
errbackcallableNone处理请求失败时的回调函数。这个函数接受一个 Failure 对象作为参数
flagslistNone请求的标志,可以用来给请求打标签
cb_kwargsdictNone传递给回调函数 callback 的关键字参数,以字典形式指定
dont_redirectboolFalse如果设为 True,则禁止重定向
handle_httpstatus_listlistNone包含 HTTP 状态码的列表,指定对哪些 HTTP 响应状态码调用回调函数。默认只处理 2XX 成功的响应
handle_httpstatus_allboolFalse如果设为 True,则对所有的 HTTP 状态码都调用回调函数,而不仅仅是 2XX 成功的响应
formdatadictNone用于 POST 请求时指定表单数据,可以作为 body 的替代
dont_cacheboolFalse如果设为 True,则不缓存该请求的响应
download_timeoutintNone下载超时的设置,单位为秒
max_retry_timesintNone设定该请求的最大重试次数

爬取列表页面数据的同时爬取列表详情页面的数据

1. 先在parse方法中使用scrapy.Request向详情页发起请求

def parse(self, response):
    item = {}
    item['title'] = a.xpath('./@title').get()
    item['url'] = "https://tieba.baidu.com/" + a.xpath('./@href').get()

    # 请求详情页面
    yield scrapy.Request(
        # 详情页url
        item['url'],
        # 指定详情页的回调方法,用于解析详情页请求到的数据
        callback=self.parse_detail,
        # 向回调方法中传递meta参数
        meta={'item': item}
    )

2. 定义详情页解析方法,解析详情页数据

# 解析详情页面
def parse_detail(self, response):
    # 接受传递进来的meta参数,等把详情页面的数据解析完成后,和meta数据一起yield返回给管道
    print(response.meta['item'])

完整示例代码如下:

import scrapy


class TeiBaSpider(scrapy.Spider):
    name = "teiba2"
    allowed_domains = ["tieba.baidu.com"]
    start_urls = ["https://tieba.baidu.com/f?kw=沙井"]

    # 解析处理
    def parse(self, response):
        item = {}
        item['title'] = a.xpath('./@title').get()
        item['url'] = "https://tieba.baidu.com/" + a.xpath('./@href').get()

        # 请求详情页面
        yield scrapy.Request(
            # 详情页url
            item['url'],
            # 指定详情页的回调方法,用于解析详情页请求到的数据
            callback=self.parse_detail,
            # 向回调方法中传递meta参数
            meta={'item': item}
        )

    # 解析详情页面
    def parse_detail(self, response):
        # 解析数据
        div = response.xpath('//*[starts-with(@id, "post_content")]')
        # 详情文本数据
        content_text = div.xpath('./text()').get()
        # 详情图片数据
        content_img_url = div.xpath('.//img/@src').getall()

        # 接受传递进来的meta参数
        item = response.meta['item']
        item['content_text'] = content_text.strip()
        item['content_img_url'] = content_img_url
        yield item

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Scrapy可以使用Selenium或Splash来爬取动态加载页面。其中,Selenium是一个自动化测试工具,也可以模拟用户在浏览器中的操作,从而获取页面内容。而Splash是一个JavaScript渲染服务,可以模拟浏览器渲染页面,并且提供了API接口,方便与Scrapy集成。下面分别介绍使用Selenium和Splash来爬取动态加载页面的方法。 1. 使用Selenium 首先需要安装selenium库和对应的浏览器驱动,如ChromeDriver。然后在Scrapy的Spider中使用Selenium来获取页面内容,示例代码如下: ``` from scrapy import Spider from selenium import webdriver class MySpider(Spider): name = 'myspider' def start_requests(self): url = 'http://example.com' yield webdriver.Request(url, self.parse) def parse(self, response): driver = response.request.meta['driver'] # 使用driver来操作页面,获取需要的内容 ... ``` 在start_requests方法中,使用webdriver.Request来发送请求,并将回调函数设置为parse。在parse方法中,通过response.request.meta['driver']获取到了Selenium的WebDriver对象,然后就可以使用该对象来获取页面内容。 2. 使用Splash 首先需要安装Splash服务,并启动该服务。然后在Scrapy的Spider中使用Splash来获取页面内容,示例代码如下: ``` import scrapy from scrapy_splash import SplashRequest class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://example.com'] def start_requests(self): for url in self.start_urls: yield SplashRequest(url, self.parse, args={'wait': 0.5}) def parse(self, response): # 使用response来操作页面,获取需要的内容 ... ``` 在start_requests方法中,使用SplashRequest来发送请求,并将回调函数设置为parse。在args参数中,可以设置Splash的一些参数,如wait表示等待时间。在parse方法中,直接使用response来获取页面内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又逢乱世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值