【问题标题】:Scrapy multiple spiders抓取多个蜘蛛
【发布时间】:2015-01-19 11:49:46
【问题描述】:

我定义了两个蜘蛛,它们执行以下操作:

蜘蛛甲:

  1. 访问主页。
  2. 从页面中提取所有链接并将它们存储在一个文本文件中。

这是必要的,因为主页上有一个更多结果按钮,该按钮会生成指向不同产品的更多链接。

蜘蛛 B:

  1. 打开文本文件。

  2. 抓取各个页面并保存信息。

我正在尝试将两者结合起来并创建一个crawl-spider

首页的URL结构类似:

http://www.example.com

各个页面的 URL 结构类似于:

http://www.example.com/Home/Detail?id=some-random-number

文本文件包含将被第二个蜘蛛抓取的此类 URL 的列表。

我的问题:

如何将两个蜘蛛组合成一个蜘蛛来完成完整的抓取?

【问题讨论】:

  • 与您在 3 小时前提出的另一个问题有什么不同? stackoverflow.com/questions/28020360/…
  • @aberna 我从一个单独的 python 脚本调用了两个蜘蛛。现在我正在尝试将它们结合起来。这基本上意味着我不必单独调用它们。
  • 与其将链接写入文件,不如再次将它们作为请求发送?
  • 怎么做?任何其他问题的示例说明相同?
  • @Udy 有没有相同的例子?

标签: python web-scraping scrapy


【解决方案1】:

来自scrapy documantation

在回调函数中,您 parse 响应(网页)并返回 Item 对象、Request 对象或两者的可迭代对象。这些请求还将包含一个回调(可能相同),然后将由 Scrapy 下载,然后由指定的回调处理它们的响应。

所以你真正需要做的是在 parse 方法中(你在那里提取链接,对于每个链接,产生一个新的请求,如:

yield self.make_requests_from_url(http://www.example.com/Home/Detail?id=some-random-number)

  • self.make_requests_from_url 已经在Spider 中实现

这样的例子:

class MySpider(Spider):

    name = "my_spider"

    def parse(self, response):
        try:
            user_name = Selector(text=response.body).xpath('//*[@id="ft"]/a/@href').extract()[0]
            yield self.make_requests_from_url("https://example.com/" + user_name)
            yield MyItem(user_name)
        except Exception as e:
            pass

您可以使用不同的解析函数来处理其他请求。通过返回一个Request 对象并明确指定回调来实现(self.make_requests_from_url 函数调用parse 函数,默认情况下)

Request(url=url,callback=self.parse_user_page)

【讨论】:

  • 感谢乌迪的回答。我能够将请求发送到另一个页面。但问题是同样的蜘蛛代码也在为请求的页面运行。这是一个问题,因为第二页的元素与主页不同,并且由于该元素不存在,我收到 element not found 错误。我该怎么办?
  • 你可以根据页面的url或者context来处理。
  • 添加了另一个处理不同 url 类型解析的选项。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多