2017-03-01 99 views
0

通常情况下,您提供硬编码的start_urls,但如果我想一次提及某个列表网址,该怎么办?Scrapy:如何从设置文件设置scrapy start_urls?

我知道我可以做一个典型的文本文件打开操作,但不知道是否有一些Scrapy的方式来执行任务?

start_urls将被保存在文件

回答

1

假设你把你的配置文件放在蜘蛛目录和配置目录中。所以整体路径scrapy_project -> spiders -> configs-> <spider_name>.txt

然后你可以覆盖你的蜘蛛的init来填充你的start_urls这样的东西。

def __init__(self, *args, **kwargs): 
    script_dir = os.path.dirname(__file__) 
    abs_file_path = os.path.join(script_dir, "configs/%s.txt" % self.name) 
    with open(abs_file_path) as f: 
     self.start_urls = [line.strip() for line in f.readlines()] 
+0

您应该使用'pkg_resources.resource_string('package','subdirectory')';例如'self.start_urls = pkg_resources.resource_string('mycrawler','data/urls.txt')。splitlines()'。 – Granitosaurus

0

可以做到这一点,但你必须修改你的蜘蛛__init__()

from scrapy import Spider 
class MySpider(Spider): 
    name = 'start_urls' 
    start_urls = ['http://google.com'] 

    def __init__(self, **kwargs): 
     super(MySpider, self).__init__(**kwargs) 
     if isinstance(self.start_urls, str): 
      self.start_urls = self.start_urls.split(',') 

    def parse(self, response): 
     print(response.url) 

现在你可以通过传递逗号分隔的列表修改start_urls -a参数:

scrapy crawl start_urls -a "start_urls=http://stackoverflow.com,http://httpbin.org" 

不幸的是AFAIK哟你只能通过-a参数传递参数作为字符串,所以你需要自己处理解释(在这种情况下,将字符串转换为列表,因为start_requests()遍历start_urls的值,如果它是一个字符串,它将遍历每个字符和中断)。

+0

我澄清了这个问题。这些网址将以文本文件格式显示。 – Volatil3