Python爬虫Scrapy框架入门(3)
往往需要爬取的网页是呈一个树状结构。比如,需要先爬取一个目录,然后再在目录中选择具体的爬取目标。而目录和具体目标之间,网页结构不同,使得我们不能使用相同的爬取策略。
从之前的经验来看,我们对scrapy进行操作是从Spider的Parse()函数作为入口。不如在parse()函数中对对目录进行操作,获取相应目标的url,再进一步爬取具体内容。
代码如下:
1 class ZhangzishiSpider(scrapy.Spider): 2 name = 'zhangzishi' 3 allowed_domains = ['http://www.zhangzishi.cc/'] 4 start_urls = ['http://www.zhangzishi.cc/category/welfare'] 5 6 def parse_art(self, response): 7 imgs = ZhangzishiArtItem() 8 imgs['img_urls'] = response.xpath('//article//img//@src').extract() 9 yield imgs 10 11 def parse(self, response): 12 url_list_item = ZhangzishiListItem() 13 url_list_item['art_urls'] = response.xpath('//article[@class="excerpt"]//h2//a[@target="_blank"]//@href').extract() 14 #yield url_list_item 15 for url in url_list_item['art_urls']: 16 if url: 17 print 'analysing article:\t' + url 18 yield scrapy.Request(url, callback=self.parse_art, dont_filter=True)
对于parse,每次获取item之后,通过yield发出新的request,获取具体的爬取目标,再在parse_art函数中对相应的response进行处理
其实改动不是特别大。只是更深层次理解了这样几点:
- 首先,scrapy是根据start_urls中的url,获取第一个response,进入parse()
- 我们爬取到二层url之后,返回response可以指定处理函数
- 通过yield抛出相应的item,进入pipeline进行处理