我正在尝试使用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数据。页。如何让它从主页开始递归抓取整个网站?
感谢任何帮助。谢谢。
答案 0 :(得分:2)
要改变的两件事:
AcdivocaFirstSpider
设为scrapy.contrib.spiders.CrawlSpider
的子类,而不是scrapy.Spider
后续网址将根据起始网址中包含的数据连续生成。
这句话具有误导性。 scrapy.Spider
本身并没有对这些起始网址做任何特殊处理:它会下载并将响应的正文传递给parse()
。如果实施parse()
回调以产生进一步的请求,则是,后续网址将来自这些网址的数据,但这不是自动/自动化的。
scrapy.contrib.spiders.CrawlSpider
时,您需要不覆盖内置的parse()
方法,即检查规则和生成页面请求的方法。因此,您需要将parse
重命名为parse_item
(在规则中引用)