首页 文章

如何为scrapy提供URL进行爬行?

提问于
浏览
23

我想使用scrapy来抓取网页 . 有没有办法从终端本身传递起始URL?

documentation中给出了蜘蛛的名称或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行,在create raise KeyError(“未找到蜘蛛: %s“%spider_name”KeyError:'未找到蜘蛛:example.com'

如何让scrapy在终端上给出的url上使用我的蜘蛛?

6 回答

  • 3

    我不太确定命令行选项 . 但是,你可以像这样写你的蜘蛛 .

    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"

  • 0

    允许多个url参数比让Peter建议的更简单的方法是将它们作为一个字符串,用逗号分隔的URL,如下所示:

    -a start_urls="http://example1.com,http://example2.com"
    

    在蜘蛛中你会简单地将字符串拆分为','并得到一个网址数组:

    self.start_urls = kwargs.get('start_urls').split(',')
    
  • 3

    使用scrapy parse命令 . 你可以用你的蜘蛛解析一个网址 . url从命令传递 .

    $ scrapy parse http://www.example.com/ --spider=spider-name
    

    http://doc.scrapy.org/en/latest/topics/commands.html#parse

  • 4

    这是此线程中the approach given by Sjaak Trekhaak的扩展 . 到目前为止,这种方法只有在您提供一个网址时才有效 . 例如,如果您想提供多个这样的网址,例如:

    -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
    

    然后,您可以在蜘蛛中执行以下操作:

    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的所有命令行参数是很繁琐的 . 因此,将 scrapy crawl 命令包装在Python subprocess中并在循环或其他内容中生成命令行参数是有意义的 .

    希望能帮助到你 . :)

  • 10

    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)
    
  • 45

    你也可以试试这个:

    >>> scrapy view http://www.sitename.com
    

    它将在请求的URL的浏览器中打开一个窗口 .

相关问题