2016-09-19 4 views
1

나는 치료와 함께 일하고 있습니다. 요청 당 기준으로 프록시를 회전하고 단일 프록시를 반환하는 API에서 프록시를 가져 오려고합니다. 나는 다음과 같은 한동적으로 치료 요청 콜백을 설정합니다.

http://stackoverflow.com/questions/39430454/making-request-to-api-from-within-scrapy-function 

: 내 계획은, 프록시를 얻을 API에 요청을 기반으로 프록시를 설정하는 데 사용하는 것입니다

class ContactSpider(Spider): 
    name = "contact" 

def parse(self, response): 

.... 
     PR = Request(
     'my_api' 
     headers=self.headers, 
     meta={'newrequest': Request(url_to_scrape, headers=self.headers),}, 
     callback=self.parse_PR 
    ) 
    yield PR 


def parse_PR(self, response): 
    newrequest = response.meta['newrequest'] 
    proxy_data = response.body 
    newrequest.meta['proxy'] = 'http://'+proxy_data 
    newrequest.replace(url = 'http://ipinfo.io/ip') #TESTING 
    newrequest.replace(callback= self.form_output) #TESTING 

    yield newrequest 

def form_output(self, response): 
    open_in_browser(response) 

하지만 난 받고 있어요 :

Traceback (most recent call last): 
    File "C:\twisted\internet\defer.py", line 1126, in _inlineCallbacks 
    result = result.throwExceptionIntoGenerator(g) 
    File "C:\twisted\python\failure.py", line 389, in throwExceptionIntoGenerator 
    return g.throw(self.type, self.value, self.tb) 
    File "C:\scrapy\core\downloader\middleware.py", line 43, in process_request 
    defer.returnValue((yield download_func(request=request,spider=spider))) 
    File "C:\scrapy\utils\defer.py", line 45, in mustbe_deferred 
    result = f(*args, **kw) 
    File "C:\scrapy\core\downloader\handlers\__init__.py", line 65, in download_request 
    return handler.download_request(request, spider) 
    File "C:\scrapy\core\downloader\handlers\http11.py", line 60, in download_request 
    return agent.download_request(request) 
    File "C:\scrapy\core\downloader\handlers\http11.py", line 255, in download_request 
    agent = self._get_agent(request, timeout) 
    File "C:\scrapy\core\downloader\handlers\http11.py", line 235, in _get_agent 
    _, _, proxyHost, proxyPort, proxyParams = _parse(proxy) 
    File "C:\scrapy\core\downloader\webclient.py", line 37, in _parse 
    return _parsed_url_args(parsed) 
    File "C:\scrapy\core\downloader\webclient.py", line 20, in _parsed_url_args 
    host = b(parsed.hostname) 
    File "C:\scrapy\core\downloader\webclient.py", line 17, in <lambda> 
    b = lambda s: to_bytes(s, encoding='ascii') 
    File "C:\scrapy\utils\python.py", line 117, in to_bytes 
    'object, got %s' % type(text).__name__) 
TypeError: to_bytes must receive a unicode, str or bytes object, got NoneType 

무엇이 잘못 되었나요?

+0

당신이 스택 트레이스의 이상을 붙여 넣을 수 있습니다 당신이 뭔가를해야

? – iScrE4m

+0

위에 추가했습니다. – user61629

답변

1

stacktrace 정보에 따르면 urlNone 인 요청 개체가 Scrapy에 발생했습니다.이 개체는 문자열 형식이어야합니다. 코드에서

이 두 줄 예상대로

newrequest.replace(url = 'http://ipinfo.io/ip') #TESTING 
newrequest.replace(callback= self.form_output) #TESTING 

Request.replace는 새로운 인스턴스 대신 현재 위치에서 원래 요청을 수정을 반환 방법 때문에, 작동하지 않을 것입니다. 단순히

newrequest = newrequest.replace(url = 'http://ipinfo.io/ip') #TESTING 
newrequest = newrequest.replace(callback= self.form_output) #TESTING 

나 :

newrequest = newrequest.replace(
    url='http://ipinfo.io/ip', 
    callback=self.form_output 
) 
관련 문제