2015-10-14 123 views
0

简介 你好,我使用Scrapy为了在雅虎答案采取数据。 我的成就是将所有问题和答案都放在一个精确的部分。在Scrapy中使用递归蜘蛛[Python]

我尝试 使用scrapy和硒首先我尝试采取在部分任何问题的列表,这个列表是记忆中的蜘蛛类。 我使用For循环来解析每一页。

for url in self.start_urls_mod: 
     yield scrapy.Request(url, callback=self.parse_page) 
     i = i + 1 

该方法parse_page的结构为废弃问题页面,最佳答案和所有其他答案。 这工作正常。

问题当我尝试在页面右侧的下一个链接中出现的“下一步”链接中使用href继续“下一步”问题时出现。 我再次调用相同的函数parse_page,从该链接传递URL。 有时这项工作,但其他时间没有。 我现在不调用parse_page函数两次是正确的,没有在其他地方使用任何基本情况来停止递归它的停止。

该程序工作没有任何错误,并停止,但我没有找到任何问题在“下一节”部分。只有一个人。

有我的代码片段。

def parse_page(self, response): 
    #Scraping with xpath things that interests me 
    #Go to the next similar question 
    next_page = hxs.xpath('((//a[contains(@class,"Clr-b")])[3])/@href').extract() 
    composed_string = "https://answers.yahoo.com" + next_page[0] 
    print("NEXT -> "+str(composed_string)) 
    yield scrapy.Request(urljoin(response.url, composed_string), callback=self.parse_page) 

ps。我会用一个叫做蜘蛛的蜘蛛,但是我不能定义任何规则来采取这种类型的问题。所以请如何改善我的功能。

相关信息: 所有的XPath选择下URL的https://answers.yahoo.com/question/index?qid=20151008101821AAuHgCk

回答

1

首先是错误的。您将始终获得第三个带有“Clr-b”的URL,这可能是错误的(它不存在或不是下一个站点)。

对于这样的查询,我会使用文本搜索。你的情况是这样的:

next_page = response.xpath('//a[contains(@class,"Clr-b") and text()=" Next "]/@href').extract() 

然后您撰写您的网址,你做的,你不必使用urljoin。这不是必须的,因为您已经拥有了正确的网址,您需要按照yield这样的网址。这可能是您的蜘蛛停止的原因:您生成了一个没有找到的urljoin的URL - 这不是您打印到控制台的URL。

使用与回调相同的函数没有问题。

+0

谢谢你,所以这将是正确的收益? yield scrapy.Request(composed_string,callback = self.parse_page) – RedVelvet

+1

不客气。是的,那将是正确的收益率。 – GHajba

+0

非常感谢,我尝试了一下这个建议!我让你知道! – RedVelvet