用Scrapy刮取分层数据

时间:2017-11-26 01:22:07

标签: python scrapy

我想要抓的网站有以下几页:

  • 所有图书清单
  • 该书的信息页面及其所有章节
  • 当您单击章节时,将显示第一页,并且将显示该章的所有页面的下拉列表

到目前为止一切顺利。我能够抓取我需要的所有数据,但唯一的问题是将一个页面引用到它的章节,或者引用它的书中的章节。我已经阅读了将书籍信息传递给meta的内容:

scrapy.Request(url=url, callback=self.parse_chapter, meta={book: book})

但我无法弄清楚如何在我的项目管道中引用它们。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

您的元调用缺少引号。您可以正确设置元字段并在回调函数中获取它,如下所示:

# Meta is a python dictionary so you must use dictionary syntax.
yield scrapy.Request(link, callback=self.parse_chapters meta={'item': item})

def parse_chapters(self, response):
    item = response.meta['item']

您可以在scrapy项目字段中存储任何内容。您可以按如下方式定义项目:

class MyItem(scrapy.Item):
    f = scrapy.Field()
    book = f
    chapters = f
    pages = f

每次进入新页面时,您都会将项目传入并检索。您可以存储所有章节和页面的列表。或者,如果要存储嵌套项,可以存储如下字典:

dict = {"Book": "Moby Dick", "Chapters": {"1": ["page1", "page2", "page3"]
                                          "2": ["page4", "page5", "page6" ]}
# Now you only need 1 field in your item I believe you must save as string
item['book'] = str(dict)

对于您提供的有限信息,我能做的最好。如果您想提供一些代码并提出明确的问题,我会尝试进一步帮助您。

PS:我可以随意编辑,因为我确定这里有错误。

答案 1 :(得分:-1)

我猜在抓取过程中无法引用这些项目。将它们保存在一个表中,然后在刮取后分离记录。