【问题标题】:Python - Scrapy - Creating a crawler that gets a list of URLs and crawls themPython - Scrapy - 创建一个获取 URL 列表并抓取它们的爬虫
【发布时间】:2018-01-05 20:27:46
【问题描述】:

我正在尝试使用“Scrapy”包创建一个蜘蛛,它获取 URL 列表并抓取它们。我已经在 stackoverflow 中搜索了答案,但找不到可以解决问题的方法。

我的脚本如下:

class Try(scrapy.Spider):
   name = "Try"

   def __init__(self, *args, **kwargs):
      super(Try, self).__init__(*args, **kwargs)
      self.start_urls = kwargs.get( "urls" )
      print( self.start_urls )

   def start_requests(self):
      print( self.start_urls )
      for url in self.start_urls:
          yield Request( url , self.parse )

   def parse(self, response):
      d = response.xpath( "//body" ).extract()

当我抓取蜘蛛时:

Spider = Try(urls = [r"https://www.example.com"])
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(Spider)
process.start()

我在打印 self.start_urls 时得到以下信息:

  • 在屏幕上打印的__init__函数是: [r"https://www.example.com"](传递给蜘蛛)。
  • 在屏幕上打印的start_requests函数是:无

为什么我没有得到?有没有另一种方法来解决这个问题?或者我的蜘蛛课有什么错误吗?

感谢您提供的任何帮助!

【问题讨论】:

  • 使用其他名称作为列表以在开始时保留 url - self.start_urlsscrapy 使用,因此它可以删除它们。我想知道您是否将网址放在self.start_urls 中的__init__ 中,那么它可能会使用它们而您不必使用start_requests
  • process.crawl 在调用from_crawler 时将创建一个不带参数的新 Try 对象。请参阅 Scrapy 源代码中的爬虫类。 github.com/scrapy/scrapy/blob/master/scrapy/…

标签: python scrapy scrapy-spider


【解决方案1】:

我建议在process.crawl 中使用Spider 类并在那里传递urls 参数。

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy import Request


class Try(scrapy.Spider):
   name = 'Try'

   def __init__(self, *args, **kwargs):
      super(Try, self).__init__(*args, **kwargs)
      self.start_urls = kwargs.get("urls")

   def start_requests(self):
      for url in self.start_urls:
          yield Request( url , self.parse )

   def parse(self, response):
      d = response.xpath("//body").extract()

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(Try, urls=[r'https://www.example.com'])
process.start()

【讨论】:

    【解决方案2】:

    如果我跑了

    process.crawl(Try, urls=[r"https://www.example.com"])
    

    然后它按我的预期将urls 发送到Try。甚至我也不需要start_requests

    import scrapy
    
    class Try(scrapy.Spider):
    
       name = "Try"
    
       def __init__(self, *args, **kwargs):
           super(Try, self).__init__(*args, **kwargs)
           self.start_urls = kwargs.get("urls")
    
       def parse(self, response):
           print('>>> url:', response.url)
           d = response.xpath( "//body" ).extract()
    
    from scrapy.crawler import CrawlerProcess
    
    process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
    })
    process.crawl(Try, urls=[r"https://www.example.com"])
    process.start()
    

    但是如果我使用

    spider = Try(urls = ["https://www.example.com"])
    
    process.crawl(spider)
    

    然后它看起来像在没有urls 的情况下运行新的Try,然后列表为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多