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进行处理

其实改动不是特别大。只是更深层次理解了这样几点:

  1. 首先,scrapy是根据start_urls中的url,获取第一个response,进入parse()
  2. 我们爬取到二层url之后,返回response可以指定处理函数
  3. 通过yield抛出相应的item,进入pipeline进行处理
posted @ 2016-07-21 22:20  打不死的流云  阅读(426)  评论(0编辑  收藏  举报