本篇從實際出發,展現如何用網頁爬蟲。並介紹一個流行的爬蟲框架~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/