【问题标题】:Scrapy approach to scraping multiple URLs抓取多个 URL 的 Scrapy 方法
【发布时间】:2013-07-06 08:39:46
【问题描述】:

我有一个需要进行大量数据抓取的项目。

我一直在研究 Scrapy,到目前为止我对它印象非常深刻,但我正在寻找执行以下操作的最佳方法:

1) 我想抓取多个 URL 并为要抓取的每个 URL 传递相同的变量,例如,假设我想要从 Bing、Google 和 Yahoo 返回关键字“python”的最高结果。

我想抓取 http://www.google.co.uk/q=pythonhttp://www.yahoo.com?q=pythonhttp://www.bing.com/?q=python(不是实际的 URL,但你明白了)

我找不到使用关键字指定动态 URL 的方法,我能想到的唯一选择是在 PHP 或其他构建 URL 的文件中生成一个文件,并指定 scrapy 来抓取 URL 中的链接。

2) 显然每个搜索引擎都有自己的标记,因此我需要区分每个结果以找到相应的 XPath 以从中提取相关数据

3)最后,我想将抓取项目的结果写入数据库(可能是 redis),但只有当所有 3 个 URL 都完成抓取后,基本上我想从 3 个中建立一个“配置文件”搜索引擎并将输出的结果保存在一个事务中。

如果有人对这些观点有任何想法,我将不胜感激。

谢谢

【问题讨论】:

  • 除了我对 #1 的想法之外,我还希望在 'parse' 方法中使用 URL 的 case 语句的组合来处理 #2 和 #3,并构建一个通用的 Item 来获取 XPath 值.不过我敢肯定有一种更简单的方法

标签: python scrapy


【解决方案1】:

1) 在 BaseSpider 中,有一个__init__ 方法可以在子类中被覆盖。这是设置 start_urls 和 allowed_domains 变量声明的地方。如果您有一个 url 列表,在运行蜘蛛之前,您可以在此处动态插入它们。

例如,在我构建的一些蜘蛛中,我从 MongoDB 中拉入预先格式化的 URL 组,并在一次批量插入中将它们插入到 start_urls 列表中。

2)这可能有点棘手,但您可以通过查看响应对象 (response.url) 轻松查看抓取的 URL。您应该能够检查该 url 是否包含“google”、“bing”或“yahoo”,然后为该类型的 url 使用预先指定的选择器。

3) 我不太确定#3 是否可行,或者至少不是没有困难。据我所知,start_urls列表中的url不是有序爬取的,都是独立到达管道的。我不确定如果没有一些严重的核心黑客攻击,您将能够收集一组响应对象并将它们一起传递到管道中。

但是,您可能会考虑暂时将数据序列化到磁盘,然后稍后将数据批量保存到您的数据库中。我构建的其中一个爬虫接收大约 10000 个 URL 组。我没有进行 10000 次单项数据库插入,而是将 url(和收集的数据)存储在 BSON 中,然后再将其插入 MongoDB。

【讨论】:

  • 您究竟是如何设法从 mongodb 中提取 url 并将它们插入到批量列表中的?一个示例实现代码会很有帮助。
【解决方案2】:

我会为此使用机械化。

import mechanize
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.set_handle_robots(False)
response = br.open('https://www.google.ca/search?q=python')
links = list(br.links())

它为您提供所有链接。或者您可以按类别过滤掉它们:

links = [aLink for aLink in br.links()if ('class','l') in aLink.attrs]

【讨论】:

    【解决方案3】:

    您可以使用“-a”开关为蜘蛛指定一个键值对,这可以指示特定的搜索词

    scrapy crawl <spider_name> -a search_word=python
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2015-11-11
      相关资源
      最近更新 更多