【问题标题】:Scrapy stops scraping but continues to crawlScrapy 停止抓取但继续爬行
【发布时间】:2018-01-23 16:45:25
【问题描述】:

我正在尝试从网站的多个页面中抓取不同的信息。 直到第 16 页,一切正常:页面被抓取、抓取,并且信息存储在我的数据库中,但是在第 16 页之后,它停止抓取但继续抓取。 我检查了网站,有更多的 470 页信息。 HTML标签是一样的,所以我不明白为什么它停止了抓取。

Python:

def url_lister():
    url_list = []
    page_count = 1
    while page_count < 480:
        url = 'https://www.active.com/running?page=%s' %page_count 
        url_list.append(url)
        page_count += 1 
    return url_list

class ListeCourse_level1(scrapy.Spider):
    name = 'ListeCAP_ACTIVE' 
    allowed_domains = ['www.active.com'] 
    start_urls = url_lister()
    
    def parse(self, response):    
        selector = Selector(response)
        for uneCourse in response.xpath('//*[@id="lpf-tabs2-a"]/article/div/div/div/a[@itemprop="url"]'): 
            loader = ItemLoader(ActiveItem(), selector=uneCourse)
            loader.add_xpath('nom_evenement', './/div[2]/div/h5[@itemprop="name"]/text()')
        loader.default_input_processor = MapCompose(string) 
        loader.default_output_processor = Join()
        yield loader.load_item()
    pass

外壳:

>     2018-01-23 17:22:29 [scrapy.core.scraper] DEBUG: Scraped from <200     
>     https://www.active.com/running?page=15>
>     {
>      'nom_evenement': 'Enniscrone 10k run & 5k run/walk',
>      }
>     2018-01-23 17:22:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.active.com/running?page=16> (referer: None)
>     --------------------------------------------------
>                     SCRAPING DES ELEMENTS EVENTS
>     --------------------------------------------------
>     2018-01-23 17:22:34 [scrapy.extensions.logstats] INFO: Crawled 17 pages (at 17 pages/min), scraped 155 items (at 155 items/min)
>     2018-01-23 17:22:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.active.com/running?page=17> (referer: None)
> 
> --------------------------------------------------
>                 SCRAPING DES ELEMENTS EVENTS
> -------------------------------------------------- 2018-01-23 17:22:40 [scrapy.core.engine] DEBUG: Crawled (200) <GET
> https://www.active.com/running?page=18> (referer: None)
> --------------------------------------------------
>                 SCRAPING DES ELEMENTS EVENTS
> -------------------------------------------------- 2018-01-23 17:22:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET
> https://www.active.com/running?page=19> (referer: None)

【问题讨论】:

  • 我遇到了类似的问题。您是否等待 Scrapy 完成爬网?
  • 是的,我每次都等
  • 我有一个蜘蛛当前正在运行,它已经抓取了 15783 个页面,但只抓取了 625 个页面。它抓取了我在 start_urls 中提供的前几个 URL 的链接(在一个长列表中)值),但随后停止抓取。我找不到可以解释这种行为的文档。
  • 好像是同样的问题。

标签: python scrapy web-crawler


【解决方案1】:

这可能是由于您要查找的内容只有 17 页,而您指示 Scrapy 访问表单 https://www.active.com/running?page=NNN 的所有 480 页。更好的方法是检查您访问的每个页面是否有下一页,只有在这种情况下才会将Request 输出到下一页。

所以,我会将您的代码重构为(未测试):

class ListeCourse_level1(scrapy.Spider):
    name = 'ListeCAP_ACTIVE' 
    allowed_domains = ['www.active.com'] 
    base_url = 'https://www.active.com/running'
    start_urls = [base_url]

    def parse(self, response):    
        selector = Selector(response)
        for uneCourse in response.xpath('//*[@id="lpf-tabs2-a"]/article/div/div/div/a[@itemprop="url"]'): 
            loader = ItemLoader(ActiveItem(), selector=uneCourse)
            loader.add_xpath('nom_evenement', './/div[2]/div/h5[@itemprop="name"]/text()')
        loader.default_input_processor = MapCompose(string) 
        loader.default_output_processor = Join()
        yield loader.load_item()
        # check for next page link
        if response.xpath('//a[contains(@class, "next-page")]'):
            next_page = response.meta.get('page_number', 1) + 1
            next_page_url = '{}?page={}'.format(base_url, next_page)
            yield scrapy.Request(next_page_url, callback=self.parse, meta={'page_number': next_page})

【讨论】:

  • 非常感谢您的回答。我试过你的建议,不幸的是,它仍然不起作用。我试图废弃scrapy shell中的'tbody'标签,我意识到它返回一个空答案。我不明白为什么,因为代码中存在文本并且没有 AJAX 方法或类似的东西,这可能会导致脚本出错......待续!
  • JavaScript 也经常更改源代码。我经常遇到这种情况,尤其是tables - 在开发人员工具中我可以看到tbody 存在,但页面源中缺少它。无论如何,你真的需要寻找tbody 标签吗?我不记得所有细节,但它不在代码示例中。
  • 哦,对不起,这是因为我更改了网站以在另一个来源中对其进行测试。我打开一个新讨论来放置新代码,好吗?我将其称为“Scrapy tbody 标签返回一个空泛的答案,但里面有文本”!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多