2017-07-19 5 views
0

Ich möchte Proxy hinzufügen mit proxymiddleware Spinne, aber ich weiß nicht, warum es duplizierten AnfrageWarum macht diese Scrapy-Proxy-Middleware doppelte Anforderungen?

Hier gefiltert ist der Code:

class TaylorSpider(CrawlSpider): 
    name = 'Taylor' 
    allowed_domains = ['tandfonline.com'] 
    start_urls = ['http://www.tandfonline.com/action/cookieAbsent'] 

    def start_requests(self): 
     yield Request(self.start_urls[0], dont_filter=True, callback = self.parse_start_url) 

    def parse_start_url(self, response): 
     item = TaylorspiderItem() 
     item['PageUrl'] = response.url  

     yield item 

# middleware.py 

class ProxyMiddleware(object): 

    def process_request(self, request, spider): 
     logger.info('pr........................') 
     request.meta['proxy'] = 'http://58.16.86.239:8080' 
     return request   


# setting.py 

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, 
    'TaylorSpider.middlewares.ProxyMiddleware': 100, 
}  

wenn dont_filter=True, es in Endlosschleife stecken, die log ist

2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:56:21 [TaylorSpider.middlewares] INFO: pr........................ 

aber wenn dont_filter=False, das Protokoll

2017-07-19 13:54:25 [scrapy.core.engine] INFO: Spider opened 
2017-07-19 13:54:25 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-07-19 13:54:25 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 
2017-07-19 13:54:25 [TaylorSpider.middlewares] INFO: pr........................ 
2017-07-19 13:54:25 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET http://www.tandfonline.com/action/cookieAbsent> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates) 
2017-07-19 13:54:25 [scrapy.core.engine] INFO: Closing spider (finished) 
2017-07-19 13:54:25 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
{'dupefilter/filtered': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 7, 19, 5, 54, 25, 422000), 
'log_count/DEBUG': 2, 
'log_count/INFO': 8, 
'log_count/WARNING': 1, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'start_time': datetime.datetime(2017, 7, 19, 5, 54, 25, 414000)} 
2017-07-19 13:54:25 [scrapy.core.engine] INFO: Spider closed (finished) 
ist

Also wie kann ich es beheben?

Antwort

0

Downloader middlewares' process_request sollte None zurück, wenn sie nur den Wunsch Patch und den Rahmen möchten, um ihre Verarbeitung fortzusetzen:

process_request() sollte entweder: Keine Rückkehr, Rückkehr eine Antwort Objekt, geben einen Request-Objekt, oder Erhebe IgnoreRequest.

Wenn es keine gibt, wird Scrapy weiterhin diese Anfrage ist, alle anderen Middle ausgeführt wird, bis schließlich die entsprechende Downloader-Handler die Anforderung ausgeführt aufgerufen wird (und seine Antwort heruntergeladen).

(...)

Wenn es ein Request-Objekt zurückgibt, wird Scrapy process_request Methoden aufrufen stoppen und die zurück Anfrage neu planen. Sobald die Anforderung neu zurückgegeben wird, wird die entsprechende Middlewarekette für die heruntergeladene Antwort aufgerufen.

Sie möchten also die return request am Ende Ihrer process_request fallen lassen.