python - python scrapy spider:在 parse() 方法中为每个 start_url 传递附加信息
问题描述
我正在编写一个爬虫蜘蛛,我想在其中parse()
为每个start_url
.
我已经从列表中创建了一个映射,start_urls
并且additional_data
我在方法中使用了该映射。
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['alldomain.com']
start_urls = ['http://a.com/', 'http://b.com/', 'http://c.com/']
additional_data = [x,y,z]
dict_map = dict(zip(start_urls, additional_data))
def parse(self, response):
url_first_additional_data = dict_map[response.url]
# do other processing
有没有其他更好的方法来做同样的事情,我不确定 response.url 是否也会有请求 url,如果我有大量的附加数据,地图会占用大量内存吗?
解决方案
如果您想将其他参数传递给解析函数,您可以通过覆盖默认的启动请求方法来实现。start_urls
如果您想使用方法,您应该将您的 init 方法重命名为其他名称start_requests
,因为我将其重命名为 starting_urls
def start_requests(self):
for url in self.starting_urls:
yield Request(
url,
cb_kwargs={'additional_argument': dict_map[url]}
)
def parse(self, response, additional_argument):
# Here you can use that additional_argument
pass
同样为了在解析中获取 url,Response 对象中也有原始请求对象。所以你可以通过response.request.url
def parse(self, response):
additional_argument = self.dict_map[response.request.url]
请注意,我将starting_url 重命名为start_urls
推荐阅读
- java - 在 Akka Clustering 的情况下如何存储传入的请求?
- automation - DFA的状态图
- laravel-5 - 模拟 Laravel 自定义验证规则类不起作用
- java - Java字符串中是否有格式说明符,例如python中的“%r”?
- google-calendar-api - Google_Service_Calendar_FreeBusyResponse 对象
- vue.js - 为什么 workbox 和 vue 不提供缓存中的文件?
- javascript - 如何将 HTML 日期时间选择器 datetime-local 转换为时刻格式
- logging - 对于 CDAP Logging HTTP RESTful API,如何传递过滤器参数
- c# - 使用 Dapper 在 C# 中返回多个输出并返回图像值
- python - 选择国家和地区的API