爬蟲(Spider),這裏固然不是說結網捉蟲的蜘蛛那樣的生物學上的爬蟲,這裏說的是互聯網上的爬蟲,由程序員編寫,具備必定的邏輯性可以完成在指定範圍內進行信息收集的程序。javascript
聽說爬蟲佔據了互聯網上60%多的流量,可想而知這個無比龐大的互聯網上有多少隻辛辛苦苦矜矜業業的爬蟲們啊。html
爬蟲,主要分爲搜索引擎類的爬蟲和具備必定目標的專用爬蟲。前者索引整個web世界,讓人們能方便的搜索到本身想要的信息,通常網站也很歡迎這些爬蟲。然後者有時候目的性比較強,爬取範圍也比較窄,通常收集數據用於二次加工或者數據分析等。這裏主要講的就是第二種爬蟲。java
爬蟲的工做很簡單,一句話歸納就是找到目標入口而後在目標頁面獲取目標內容。python
爬蟲的原理也不復雜,主要是經過http或者其餘協議,發送請求到目標接口,而後解析返回的內容成結構化數據存儲到本地。git
製做一個爬蟲基本須要以下步驟:程序員
- 肯定目標:
製做爬蟲首先須要清楚本身的目的,但願獲取哪些信息。- 觀察目標:
而後經過觀察目標網站或者程序,獲取目標信息的入口和索引方式。- 結構提取:
進入內容頁面,觀察感興趣區域的頁面結構,而後考慮經過正則表達式或者xpath等方式提取目標內容。- 編碼實現:
前3步完成以後,最後就是使用線程工具或者本身編碼實現這個爬蟲了。
完成這些,基本上就能夠認爲製做出來一個網絡爬蟲了,而後就是讓這個爬蟲啓動運行起來。至於怎麼處理爬到的數據,那就不是爬蟲的事了。github
下面介紹2種爬蟲製做方法。web
因爲爬蟲這種需求比較多,因此網絡上有一些專門的工具,能經過簡單的配置就能製做爬蟲。ajax
推薦一個國內軟件商製做的比較傻瓜式的爬蟲生成工具:火車採集器,免費版基本就夠用了。正則表達式
具體用法參考其視頻教程,基本上看完視頻就能知道怎麼用了。
這個對於一些簡單的場景基本夠用了,主要優點是配置簡單,搭建方便,傻瓜化運行。
在現有工具沒法知足需求或者想要學習爬蟲的原理的時候,也能夠經過編寫代碼來製做爬蟲。
固然,也不須要要從tcp/ip或者http協議這麼底層開始,能夠經過一些開源的爬蟲框架來編寫爬蟲。其中以python語言做爲基礎的爬蟲框架比較多,這裏以scrapy爲例。
scrapy是一個開源的python爬蟲框架,也是目前最流行的爬蟲框架之一,裏面集成了一些爬蟲經常使用的功能,基本上只須要寫爬蟲的邏輯就行。
以一個最簡單的例子來講明scrapy的用法。
須要有一個爬蟲天天去查詢百度搜索「爬蟲」的前2頁搜索結果,而後分析新排序到前2頁的搜索結果(其餘後處理)。
首先在百度輸入「爬蟲」搜索,跳轉到搜索結果頁。觀察結果頁面的URL結果,能夠看到:
第1頁URL:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=%E7%88%AC%E8%99%AB&oq=%E7%88%AC%E8%99%AB&rsv_pq=9fd63f8600011b0b&rsv_t=3b30%2BHymEU5wSsRM5DGZD1gCwRjvljkpEIr3hXU0nOba6AHvpIdgH6DokZ4&rqlang=cn&rsv_enter=0&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_sug4=470
第2頁URL:
https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB&pn=10&oq=%E7%88%AC%E8%99%AB&ie=utf-8&usm=1&rsv_pq=cb75075a0001681d&rsv_t=0986khHCUHLdfml7ymZib2JecfTLlPX%2Ft57JycxSQwzQh5miPsj1IKCeEGQ&rsv_page=1
URL裏面有很多參數,可能用不着,因此試着簡化這個URL:
第1頁URL:
https://www.baidu.com/s?wd=爬蟲&pn=0
第2頁URL:
https://www.baidu.com/s?wd=爬蟲&pn=10
那麼爬蟲的入口就知道了。
scrapy用的是xpath作結構解析,因此這裏須要獲取到目標區域的xpath。xpath是什麼參考這裏。
chrome瀏覽器有一個很好的插件能夠很方便的獲取到某個html節點的xpath,XPath Helper,先安裝好它。
打開chrome,輸入URL(https://www.baidu.com/s?wd=爬蟲&pn=0),而後F12進入開發者模式。經過鼠標找到第1個搜索結果的html節點,而後右鍵:copy-Copy XPath。
獲得搜索結果html節點的xpath分別是:
第1頁1-10搜索結果: //*[@id="1"]/h3/a //*[@id="2"]/h3/a ... //*[@id="10"]/h3/a 第2頁11-20搜索結果: //*[@id="11"]/h3/a //*[@id="12"]/h3/a ... //*[@id="20"]/h3/a
那麼目標區域的xpath就很明顯了,獲取到xpath以後獲得href屬性和text結果就好了。
固然也能夠經過其餘的xpath獲取到這些節點位置,這個並非惟一的。
scrapy安裝這裏再也不贅述,經過pip install scrapy便可安裝,國內能夠把pip的源設置爲阿里雲或者豆瓣的源,而後執行上述命令安裝。
本節所有代碼在:baidu_spider
進入工做目錄,命令行輸入:
scrapy startproject baidu_spider
而後進入baidu_spider目錄,打開items.py,輸入以下代碼:
# -*- coding: utf-8 -*- import scrapy class BaiduSpiderItem(scrapy.Item): # define the fields for your item here #搜索結果的標題 title = scrapy.Field() #搜索結果的url url = scrapy.Field()
這裏定義的是爬蟲爬取結果的結構,包含搜索結果的標題和搜索結果的url。
打開settings.py,修改下面行:
#ROBOTSTXT_OBEY = True ROBOTSTXT_OBEY = False
這個修改是由於百度的robots.txt禁止其餘爬蟲去爬它,因此須要把robots協議這個君子協定暫時單方面關掉。
而後進入spider目錄,新建baiduSpider.py,輸入下面代碼:
# -*- coding: UTF-8 -*- import scrapy from scrapy.spiders import CrawlSpider from scrapy.selector import Selector from scrapy.http import Request from baidu_spider.items import BaiduSpiderItem from selenium import webdriver import time class BaiduSpider(CrawlSpider): name='baidu_spider' def start_requests(self): #函數名不可更改,此函數定義了爬蟲的入口地址 #使用瀏覽器訪問 self.browser = webdriver.Chrome('d:/software/chromedriver.exe') for i in range(0,20,10): url = 'https://www.baidu.com/s?wd=爬蟲&pn=%d' % i yield self.make_requests_from_url(url) def parse(self, response): #函數名不可更改,此函數定義了爬蟲的頁面解析 #打開瀏覽器訪問頁面 self.browser.get(response.url) time.sleep(1) selector = Selector(text=self.browser.page_source) page_start = int(response.url.split('=')[-1]) for i in range(1,11): item = BaiduSpiderItem() xpath = '//*[@id="%d"]/h3/a' % (page_start+i) print xpath print selector.xpath(xpath + '/@href').extract() item['url'] = selector.xpath(xpath + '/@href').extract()[0] item['title'] = selector.xpath(xpath + '//text()').extract() yield item
這裏用到了selenium和chrome webdriver,用於使用chrome模擬正經常使用戶的訪問,這是由於百度作了防爬蟲的措施,因此爲了簡單,咱們就僞裝咱們的爬蟲就是正經常使用戶。
selenium經過pip安裝便可,chrome webdriver在此處下載,而後安裝上。把baiduSpider.py中的webdriver.Chrome行中的可執行文件地址改爲本身的安裝地址。
所有代碼編寫完畢,在scrapy.cfg那一層目錄(頂層)中輸入下面的命令啓動爬蟲:
scrapy crawl baidu_spider -o result.csv
一切順利的話會輸出一些log,而且啓動chrome打開網頁,最後生成result.csv文件,文件內包含了爬取到的結果。
本節所有代碼在:baidu_spider
爬蟲的進階就是須要與數據來源方鬥智鬥勇了,處理包括但不限於如下問題:
- IP被封禁
- 訪問次數受限制
- 爬取速度太慢
- 頁面重定向
- 頁面ajax生成內容
- 頁面內容由複雜的javascript生成
- etc.