从scrapy函数中向API发出请求

时间:2016-09-10 20:48:29

标签: proxy scrapy

我正在使用scrapy。我想基于每个请求轮换代理并从我拥有的api获取代理返回单个代理。我的计划是向api发出请求,获取代理,然后根据以下内容使用它来设置代理:

http://stackoverflow.com/questions/4710483/scrapy-and-proxies 

我将使用以下方式分配它:

request.meta['proxy'] = 'your.proxy.address'; 

我有以下内容:

class ContactSpider(Spider):
    name = "contact"

def parse(self, response):

    for i in range(1,3,1):
        PR= Request('htp//myproxyapi.com',  headers= self.headers)
        newrequest= Request('htp//sitetoscrape.com',  headers= self.headers)
        newrequest.meta['proxy'] = PR 

但我不确定如何使用Scrapy Request对象来执行api调用。我没有在调试时收到PR请求的响应。我是否需要在单独的函数中执行此操作并使用yield语句或我的方法是错误的?

1 个答案:

答案 0 :(得分:1)

  

我是否需要在单独的函数中执行此操作并使用yield语句或我的方法是错误的?

是。 Scrapy使用回调模型。你需要:

  1. PR个对象返回给scrapy引擎。
  2. 解析PR的响应,并在其回调中生成newrequest
  3. 一个简单的例子:

    def parse(self, response):
        for i in range(1,3,1):
            PR = Request(
                'http://myproxyapi.com', 
                headers=self.headers,
                meta={'newrequest': Request('htp//sitetoscrape.com',  headers=self.headers),},
                callback=self.parse_PR
            )
            yield PR
    
    def parse_PR(self, response):
        newrequest = response.meta['newrequest']
        proxy_data = get_data_from_response(PR)
        newrequest.meta['proxy'] = proxy_data
        yield newrequest
    

    另请参阅:http://doc.scrapy.org/en/latest/topics/request-response.html#topics-request-response-ref-request-callback-arguments