Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为scrapy提供用于爬行的URL?_Scrapy_Web Crawler - Fatal编程技术网

如何为scrapy提供用于爬行的URL?

如何为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

中给出了爬行器的名称或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上使用我的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')