Scrapy SgmlLinkExtractor 问题

9 投票
4 回答
8614 浏览
提问于 2025-04-15 16:27

我正在尝试让 SgmlLinkExtractor 工作。

这是它的定义:

SgmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths(), tags=('a', 'area'), attrs=('href'), canonicalize=True, unique=True, process_value=None)

我只是使用了 allow=()

所以,我输入了

rules = (Rule(SgmlLinkExtractor(allow=("/aadler/", )), callback='parse'),)

初始网址是 'http://www.whitecase.com/jacevedo/',我输入了 allow=('/aadler',),我希望 '/aadler/' 也能被扫描到。但是,结果是爬虫只扫描了初始网址,然后就结束了:

[wcase] INFO: Domain opened
[wcase] DEBUG: Crawled </jacevedo/> (referer: <None>)
[wcase] INFO: Passed NuItem(school=[u'JD, ', u'Columbia Law School, Harlan Fiske Stone Scholar, Parker School Recognition of Achievement in International and Foreign Law, ', u'2005'])
[wcase] INFO: Closing domain (finished)

我这里做错了什么呢?

有没有人用过 Scrapy 并且成功的,可以帮我完成这个爬虫吗?

谢谢你的帮助。

我在下面附上了爬虫的代码:

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 Nu.items import NuItem
from urls import u

class NuSpider(CrawlSpider):
    domain_name = "wcase"
    start_urls = ['xxxxxx/jacevedo/']

    rules = (Rule(SgmlLinkExtractor(allow=("/aadler/", )), callback='parse'),)

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

        item = NuItem()
        item['school'] = hxs.select('//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)')
        return item

SPIDER = NuSpider()

注意:SO 不允许我发布超过一个网址,所以请根据需要替换初始网址。抱歉。

4 个回答

1

allow=(r'/aadler/', ...

这段代码的意思是设置一个允许的路径,'/aadler/'。在这里,'allow' 是一个变量,用来存储这个路径。前面的 'r' 表示这是一个原始字符串,意思是字符串中的特殊字符不会被处理,比如反斜杠。后面的 '...' 表示这里可能还有其他的内容,但没有具体显示出来。

3

如果你查看文档,会看到有一个警告写得很清楚:

"在编写爬虫规则时,尽量不要把parse作为回调函数,因为爬虫本身会用到parse方法来实现它的逻辑。如果你覆盖了parse方法,爬虫就无法正常工作了。"

可以点击这里确认

10

看起来你在重写“parse”这个方法。“parse”是CrawlSpider里面的一个私有方法,用来跟踪链接的。

撰写回答