我很难让我的蜘蛛跟踪链接。我已经看过Scrapy教程很多次了,也搜索了很多,但我仍然很困惑。
由于某些原因,即使有数百个结果分布在大约15-20页上,我的爬虫总是返回5-7个结果,并说它已经完成了。
我在调用parse_dir_contents方法之前和开始运行时都放置了一些打印语句。由于某种原因,它被调用了40次(分成两组,每组20次),并且只运行了5-7次。我每页大约有20个结果,如果我打印出它每次导航到的URL,它永远不会超过第一页。
我确信在这段代码中有很多我可以做得更好的事情。任何帮助都将不胜感激。我真的一直在努力工作,让这件事成为现实。
这里有相当多的“助手”代码,这真的把事情搞得一团糟。我很抱歉,但我想给你我用来获得最佳解决方案的确切代码。
在每个页面上都有许多"vip“列表,每个页面都有重复的内容。所以我只想把它们刮掉一次,而不是把它们纳入numPages计算中。
发布于 2016-04-10 21:02:56
这真的很难指出问题,因为我不能用您提供的代码重现错误。我不知道你的代码到底出了什么问题,但我可以给你一些改进代码的建议:
for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'):
link = str(regularListingContainer.re('href="(.*)" class="title">'))
你可以多次调用xpath或者css选择器,当抓取的时候,使用scrapy库会更快你可以使用body.xpath().xpath().css()
来获取字符串你只需要extract()
它就可以了
for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'):
link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
在大多数情况下,处理链接时最好使用urljoin()
,让scrapy来处理繁重的工作,并处理相对路径或绝对路径
link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
yield Request(urljoin(link), callback=self.parse_dir_contents)
Scrapy使用多线程,这意味着每当你产生任何东西时,它都会打开一个线程,并使它彼此异步运行。这意味着您无法控制先执行哪些代码的流程。我最好的选择是,你的全局变量不会改变你的想法。
要解决这个问题,您可以使用meta[]
标记在线程之间交换信息,例如
link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first()
request=Request(urljoin(link), callback=self.anotherFunc)
request['string']="I'm going on a journy"
yield request
def anotherFunc(self, response)
foo=response['string']
print foo
这将输出
I'm going on a journy
希望我能帮上忙,欢迎进一步询问。
https://stackoverflow.com/questions/36528100
复制相似问题