如何使用Scrapy在页面内抓取?

时间:2013-06-10 00:48:54

标签: python web-scraping scrapy

我正在使用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'] = ....

我将如何做到这一点?

(注意:我的问题与Using multiple spiders at in the project in Scrapy类似,但我不确定如何从Scrapy的Request对象中“返回”值。)

1 个答案:

答案 0 :(得分:6)

在scrapy中,如果您需要发出更多请求,则解析方法需要返回一个新请求(使用yield,因为scrapy适用于生成器)。在此请求中,您可以设置对所需函数的回调(要递归,只需再次传递parse)。这是爬行到页面的方式。

您可以查看this recursive crawler作为示例

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

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 documentationthese random code snippets。他们可以帮助很多:)