Scrapy是Python中一款快速、高效的开源网络爬虫框架,支持多种数据解析与存储方式。在使用Scrapy时,经常需要将一些参数传递给spider,以满足不同的需求。本文将探讨Scrapy中向spider传递参数的两种常用方法。
第一种方法:使用start_requests方法传递
start_requests方法是Scrapy中spider的主要入口点,用于生成初始请求。因此,可以利用这个方法来传递参数。例如:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
def __init__(self, category=None, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = ['http://www.example.com/categories/%s' % category]
def parse(self, response):
# parse the response
在这个例子中,category参数被传递给spider,然后再拼接到start_urls中。这时,在运行spider时,就可以像下面这样传递参数:
scrapy crawl myspider -a category=somecategory
第二种方法:使用custom_settings方法传递
scrapy.Spider内置了一个custom_settings参数,可以在这里设置spider的各种配置项,包括DOWNLOAD_DELAY、CONCURRENT_REQUESTS、ROBOTSTXT_OBEY、COOKIES_ENABLED等等。具体的配置项可以参考Scrapy文档。当需要传递一些自定义参数时,可以将它们包含在custom_settings中。例如:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'DOWNLOAD_DELAY': 2.5,
'MY_SETTING': 'some value',
}
def start_requests(self):
# generate the initial requests
def parse(self, response):
# parse the response
在这个例子中,MY_SETTING被自定义设置,然后可以在spider中的其他地方使用。如果需要在命令行传递参数,则需要将这些参数添加到custom_settings中。例如:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'DOWNLOAD_DELAY': 2.5,
'MY_SETTING': 'some value',
}
def __init__(self, myarg=None, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.custom_settings['MY_SETTING'] = myarg
def start_requests(self):
# generate the initial requests
def parse(self, response):
# parse the response
这时,在命令行中运行spider时,可以加上-m参数以覆盖custom_settings中的值:
scrapy crawl myspider -a myarg=foobar -s MY_SETTING=baz
以上两种方法各有优劣,需要根据实际情况选择。但无论是哪种方法,都需要注意参数的安全性。如果从用户输入中获取了参数,则应该对其进行验证和清洗,以防止恶意输入和SQL注入等攻击。