Scrapy不会抓取起始URL中包含的数据

时间:2014-10-29 21:42:41

标签: python scrapy web-crawler

我正在尝试使用scrapy抓取整个网站。根据令人头疼的文件

  

start_urls - 蜘蛛开始抓取的网址列表,   没有指定特定的URL时。所以,下载的第一页   将是这里列出的那些。将生成后续URL   先后从起始网址中包含的数据开始。

因此,根据这个定义,scrapy应该通过start_urls下提到的页面上的所有子网址,但它只会抓取我指定的网址。我确实指定了Scrapy - Crawl whole website下提到的规则,但它没有帮助。它只会抓取并输出我在start_urls中指定的页面。

以下是我的代码片段:

class AcdivocaFirstSpider(scrapy.Spider):
    name = "example_sample"
    allowed_domains = ["example.org"]
    start_urls = ["http://www.example.org/site/id/home"]
    rules = rules = [Rule(SgmlLinkExtractor(), callback='parse_item', follow=True)]

    def parse(self, response):
        filename = response.url.split("/")[-1] #so eg it would name 'home'
        open(filename, 'wb').write(response.body)

这会产生一个单独的文件,其中包含用于“家庭”的提取的HTML数据。页。如何让它从主页开始递归抓取整个网站?

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:2)

要改变的两件事:

  • 要使用规则,请将AcdivocaFirstSpider设为scrapy.contrib.spiders.CrawlSpider的子类,而不是scrapy.Spider
  

后续网址将根据起始网址中包含的数据连续生成。

这句话具有误导性。 scrapy.Spider本身并没有对这些起始网址做任何特殊处理:它会下载并将响应的正文传递给parse()。如果实施parse()回调以产生进一步的请求,则是,后续网址将来自这些网址的数据,但这不是自动/自动化的。

  • 使用scrapy.contrib.spiders.CrawlSpider时,您需要覆盖内置的parse()方法,即检查规则和生成页面请求的方法。因此,您需要将parse重命名为parse_item(在规则中引用)

请参阅the warning in the docs on crawling rules.