我正在使用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对象中“返回”值。)
答案 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 documentation和these random code snippets。他们可以帮助很多:)