如何在scrapy中跟踪请求

时间:2016-03-03 06:01:02

标签: python web-scraping scrapy

我正在抓一个页面列表,我有

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

1 个答案:

答案 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