我正在抓一个页面列表,我有
start_urls = ['page_1_id', 'page_2_id', 'page_1_2', 'page_3_id']
现在,当我进行抓取时,如果页面存在,那么当我尝试时,它会更改网址:
response.url
或
response.request
我没有得到
'page_1_id', 'page_2_id', 'page_1_2', 'page_3_id'
因为scrapy使异步请求我需要'id'来匹配数据,所以我需要传递'id;作为每个请求中的参数,我想在列表中
start_urls = ['page_1_id', 'page_2_id', 'page_1_2', 'page_3_id']
id = ['id_1','id_2','id_3']
但是必须要问题,首先我不知道如何传递这些论点,其次它不会起作用,因为我没有按照要求发出命令。所以我可能需要使用字典,有一种方法可以做这样的事情:
start_urls = {'page_1_id':id_1, 'page_2_id':id_2, 'page_1_3':id_3, 'page_4_id':id_4}
我的蜘蛛非常简单,我只需要获取一个链接并返回ID:
def parse(self, response):
myItem = Item()
myItem = Item(link=response.xpath('//*[@id="container"]/div/table/tbody/tr[1]/td/h4[1]/a/@href').extract())
return myItem
只需添加'id'
即可def解析(自我,回应):
myItem = Item()
myItem = Item(link=response.xpath('//*[@id="container"]/div/table/tbody/tr[1]/td/h4[1]/a/@href').extract(),id)
return myItem
答案 0 :(得分:1)
您可以通过覆盖start_requests()
方法来覆盖scrapy开始产生请求的方式。您似乎希望这样做,然后将ID放在request.meta
属性中以将其转移到parse
回调。类似的东西:
start_urls = ['page_1_id', 'page_2_id', 'page_1_2', 'page_3_id']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url,
meta={'page_id': url.split('_',1)[-1] # 1_id})
def parse(self, response):
print(response.meta['page_id'])
# 1_id