我有一只看起来像这样的蜘蛛
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的爬网,以便我可以开始下一个?
答案 0 :(得分:2)
您有几种选择:
我假设你有一个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