1

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

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

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

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

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

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

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

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

谢谢

4

3 回答 3

3

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。

于 2012-08-28T14:17:49.677 回答
1

我会为此使用机械化。

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]
于 2012-08-28T14:15:41.947 回答
0

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

scrapy crawl <spider_name> -a search_word=python
于 2013-07-06T00:39:46.087 回答