Scrapy:如何从设置文件中设置 scrapy start_urls?
Scrapy: How to set scrapy start_urls from a setting file?
通常您会提供硬编码 start_urls
但如果我想一次提及某个列表 url 怎么办?
我知道我可以进行典型的文本文件打开操作,但想知道是否有一些 Scrapy 方式 来执行任务?
start_urls
将保存在文件
你可以做,但是你必须修改你的蜘蛛__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)
现在您可以通过 -a
参数传递逗号分隔列表来修改 start_urls:
scrapy crawl start_urls -a "start_urls=http://whosebug.com,http://httpbin.org"
不幸的是,AFAIK 你只能通过 -a
参数将参数作为字符串传递,所以你需要自己处理解释(在这种情况下,将字符串转换为列表,因为 start_requests() 遍历 start_urls 值,如果它是一个字符串,它将遍历每个字符并中断)。
假设您将配置文件放在蜘蛛目录和配置目录中。所以总体路径 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()]
通常您会提供硬编码 start_urls
但如果我想一次提及某个列表 url 怎么办?
我知道我可以进行典型的文本文件打开操作,但想知道是否有一些 Scrapy 方式 来执行任务?
start_urls
将保存在文件
你可以做,但是你必须修改你的蜘蛛__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)
现在您可以通过 -a
参数传递逗号分隔列表来修改 start_urls:
scrapy crawl start_urls -a "start_urls=http://whosebug.com,http://httpbin.org"
不幸的是,AFAIK 你只能通过 -a
参数将参数作为字符串传递,所以你需要自己处理解释(在这种情况下,将字符串转换为列表,因为 start_requests() 遍历 start_urls 值,如果它是一个字符串,它将遍历每个字符并中断)。
假设您将配置文件放在蜘蛛目录和配置目录中。所以总体路径 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()]