本篇从实际出发,展现如何用网页爬虫。并介绍一个流行的爬虫框架~html
所谓网页爬虫,就是模拟浏览器的行为访问网站,从而得到网页信息的程序。正由于是程序,因此得到网页的速度能够轻易超过单身多年的手速:)。一般适用于须要大量网页信息的场合。python
爬取网页的流程为:访问初始url -> 得到返回的网页,从这个网页中获得新的url并放入待爬队列 -> 访问新的url -> ...依次循环。总体上来看就是一个广度优先的过程,固然,新的url也不必定非要从返回的网页中得到。算法
一个简单的网页爬虫应该包括如下部分:网页爬虫
那么,最简单的爬虫就能够这么写:浏览器
import Queue start_url = "http://www.cnblogs.com/rubinorth" url_queue = Queue.Queue() # url队列 url_queue.put(start_url) bloomfilter.put(start_url) #### 一直循环到队列为空 #### while(True): if url_queue.size() > 0: current_url = url_queue.get() # 队首的url page = crawl(current_url) # crawl为网页爬取模块,page是爬到的网页源代码 next_urls = deal_page(page) # deal_page为网页分析模块,next_urls是新的一些url for next_url in next_urls: if not bloomfilter.has(next_url): # 判重 bloomfilter.put(next_url) url_queue.put(next_url) else: break
scrapy是目前一个比较流行的爬虫框架,其基本原理与上面的爬虫是同样的,可是它提供了不少便利的功能。cookie
首先,先简要介绍一下scrapy各个模块之间的关系和整个框架运行的流程。是时候祭出那张scrapy的经典图了:
从这张图上看,scrapy包含了如下模块:python爬虫
上面列出的里面spider,pipeline须要本身写,两种middleware须要的话能够本身添加本身写的。框架
光介绍给人感受比较空洞,那下面就让咱们来使用scrapy实现一个简单的爬虫吧。dom
scrapy createproject cnblog_project
使用上面的命令建立一个scrapy工程以后,首先咱们要写的是spider。scrapy
class CnblogSpider(Spider): name = 'cnblog_spider' # 爬虫名字 allowed_domain = ['cnblogs.com'] # 容许的domain def __init__(self): self.start_urls = ['http://www.cnblogs.com/rubinorth'] def start_requests(self): return [Request(url, callback=self.parse_page) for url in self.start_urls] # 分析爬取的页面并构造下一个页面的请求 def parse_page(self, response): logging.info("parse : " + response.url) sel = Selector(response) item = CnblogItem() # 提取页面内容 item['name'] = sel.xpath("//a[@id='Header1_HeaderTitle']/text()").extract()[0] yield item # 下一个页面的请求 new_url = get_new_url(response.body) # 根据源码分析出新的连接,需本身实现 yield Request(new_url, callback=self.parse_page)
上面是一个简单的爬虫,start_urls是初始的url集合(上面只有一个),start_requests则根据start_urls构造Request,并交给调度器。parse_page中,response是返回的页面的源码;CnblogItem是scrapy提供的item组件,方便结构化地提取源码中的数据,而yield item则会将这个item交给管道;yield Request(new_url, callback=self.parse_page)则会发送一个新的Request,发起下一轮的爬取。
items.py中只要这么写:
class CnblogItem(scrapy.Item): name = scrapy.Field()
接着,咱们须要写pipelines.py
class CnblogPipeline(object): def process_item(self, item, spider): print item['name'] return item
每一个pipeline都必须有process_item这个方法。上面咱们只是简单地打印出了name。return item是考虑到可能有多个pipeline(return了以后可让其余pipeline处理)。
最后,只须要修改settings.py便可:
... ITEM_PIPELINES = { 'yelp_project.pipelines.CnblogPipeline': 304, } ...
须要在setting中打开本身的pipeline。
好了,一个简单的爬虫就这么写完了。注意咱们并无用到中间件,也不须要写本身的中间件。
最后, 命令行运行:
scrapy crawl cnblog_spider
转载请注明出处:http://www.cnblogs.com/rubinorth/