我正在写一个拼凑的蜘蛛,我想用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,如果我拥有大量的Additional_data,地图是否会占用很多内存?
答案 0 :(得分:2)
如果要传递其他参数来解析函数,则可以通过重写默认的启动请求方法来实现。如果要使用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
Response对象还用于获取解析中的url,其中也包含原始的request对象。因此,您可以通过response.request.url
def parse(self, response):
additional_argument = self.dict_map[response.request.url]
请注意,我正在将start_url重命名为start_urls