如何为scrapy提供用于爬行的URL?
我想用scrapy来抓取网页。有没有办法从终端本身传递起始URL 中给出了爬行器的名称或URL,但当我给出URL时,它会抛出一个错误: //我的蜘蛛的名字就是一个例子,但我给出的是url而不是我的蜘蛛名字(若我给出蜘蛛的名字,效果很好) scrapy crawl example.com 错误: 文件 “/usr/local/lib/python2.7/dist packages/Scrapy-0.14.1-py2.7.egg/Scrapy/spidermanager.py”, 创建中的第43行 raise KeyError(“未找到蜘蛛:%s”%Spider\u name)KeyError:“未找到蜘蛛:example.com”如何为scrapy提供用于爬行的URL?,scrapy,web-crawler,Scrapy,Web Crawler,我想用scrapy来抓取网页。有没有办法从终端本身传递起始URL 中给出了爬行器的名称或URL,但当我给出URL时,它会抛出一个错误: //我的蜘蛛的名字就是一个例子,但我给出的是url而不是我的蜘蛛名字(若我给出蜘蛛的名字,效果很好) scrapy crawl example.com 错误: 文件 “/usr/local/lib/python2.7/dist packages/Scrapy-0.14.1-py2.7.egg/Scrapy/spidermanager.py”, 创建中的第43行
如何使scrapy在终端中给定的url上使用我的spider???我不太确定命令行选项。然而,你可以这样写你的蜘蛛
class MySpider(BaseSpider):
name = 'my_spider'
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = [kwargs.get('start_url')]
然后像这样开始:
scrapy crawl my_spider-a start_url=”http://some_url“
使用scrapy parse命令。您可以使用spider解析url。url是从命令传递的
$ scrapy parse http://www.example.com/ --spider=spider-name
这是此线程中的扩展。到目前为止,这种方法只有在您只提供一个url的情况下才有效。例如,如果您希望像这样提供多个url,例如:
-a start_url=http://url1.com,http://url2.com
然后Scrapy(我使用的是当前的稳定版本0.14.4)将终止,但出现以下异常:
error: running 'scrapy crawl' with more than one spider is no longer supported
但是,您可以通过为每个起始url选择不同的变量以及保存传递的url数量的参数来避免此问题。大概是这样的:
-a start_url1=http://url1.com
-a start_url2=http://url2.com
-a urls_num=2
-a start_urls="http://example1.com,http://example2.com"
然后,您可以在spider中执行以下操作:
class MySpider(BaseSpider):
name = 'my_spider'
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
urls_num = int(kwargs.get('urls_num'))
start_urls = []
for i in xrange(1, urls_num):
start_urls.append(kwargs.get('start_url{0}'.format(i)))
self.start_urls = start_urls
这是一个有点丑陋的黑客,但它的工作。当然,显式地写下每个url的所有命令行参数是很乏味的。因此,在Python中封装scrapy crawl
命令并在循环或其他方式中生成命令行参数是有意义的
希望有帮助。:) 允许多个url参数的一种比Peter建议的更简单的方法是,将它们作为url用逗号分隔的字符串,如下所示:
-a start_url1=http://url1.com
-a start_url2=http://url2.com
-a urls_num=2
-a start_urls="http://example1.com,http://example2.com"
在spider中,您只需拆分“,”上的字符串并获得URL数组:
self.start_urls = kwargs.get('start_urls').split(',')
Sjaak Trekhaak的想法是正确的,下面是如何允许倍数:
class MySpider(scrapy.Spider):
"""
This spider will try to crawl whatever is passed in `start_urls` which
should be a comma-separated string of fully qualified URIs.
Example: start_urls=http://localhost,http://example.com
"""
def __init__(self, name=None, **kwargs):
if 'start_urls' in kwargs:
self.start_urls = kwargs.pop('start_urls').split(',')
super(Spider, self).__init__(name, **kwargs)
您也可以尝试以下方法:
>>> scrapy view http://www.sitename.com
它将在浏览器中打开所请求URL的窗口。example.com是否添加到您的爬行器的允许\u域中?example.com是否添加到允许的\u域中。我真正想要的是从命令行提供start_url。我该怎么做?非常感谢,这正是我想要的。这对我来说很好:)这种方法只适用于一个url。如果要提供多个url,请参阅此线程中的。对于多个url:
self.start\u url=kwargs.pop('start\u url')。拆分(',')
,在super()之前运行。遗憾的是,scrapy parse似乎没有将结果保存到文件(以各种格式)的选项像scrapy crawl一样,如果您只想调试蜘蛛在某个特定url上失败的原因,那么这是一个简单的选项。无法轻松保存/导出到文件。如果我像这样调用scrapy 0.24.4:scrapy crawl MySpider-a start\u URL=http://example.com/ -o--t json
一切正常。最初,我将选项放在-o和-get-same-as-your-error之间。问题是,哪一个更好的做法是:kwargs.pop('start\u-url')
还是kwargs.get('start\u-url')
?