Scrapy爬行但不刮痧

时间:2016-10-18 18:13:38

标签: scrapy

我使用scrapy runspider命令在相同的域中使用相同的结构抓取一组~10,000个链接。在一些页面之间随机出现(一个重要的~40%到50%的页面)被抓取但未被抓取,因为在我的解析方法中,我评估页面中的特定元素,基于此我刮擦页面的其他元素。但是由于它有一些原因(后面更多关于这个原因),对于某些元素评估不正确的URL。为了解决这个问题,我想重复调用这些urls的解析方法最多5次,直到它正确评估(希望在5次运行中页面将正确响应条件或者我认为该元素是真正的评估错了)。如何编码(下面的部分代码)?

上述行为的可能原因:我的网络链接属于此类型 www.example.com/search_term/在www.example.com中输入“search_term”后实际上是动态生成的页面。所以我的猜测是,在几个案例中,Scrapy甚至在完全生成页面www.example.com/search_term/之前就获得了响应。也许理想的解决方案是使用webdriver和所有这些,但在这个阶段,所有这些对我来说都太复杂了。只要我刮了95%,我很高兴。

下面的相关代码(为了便于阅读而进行了清理,但没有遗漏任何细节):

class mySpider(scrapy.Spider):
  name = "spidername"

def start_requests(self):
    urls = [url1, ... url10000]

    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse,headers={
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3"})

def parse(self, response):
   if (value of particular_item in page == 10): 
     yield {'someitem':       
           response.xpath('/html/body/div').extract())}
   else:
     <<Once again call this parse fuction with the same url upto a       maximum of 5 times - Need help in writing the code here>>

1 个答案:

答案 0 :(得分:0)

您的XPath要求您正在解析的HTML的body具有div作为第一个元素:

<html>
    <body>
        <div>...

您确定每个网站都是这样吗?如果没有关于 的任何信息,你试图刮去我不能给你更多的建议。

或者,您可以尝试另一种解决方案,从网站中提取所有div

for div in response.xpath('//div').extract():
    yield {'div': div}