Request对象参数说明
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
url | str | 无默认值,必须指定 | 请求的 URL |
callback | callable | 无默认值,必须指定 | 用于处理响应的回调函数,通常是一个 Spider 方法,接受 response 对象作为参数 |
method | str | GET | 请求的方法,如 GET 或 POST |
headers | dict | None | 请求头,指定 HTTP 请求头部的信息,不包括cookie |
body | str 或 bytes | '' (空字符串) | 请求的内容,通常在 POST 请求中使用 |
cookies | dict, list, CookieJar 或 None | None | 用于发送的 cookies,可以是字典、列表或 CookieJar 对象 |
meta | dict | None | 用于在不同的请求和响应之间传递数据。meta 是一个字典,可以存储任意数据,并且在请求之间共享 |
encoding | str | utf-8 | 编码方式,用于编码 body |
priority | int | 0 | 请求的优先级,数值越大,优先级越高。Scrapy 会优先处理高优先级的请求 |
dont_filter | bool | False | 如果设为 True ,则该请求不会被过滤器过滤。通常用于强制重新抓取一个页面,即使该页面已被抓取过 |
errback | callable | None | 处理请求失败时的回调函数。这个函数接受一个 Failure 对象作为参数 |
flags | list | None | 请求的标志,可以用来给请求打标签 |
cb_kwargs | dict | None | 传递给回调函数 callback 的关键字参数,以字典形式指定 |
dont_redirect | bool | False | 如果设为 True ,则禁止重定向 |
handle_httpstatus_list | list | None | 包含 HTTP 状态码的列表,指定对哪些 HTTP 响应状态码调用回调函数。默认只处理 2XX 成功的响应 |
handle_httpstatus_all | bool | False | 如果设为 True ,则对所有的 HTTP 状态码都调用回调函数,而不仅仅是 2XX 成功的响应 |
formdata | dict | None | 用于 POST 请求时指定表单数据,可以作为 body 的替代 |
dont_cache | bool | False | 如果设为 True ,则不缓存该请求的响应 |
download_timeout | int | None | 下载超时的设置,单位为秒 |
max_retry_times | int | None | 设定该请求的最大重试次数 |
爬取列表页面数据的同时爬取列表详情页面的数据
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