2017-04-14 69 views
-3

我正在尝试使用下面的ScrapyRequest方法,但它不会调用callbackself.link_to_problem。 URL的所有印刷正确的,当我打电话print path,我也尝试打开这些网址在我的浏览器和格式正确无误。有人可以确定代码中是否有问题?Python Scrapy请求方法不起作用

from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.http.request import Request 
import scrapy 

def parse_item(self, response): 
    for link in response.xpath("//div[@id='siteTable']//div[@class='entry unvoted']/p[@class='title']/a/@href").extract(): 
     path = "https://www.reddit.com" + str(link) 
     print path 
     yield Request(path, callback=self.link_to_problem, errback = self.error_print) 

def link_to_problem(self, response): 
     print response 
     print "------------------------------------------------------------------------------------------" 
+0

是'link_to_problem'叫?你检查过吗?提问时也要小心谨慎。 – Mani

+0

没有'link_to_problem'没有被调用,我为什么认为可能是我如何调用Request方法有问题。 –

+0

我看不出有什么问题的代码,请仔细查看项目设置和代码。或者尝试删除errback。 – Mani

回答

1

即使发布的代码是正确的(乍一看似乎对我来说),您的刮板很可能无法正常工作。

原因/问题:有没有User-Agent头集,看起来像一个真正的浏览器的所有客户端的reddit.com块的请求。

Scrapy默认发送'scrapybot'作为用户代理,并将因此被阻止。

解决方案:在您的请求中设置User-Agent标头,就像真正的浏览器所做的那样。

这可以通过添加以下行到你scrapy项目的settings.py文件来完成。

USER_AGENT = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'