1. 程式人生 > >爬蟲新手學習1-爬蟲基礎

爬蟲新手學習1-爬蟲基礎

計算機 china 用戶名 ges wps 請求頭 重復內容 dnspod tran



一、 為什麽要做爬蟲?
首先:都說現在是"大數據時代",那數據從何而來?
企業產生的用戶數據:百度指數、阿裏指數、TBI騰訊瀏覽指數、新浪微博指數
數據平臺購買數據:數據堂、國雲數據市場、貴陽大數據交易所
政府/機構公開的數據:中華人民共和國國家統計局數據、世界銀行公開數據、聯合國數據、納斯達克。
數據管理咨詢公司:麥肯錫、埃森哲、艾瑞咨詢
爬取網絡數據:如果需要的數據市場上沒有,或者不願意購買,那麽可以選擇招/做一名爬蟲工程師,自己動手豐衣足食。拉勾網Python爬蟲職位

二、 通用爬蟲和聚焦爬蟲
根據使用場景,網絡爬蟲可分為 通用爬蟲 和 聚焦爬蟲 兩種.
(1) 通用爬蟲
通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。
通用搜索引擎(Search Engine)工作原理
通用網絡爬蟲 從互聯網中搜集網頁,采集信息,這些網頁信息用於為搜索引擎建立索引從而提供支持,它決定著整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響著搜索引擎的效果。

第一步:抓取網頁


搜索引擎網絡爬蟲的基本工作流程如下:
首先選取一部分的種子URL,將這些URL放入待抓取URL隊列;
取出待抓取URL,解析DNS得到主機的IP,並將URL對應的網頁下載下來,存儲進已下載網頁庫中,並且將這些URL放進已抓取URL隊列。
分析已抓取URL隊列中的URL,分析其中的其他URL,並且將URL放入待抓取URL隊列,從而進入下一個循環....

技術分享圖片

