【问题标题】:Crawling error in Scrapy using LinkExtractor and Rule使用 LinkExtractor 和 Rule 在 Scrapy 中抓取错误
【发布时间】:2018-10-21 16:41:48
【问题描述】:

我在 Python3 的 Scrapy 1.5 中编写了一个简单的爬虫,我正在抓取其中的帖子及其内容。

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DailyStrengthSpider(CrawlSpider):
    name = 'daily_strength'
    allowed_domains = ['dailystrength.org']
    start_urls = ['https://www.dailystrength.org/search?query=avastin/']
    rules = (
        Rule(LinkExtractor(restrict_xpaths = '//*[@class="newsfeed__title-block"]/h2/a/@href'),follow = True),
        Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-',callback = 'parse_post'))
    )

在这里,我在上面的行中指定了允许的 URL。我收到一个错误提示

TypeError: init() 得到了一个意外的关键字参数“回调”

我已经在教程中验证了语法。

def parse_post(self,response):
    user = response.xpath('//*[@class="newsfeed__posted-by"]/a/text()').extract_first()
    time = response.xpath('//*[@class="newsfeed__item-time"]/text()').extract_first()
    full_post = response.xpath('//*[@class="posts__content"]/text()').extract_first()
    comment_users = response.xpath('//*[@class="comments__name"]/a/text()').extract()
    comments = response.xpath('//*[@class="comments__comment-text"]/text()').extract() 
    yield {"UserName":user,"Time":time,"Post":full_post}

【问题讨论】:

    标签: python regex parsing web-scraping scrapy


    【解决方案1】:

    您将callback 参数传递给LinkExtractor,而不是将其传递给Rule 对象。

    import scrapy
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy.linkextractors import LinkExtractor
    
    class DailyStrengthSpider(CrawlSpider):
        name = 'daily_strength'
        allowed_domains = ['dailystrength.org']
        start_urls = ['https://www.dailystrength.org/search?query=avastin/']
        rules = (
            Rule(LinkExtractor(restrict_xpaths = '//*[@class="newsfeed__title-block"]/h2/a/@href'),follow = True),
            Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-'), callback = 'parse_post')
        )
    

    【讨论】:

    • 我收到一个错误 AttributeError: 'str' object has no attribute 'iter' 并且在调试中还有一个 ERROR: Spider error processing窗口@VMRuiz
    • @Vignesh 我错过了callback 参数之前的逗号。看看能不能解决。
    • 我还是不明白LinkExtractor函数的使用方法,它没有抓取到start_urls中指定的网页,如何找到被抓取的网页 通过 LinkExtractor 函数@VMRuiz
    • @Vignesh,如果您在调试模式下打开日志(默认情况下),您将看到正在抓取的 URL。
    • INFO: 爬取了 0 个页面(0 页/分钟),抓取了 0 个项目(0 个项目/分钟) 它没有爬取除主页以外的页面.我不知道错误在哪里。也许它在 allowed_urls 中?
    【解决方案2】:

    您将callback 传递给LinkExtractor 构造函数(其中does not accept this parameter),尽管它打算传递给Rule 构造函数。

    只需更改构造函数调用:

    Rule(LinkExtractor(allow = r'/group/[a-zA-z]\-/discussion/[a-zA-z0-9]\_\-'), callback = 'parse_post')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2020-10-03
      相关资源
      最近更新 更多