【问题标题】:Scrapy SgmlLinkExtractor is ignoring allowed linksScrapy SgmlLinkExtractor 忽略允许的链接
【发布时间】:2009-11-28 00:34:23
【问题描述】:

请查看 Scrapy 文档中的 this spider example。解释是:

这个蜘蛛会开始爬取 example.com 的主页,收集类别链接和项目链接,并使用 parse_item 方法解析后者。对于每个项目响应,将使用 XPath 从 HTML 中提取一些数据,并用它填充一个项目。

我完全复制了同一个蜘蛛,并将“example.com”替换为另一个初始网址。

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from stb.items import StbItem

class StbSpider(CrawlSpider):
    domain_name = "stb"
    start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm']

    rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm', )), callback='parse', follow=True), )

    def parse(self, response):
        hxs = HtmlXPathSelector(response)

        item = StbItem()
        item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.')
        return item

SPIDER = StbSpider()

但是我的蜘蛛“stb”没有像它应该做的那样从“/bios/”收集链接。它运行初始 url,抓取 item['JD'] 并将其写入文件,然后退出。

为什么SgmlLinkExtractor 会被忽略?读取Rule 是因为它在Rule 行内捕获语法错误。

这是一个错误吗?我的代码有问题吗?除了我在每次运行时看到的一堆未处理的错误外,没有任何错误。

很高兴知道我在这里做错了什么。感谢您提供任何线索。我是不是误解了SgmlLinkExtractor 应该做什么?

【问题讨论】:

  • 当我看到“除了每次运行都会看到一堆未处理的错误之外没有任何错误”时,我不得不挠头。
  • 抱歉,我看到了弃用警告。我看到的错误是由于 Pablo Hoffman 在stackoverflow.com/questions/1767553/… 提到的同时打开了 telnet 和 shell,当我关闭 shell 时,我再也看不到它们了。任何线索为什么允许的链接没有被抓取?

标签: python web-crawler scrapy


【解决方案1】:

parse 函数实际上是在 CrawlSpider 类中实现和使用的,而您无意中覆盖了它。如果您将名称更改为其他名称,例如 parse_item,则该规则应该有效。

【讨论】:

  • 谢谢。我写了一个非常简单的 python 蜘蛛,它对我有用。
  • 有趣的是,我也有同样的问题。但是,当我将其更改为其他内容时,“解析”会出现“未实现错误”。
  • 你是从 CrawlSpider 继承的吗?如果没有,那么您确实需要一个名为“parse”的方法。
猜你喜欢
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-01-22
  • 1970-01-01
  • 2014-02-18
  • 2019-11-27
  • 2015-02-24
相关资源
最近更新 更多