搜索引擎如何獲取一個新網站的URL:
1. 新網站向搜索引擎主動提交網址:(如百度http://zhanzhang.baidu.com/linksubmit/url)
2. 在其他網站上設置新網站外鏈(盡可能處於搜索引擎爬蟲爬取範圍)
3. 搜索引擎和DNS解析服務商(如DNSPod等)合作,新網站域名將被迅速抓取。
但是搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容,如標註為nofollow的鏈接,或者是Robots協議。
Robots協議(也叫爬蟲協議、機器人協議等),全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取,例如:
淘寶網:https://www.taobao.com/robots.txt
騰訊網: http://www.qq.com/robots.txt

第二步:數據存儲


搜索引擎通過爬蟲爬取到的網頁,將數據存入原始頁面數據庫。其中的頁面數據與用戶瀏覽器得到的HTML是完全一樣的。
搜索引擎蜘蛛在抓取頁面時,也做一定的重復內容檢測,一旦遇到訪問權重很低的網站上有大量抄襲、采集或者復制的內容,很可能就不再爬行。

第三步:預處理
搜索引擎將爬蟲抓取回來的頁面,進行各種步驟的預處理。
? 提取文字
? 中文分詞
? 消除噪音(比如版權聲明文字、導航條、廣告等……)
? 索引處理
? 鏈接關系計算
? 特殊文件處理
....
除了HTML文件外,搜索引擎通常還能抓取和索引以文字為基礎的多種文件類型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我們在搜索結果中也經常會看到這些文件類型。
但搜索引擎還不能處理圖片、視頻、Flash 這類非文字內容,也不能執行腳本和程序。

第四步:提供檢索服務,網站排名

搜索引擎在對信息進行組織和處理後,為用戶提供關鍵字檢索服務,將用戶檢索相關的信息展示給用戶。
同時會根據頁面的PageRank值(鏈接的訪問量排名)來進行網站排名,這樣Rank值高的網站在搜索結果中會排名較前,當然也可以直接使用 Money 購買搜索引擎網站排名,簡單粗暴。
技術分享圖片

但是,這些通用性搜索引擎也存在著一定的局限性:
1.通用搜索引擎所返回的結果都是網頁,而大多情況下,網頁裏90%的內容對用戶來說都是無用的。
2.不同領域、不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無法提供針對具體某個用戶的搜索結果。
3.萬維網數據形式的豐富和網絡技術的不斷發展,圖片、數據庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎對這些文件無能為力,不能很好地發現和獲取。
4.通用搜索引擎大多提供基於關鍵字的檢索,難以支持根據語義信息提出的查詢,無法準確理解用戶的具體需求。
針對這些情況,聚焦爬蟲技術得以廣泛使用。
(2) 聚焦爬蟲
聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程序,它與通用搜索引擎爬蟲的區別在於: 聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,盡量保證只抓取與需求相關的網頁信息。
而我們要學習的,就是聚焦爬蟲。

三、 HTTP和HTTPS
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議):是一種發布和接收 HTML頁面的方法。
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層。
SSL(Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡連接進行加密,保障在Internet上數據傳輸的安全。
? HTTP的端口號為80
? HTTPS的端口號為443

HTTP工作原理
網絡爬蟲抓取過程可以理解為模擬瀏覽器操作的過程。
瀏覽器的主要功能是向服務器發出請求,在瀏覽器窗口中展示您選擇的網絡資源,HTTP是一套計算機通過網絡進行通信的規則。

HTTP的請求與響應
HTTP通信由兩部分組成: 客戶端請求消息 與 服務器響應消息
技術分享圖片

(1) 瀏覽器發送HTTP請求的過程:
1.當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵之後,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分為“Get”和“Post”兩種方法。
2.當我們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發送一個Request請求去獲取 http://www.baidu.com 的html文件,服務器把Response文件對象發送回給瀏覽器。
3.瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。
當所有的文件都下載成功後,網頁會根據HTML語法結構,完整的顯示出來了。
4.URL(Uniform / Universal Resource Locator的縮寫):統一資源定位符,是用於完整地描述Internet上網頁和其他資源的地址的一種標識方法。

技術分享圖片

基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
? scheme:協議(例如:http, https, ftp)
? host:服務器的IP地址或者域名
? port#:服務器的端口(如果是走協議默認端口,缺省端口80)
? path:訪問資源的路徑
? query-string:參數,發送給http服務器的數據
? anchor:錨(跳轉到網頁的指定錨點位置)
例如:
? ftp://192.168.0.116:8080/index
? http://www.baidu.com
? http://item.jd.com/11936238.html#product-detail


四、 請求方法

(1) HTTP請求主要分為Get和Post兩種方法
GET是從服務器上獲取數據,POST是向服務器傳送數據
GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來產生響應內容,即“Get”請求的參數是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
POST請求參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向HTTP服務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等),請求的參數包含在“Content-Type”消息頭裏,指明該消息體的媒體類型和編碼,
註意:避免使用Get方式提交表單,因為有可能會導致安全問題。 比如說在登陸表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。
Accept (傳輸文件類型)
Accept:指瀏覽器或其他客戶端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互聯網郵件擴展))文件類型,服務器可以根據它判斷並返回適當的文件格式。
舉例:
Accept: */*:表示什麽都可以接收。
Accept:image/gif:表明客戶端希望接受GIF圖像格式的資源;
Accept:text/html:表明客戶端希望接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示瀏覽器支持的 MIME 類型分別是 html文本、xhtml和xml文檔、所有的圖像格式資源。
q是權重系數,範圍 0 =< q <= 1,q 值越大,請求越傾向於獲得其“;”之前的類型表示的內容。若沒有指定q值,則默認為1,按從左到右排序順序;若被賦值為0,則用於表示瀏覽器不接受此內容類型。
Text:用於標準化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;Application:用於傳輸應用程序數據或者二進制數據。詳細請點擊

Accept-Encoding(文件編解碼格式)
Accept-Encoding:指出瀏覽器可以接受的編碼方式。編碼方式不同於文件格式,它是為了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應之後先解碼,然後再檢查文件格式,許多情形下這可以減少大量的下載時間。
舉例:
Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回經過gzip編碼的HTML頁面。 如果請求消息中沒有設置這個域服務器假定客戶端對各種內容編碼都可以接受。

Accept-Language(語言種類)
Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器能夠提供一種以上的語言版本時要用到。

Cache-Control:must-revalidate, no-cache, private
這個值告訴客戶端,服務端不希望客戶端緩存資源,在下次請求資源時,必須要從新請求服務器,不能從緩存副本中獲取資源。
Cache-Control是響應頭中很重要的信息,當客戶端請求頭中包含Cache-Control:max-age=0請求,明確表示不會緩存服務器資源時,Cache-Control作為作為回應信息,通常會返回no-cache,意思就是說,"那就不緩存唄"。
當客戶端在請求頭中沒有包含Cache-Control時,服務端往往會定,不同的資源不同的緩存策略,比如說oschina在緩存圖片資源的策略就是Cache-Control:max-age=86400,這個意思是,從當前時間開始,在86400秒的時間內,客戶端可以直接從緩存副本中讀取資源,而不需要向服務器請求。

Connection:keep-alive
這個字段作為回應客戶端的Connection:keep-alive,告訴客戶端服務器的tcp連接也是一個長連接,客戶端可以繼續使用這個tcp連接發送http請求。

Host (主機和端口號)
Host:對應網址URL中的Web名稱和端口號,用於指定被請求資源的Internet主機和端口號,通常屬於URL的一部分。

User-Agent (瀏覽器名稱)
User-Agent:是客戶瀏覽器的名稱。
接下來,讓我們真正邁向我們的爬蟲之路吧!

五、 urllib2庫的基本使用
所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。 在Python中有很多庫可以用來抓取網頁,我們先學習urllib2。
urllib2 是 Python2.7 自帶的模塊(不需要下載,導入即可使用)
urllib2 官方文檔:https://docs.python.org/2/library/urllib2.html
urllib2 源碼:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
urllib2 在 python3.x 中被改為urllib.request

練習代碼1

模擬訪問百度得到的結果

import urllib2

# 向指定的url地址發送請求,並返回服務器響應的類文件對象
response = urllib2.urlopen("http://www.baidu.com/")

# 服務器返回的類文件對象支持Python文件對象的操作方法
# read()方法就是讀取文件裏的全部內容,返回字符串
html = response.read()

# 打印響應內容
print html

練習代碼2

隨機使用一款瀏覽器版本訪問百度獲取的結果

技術分享圖片
 1 import urllib2
 2 import random
 3 
 4 url = "http://www.baidu.com/"
 5 
 6 # 可以是User-Agent列表,也可以是代理列表
 7 ua_list = [
 8         "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
 9         "Mozilla/5.0 (Windows NT 6.1; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
10         "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
11         "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
12         "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
13 ]
14 
15 # 在User-Agent列表裏隨機選擇一個User-Agent
16 user_agent = random.choice(ua_list)
17 
18 # 構造一個請求
19 request = urllib2.Request(url)
20 
21 # add_header()方法 添加/修改 一個HTTP報頭
22 request.add_header("User-Agent", user_agent)
23 
24 # get_header() 獲取一個已有的HTTP報頭的值,註意只能是第一個字母大寫,其他的必須小寫
25 print request.get_header("User-agent")
View Code

練習代碼3

獲取搜索“xijinping”關鍵字的結果

技術分享圖片
 1 #coding:utf-8
 2 
 3 import urllib
 4 import urllib2
 5 
 6 url = "http://www.baidu.com/"
 7 word = {"wd": "xijinping"}
 8 word = urllib.urlencode(word)
 9 newurl = url + "s?" +word
10 
11 header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
12 
13 request = urllib2.Request(newurl, headers=header)
14 response = urllib2.urlopen(request)
15 
16 print response.read()
View Code

練習代碼4

輸入關鍵字搜索結果

技術分享圖片
 1 import urllib
 2 import urllib2
 3 
 4 url = "http://www.baidu.com/"
 5 headers = {"User-Agent" : "Mozilla 。。。。"}
 6 
 7 keyword = raw_input("請輸入需要查詢的關鍵字: ")
 8 
 9 wd = {"wd" : keyword}
10 
11 # 通過urllib.urlencode() 參數是一個dict類型
12 wd = urllib.urlencode(wd)
13 
14 # 拼接完整的url
15 fullurl = url + "?" + wd
16 
17 # 構造請求對象
18 request = urllib2.Request(fullurl, headers = headers)
19 
20 response = urllib2.urlopen(request)
21 
22 print response.read()
View Code

爬蟲新手學習1-爬蟲基礎