我是相对较新的 scrapy,我已获得大量的异常...以下是我尝试做的事︰

想要获取的数据的存在 4 嵌套的链接︰ 假设我有我想要爬网的总的 5 项。这些项是

Industry=scrapy.Field()
Company=scrapy.Field()
Contact_First_name=scrapy.Field()
Contact_Last_name=scrapy.Field()
Website=scrapy.Field()
  1. 现在要开始爬网我首先需要获得业界。业界 xpath 还包含与属于其行业领域的公司中的各个列表的链接。
  2. 接下来,我想要使用行业 xpath 并转到以下链接。此页面不包含任何我想要爬网的数据。但此页包含 href 链接到各个公司具有自己的基本信息页面。
  3. 使用列表页的 href 链接,我现在到达一页包含一个公司的信息。现在我要刮公司、 地址和网站。还有其他我需要单击就可以导致 Contact_First_Name,Contact_Last_Name 的 href 链接。
  4. 使用 href 链接,我现在到达包含 Contact_First_Name 和 Contact_Last_Name 的另一页

    After crawling all of these pages, I should have items that look somewhat like this: Industry Company Website Contact_First_Name Contact_Last_Name Finance JPMC JP.com Jamie Dimon Finance BOA BOA.com Bryan Moynihan Technology ADSK ADSK.com Carl Bass

编辑

这是正在工作的代码。真正帮助 Anzel 的建议,但我意识到子类 allowed_domains 错误的停止从通过下面的嵌套的链接。一旦更改了它,它的工作。

class PschamberSpider(scrapy.Spider):
    name="pschamber"
    allowed_domains = ["cm.pschamber.com"]
    start_urls = ["http://cm.pschamber.com/list/"]


    def parse(self, response):
        item = PschamberItem()
        for sel in response.xpath('//*[@id="mn-ql"]/ul/li/a'):
            # xpath and xpath().extract() will return a list
            # extract()[0] will return the first element in the list
            item['Industry'] = sel.xpath('text()').extract()
            # another mistake you made here
            # you're trying to call scrapy.Request(LIST of hrefs) which will fail
            # scrapy.Request only takes a url string, not list
            # another big mistake is you're trying to yield the item,
            # whereas you should yield the Request object
            yield scrapy.Request(sel.xpath('@href').extract()[0], callback=self.parse_2, meta={'item': item})

    # another mistake, your callback function DOESNT take item as argument
    def parse_2(self, response):
        for sel in response.xpath('.//*[@id="mn-members"]/div/div/div/div/div/a').extract():
            # you can access your response meta like this
            item=response.meta['item']
            item['Company'] = sel.xpath('text()').extract()
            yield scrapy.Request(sel.xpath('@href').extract()[0], callback=self.parse_3, meta={'item': item})

            # again, yield the Request object


    def parse_3(self, response):
        item=response.meta['item']
        item['Website'] = response.xpath('.//[@id="mn-memberinfo-block-website"]/a/@href').extract()
        # OK, finally assume you're done, just return the item object
        return item   
2014-12-31 00:00:00
问题评论:

有多种元 {...}您需要将代码中的错误,元 = {...},您正在尝试为scrapy。Request().extract()等的列表。您是否知道基本的scrapy或只是打字错误,如果您不介意我问?

从其他分析函数为您parse_page2 ,您将生成,而应该产生 scrapy。请求!

是的我是很熟悉 scrapy,我已经了解了示例代码,要算出。对仿真代码进行了更改,并添加了另一套我的积极工作的代码。

不粗鲁,但如果您是新手scrapy,我建议您学习通过启动一个较小的项目。了解每个模块/函数scrapy为您带来了,使自己了解事情的协同工作之前很多元素置于 1 项目当前为您带来很多麻烦。但一般情况下,只是快速的要仍做很多的错误,这无疑将引发错误。也许无法告诉我完全做什么您想要获得和什么你之后的数据?我可以整理您的指南的工作示例

我包括在代码中的 xpath 是此网站cm.pschamber.com/list给定站点中的有效的有的行业或主题列表,其中列出大约 20 更多链接。在每一个这些 20 链接中,有几个公司想要获取特定数据的列表。下面是我想做与 scrapy screencast.com/t/XfUn9Gny7lox的链接就会知道我的意思。我可能需要主要帮助...如果您愿意,我的电子邮件是 schanjr@gmail.com

回答:

有您所做的很多错误在代码中因此它不正在按照预期的那样。请参阅我的下面简述取样如何获取所需的,并向其他回调传递因为我只抓取网站最直接的一个不复制您的 xpath,您可以应用您自己。

我会尽可能让您知道位置不正确清除注释。

class PschamberSpider(scrapy.Spider):
    name = "pschamber"
    # start from this, since your domain is a sub-domain on its own,
    # you need to change to this without http://
    allowed_domains = ["cm.pschamber.com"]
    start_urls = (
        'http://cm.pschamber.com/list/',
    )

    def parse(self, response):
        item = PschamberItem()
        for sel in response.xpath('//div[@id="mn-ql"]//a'):
            # xpath and xpath().extract() will return a list
            # extract()[0] will return the first element in the list
            item['industry'] = sel.xpath('text()').extract()[0]

            # another mistake you made here
            # you're trying to call scrapy.Request(LIST of hrefs) which will fail
            # scrapy.Request only takes a url string, not list
            # another big mistake is you're trying to yield the item,
            # whereas you should yield the Request object
            yield scrapy.Request(
                sel.xpath('@href').extract()[0],
                callback=self.parse_2,
                meta={'item': item}
            )
    # another mistake, your callback function DOESNT take item as argument
    def parse_2(self, response):
        for sel in response.xpath('//div[@class="mn-title"]//a'):
            # you can access your response meta like this
            item = response.meta['item']
            item['company'] = sel.xpath('text()').extract()[0]
            # again, yield the Request object
            yield scrapy.Request(
                sel.xpath('@href').extract()[0],
                callback=self.parse_3,
                meta={'item': item}
            )

    def parse_3(self, response):
        item = response.meta['item']
        item['website'] = response.xpath('//a[@class="mn-print-url"]/text()').extract()
        # OK, finally assume you're done, just return the item object
        return item

希望这是很容易理解,就可以理解了这个基本的scrapy,您应该阅读彻底从Scrapy,doc 和更快地将学习另一种方法来设置规则,以便获取基本正确,您将了解这些后按照链接与某些模式的课程很好地...。

虽然每个人的历程不同,我强烈建议继续阅读和练习之前,要确信在爬网之前要做什么实际的网站。此外,有一些规则来保护 web 内容可以攒钱,这和刮版权有关的内容。

记住这一点,或者您可能会发现自己有大麻烦在将来。不管怎样,祝你好运,我希望此答案可以帮助您解决问题 !

Hi Anzel,非常感谢您在采取的时间来回答此问题。我已经更新了代码并连接用您的建议我最初的注释中。但是,在运行时遇到错误,称"在 parse_3 item=response.meta['item'],,,exceptions。KeyError: 项。在 parse_2,密钥会中罚款,但似乎在 parse_3 中丢失。我测试这段代码使用的"scrapy 分析-蜘蛛 = pschamber-c parse_3-d 3"cm.pschamber.com/list/";.

@StanleyChan,很高兴它帮助,如果您有为KeyError,这意味着你还没有的公司项目引发异常的技术则需要查看 xpath 或只是简单地从extract() [0]更改为extract()收益 xpath...

请输入您的翻译

Scrapy - Visiting nested links and grabbing meta data from each level

确认取消