Scrapy CrawlSpider - 仅在第一个网址完成后才开始抓取下一个网址

时间:2016-01-03 17:52:45

标签: python scrapy web-crawler

我有一只看起来像这样的蜘蛛

class SomeSpider(CrawlSpider):
    name = 'grablink'
    allowed_domains = ['www.yellowpages.com', 'sports.yahoo.com']
    start_urls = ['http://www.yellowpages.com/', 'http://sports.yahoo.com']
    rules = (Rule(LinkExtractor(allow=allowed_domains), callback='parse_obj', follow=False),)

    def parse_obj(self,response):
        for link in LinkExtractor(allow=(), deny=self.allowed_domains).extract_links(response):
            item = CrawlsItem()
            item['DomainName'] = get_domain(response.url)
            item['LinkToOtherDomain'] = link.url
            item['LinkFoundOn'] = response.url
            yield item

它从给定的起始URL中提取内部链接,然后跟随它们并从链接的页面中提取所有外部链接。它工作正常,但现在结果不是任何特定顺序,这意味着某些行将来自yellopages.com,而其他行将来自sports.yahoo.com。我知道这是正常的Scrapy行为,因为它是异步的,但无论如何我可以做到这一点,以便首先从yellowpages.com和sports.yahoo.com等提取所有链接。在特定URL内部,爬网可以是异步的,无关紧要。但是应该按顺序抓取URL本身。

我认为实现此目的的一种方法是将所有起始网址保存在单独的列表中,并在start_urls中只放置一个网址,然后在该网址抓取完成后运行抓取工具,我将开始抓取另一个网址。但我不知道我会在哪里这样做。如何知道是否已完成对一个URL的爬网,以便我可以开始下一个?

1 个答案:

答案 0 :(得分:2)

您有几种选择:

  • 编写特定于站点的蜘蛛,例如黄页,一个用于Yahoo!
  • 编写通用蜘蛛并在运行蜘蛛时获取参数以确定要爬网的站点。
  • 如果您想手动完成,只需手动更改网址并运行即可。

我假设你有一个Scrapy项目设置。您可以使用命令行运行蜘蛛:

scrapy crawl myspider

当蜘蛛完成时,您可以在控制台上看到它。如果您想要CSV导出,可以执行以下操作:

scrapy crawl myspider -o filename.csv -t csv

如果你想传递参数,你可以这样做:

class MySpider(BaseSpider):
    name = 'myspider'

    def __init__(self, url='',):
        self.start_urls = [url]
        # ...

然后再做:

scrapy crawl myspider -a url=http://myexample.com