5

我正在使用 Python 和 Scrapy 来回答这个问题。

我正在尝试抓取网页A,其中包含指向网页B1、B2、B3、...的链接列表。每个B页面都包含指向另一个页面C1、C2、C3、...的链接,其中包含图像。

因此,使用 Scrapy,伪代码中的想法是:

links = getlinks(A)
for link in links:
    B = getpage(link)
    C = getpage(B)
    image = getimage(C)

但是,当我尝试在 Scrapy 中解析多个页面时遇到了问题。这是我的代码:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    links = hxs.select('...')

    items = []
    for link in links:
        item = CustomItem()
        item['name'] = link.select('...')
        # TODO: Somehow I need to go two pages deep and extract an image.
        item['image'] = ....

我该怎么做呢?

(注意:我的问题类似于在 Scrapy 的项目中使用多个蜘蛛,但我不确定如何从 Scrapy 的请求对象中“返回”值。)

4

1 回答 1

6

在 scrapy 中,如果您需要发出更多请求,则 parse 方法需要返回一个新请求(使用yield作为 scrapy 与生成器配合得很好)。在此请求中,您可以设置所需函数的回调(递归只需parse再次传递)。这就是爬入页面的方式。

你可以检查这个递归爬虫作为例子

按照您的示例,更改将是这样的:

def parse(self, response):
    b_pages_links = getlinks(A)
    for link in b_pages_links:
        yield Request(link, callback = self.visit_b_page)

def visit_b_page(self, response):
    url_of_c_page = ...
    yield Request(url_of_c_page, callback = self.visit_c_page)

def visit_c_page(self, response):
    url_of_image = ...
    yield Request(url_of_image, callback = self.get_image)

def get_image(self, response):
    item = CustomItem()
    item['name'] = ... # get image name
    item['image'] = ... # get image data
    yield item

还要检查scrapy 文档这些随机代码片段。他们可以提供很多帮助:)

于 2013-06-10T01:43:41.783 回答