- 明確目標 (要知道你準備在哪一個範圍或者網站去搜索)
- 爬 (將全部的網站的內容所有爬下來)
- 取 (去掉對咱們沒用處的數據)
- 處理數據(按照咱們想要的方式存儲和使用) 網絡爬蟲要作的,簡單來講,就是實現瀏覽器的功能。經過指定url,直接返回給用戶所須要的數據,而不須要一步步人工去操縱瀏覽器獲取。
推薦一篇文章:關於反爬蟲,看這一篇就夠了html
#1.通用爬蟲 VS 聚焦爬蟲 ###1.通用爬蟲:搜索引擎使用的爬蟲系統python
###2. 聚焦爬蟲: 爲了解決通用爬蟲的缺陷,開發人員針對特定用戶而開發的數據採集程序 特色:面向需求,需求驅動開發編程
#2.HTTP & HTTPSjson
HTTP:超文本傳輸協議:Hyper Text Transfer Protocalsegmentfault
HTTPS: Secure Hypertext Transfer Protocol 安全的超文本傳輸協議瀏覽器
HTTP請求:網絡上的網頁訪問,通常使用的都是超文本傳輸協議,用於傳輸各類數據進行數據訪問,從瀏覽器發起的每次URL地址的訪問都稱爲請求,獲取數據的過程稱爲響應數據緩存
抓包工具:在訪問過程當中,獲取網絡上傳輸的數據包的工具稱爲抓包工具,抓包:網絡編程中專業術語名詞,指代的是對網絡上傳輸的數據進行抓取解析的過程。我以前用的是Wireshark,其餘專業抓包工具如Sniffer,wireshark,WinNetCap.WinSock ,如今用的是Fiddler 抓包,Fiddler 下載地址。安全
瀏覽器設置代理進行數據抓包——建議使用谷歌的插件快捷設置不一樣的代理——Falcon Proxybash
#3.urllib2服務器
編碼函數:
urlencode()
遠程數據取回:urlretrieve()
urlopen()
Request()
urllib2第一彈——urlopen()
-urlopen()->response
->response->read()抓取網頁數據
->response->info() 抓取網頁請求報頭信息
->response->geturl()抓取訪問地址
->response->getcode()抓取訪問錯誤碼
複製代碼
註解:
urllib2庫裏面的urlopen方法,傳入一個URL,協議是HTTP協議,urlopen通常接受三個參數,urlopen(url, data, timeout)
response對象有一個read方法,能夠返回獲取到的網頁內容,即response.read()
urlopen參數能夠傳入一個request請求,它其實就是一個Request類的實例,構造時須要傳入Url,Data等等的內容
代碼操做一
# -*- coding:utf-8 -*-
#引入
import urllib2
response=urllib2.urlopen('https://www.baidu.com')
content=response.read()
print(content)
複製代碼
####1.headers的屬性介紹
User-Agent : 有些服務器或 Proxy 會經過該值來判斷是不是瀏覽器發出的請求 Content-Type : 在使用 REST 接口時,服務器會檢查該值,用來肯定 HTTP Body 中的內容該怎樣解析。 application/xml : 在 XML RPC,如 RESTful/SOAP 調用時使用 application/json : 在 JSON RPC 調用時使用 application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時使用 在使用服務器提供的 RESTful 或 SOAP 服務時, Content-Type 設置錯誤會致使服務器拒絕服務
注意:Sublime使用正則匹配替換^(.*):(.*)$
--> "\1":"\2",
在pycharm中則是^(.*):(.*)$
--> "$1":"$2",
能夠經過調用
Request.add_header()
添加/修改一個特定的header 也能夠經過調用Request.get_header()
來查看已有的header。
# urllib2_add_headers.py
import urllib2
import random
url = "http://www.itcast.cn"
ua_list = [
"Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
"Mozilla/5.0 (Macintosh; Intel Mac OS... "
]
user_agent = random.choice(ua_list)
request = urllib2.Request(url)
#也能夠經過調用Request.add_header() 添加/修改一個特定的header
request.add_header("User-Agent", user_agent)
# 第一個字母大寫,後面的所有小寫
request.get_header("User-agent")
response = urllib2.urlopen(req)
html = response.read()
print html
複製代碼
代碼操做二,假裝瀏覽器訪問
# -*- coding:utf-8 -*-
#引入
import urllib2
from urllib2 import Request
#假裝瀏覽器訪問
my_header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.7.0.16013'}
request=Request('https://www.baidu.com',headers=my_header)
response=urllib2.urlopen(request)
content=response.read()
print(content)
複製代碼
####2.Referer (頁面跳轉處) Referer:代表產生請求的網頁來自於哪一個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。這個屬性能夠用來跟蹤Web請求來自哪一個頁面,是從什麼網站來的等。
有時候遇到下載某網站圖片,須要對應的referer,不然沒法下載圖片,那是由於人家作了防盜鏈,原理就是根據referer去判斷是不是本網站的地址,若是不是,則拒絕,若是是,就能夠下載;
####3.Accept-Encoding(文件編解碼格式)
**Accept-Encoding:**指出瀏覽器能夠接受的編碼方式。編碼方式不一樣於文件格式,它是爲了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應以後先解碼,而後再檢查文件格式,許多情形下這能夠減小大量的下載時間。
舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, ;q=0
若是有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回通過gzip編碼的HTML頁面。 若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。
####4.Accept-Language(語言種類) Accept-Langeuage:指出瀏覽器能夠接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器可以提供一種以上的語言版本時要用到。
####5. Accept-Charset(字符編碼)
Accept-Charset:指出瀏覽器能夠接受的字符編碼。
舉例:Accept-Charset:iso-8859-1,gb2312,utf-8
####6. Cookie (Cookie)
Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它能夠記載和服務器相關的用戶信息,也能夠用來實現會話功能,之後會詳細講。
####7. Content-Type (POST數據類型)
Content-Type:POST請求裏用來表示的內容類型。
舉例:Content-Type = Text/XML; charset=gb2312:
指明該請求的消息體中包含的是純文本的XML類型的數據,字符編碼採用「gb2312」。
####7.服務端HTTP響應
HTTP響應也由四個部分組成,分別是: 狀態行、消息報頭、空行、響應正文
#4.經常使用的響應報頭(瞭解) 理論上全部的響應頭信息都應該是迴應請求頭的。可是服務端爲了效率,安全,還有其餘方面的考慮,會添加相對應的響應頭信息,從上圖能夠看到:
##1. 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秒的時間內,客戶端能夠直接從緩存副本中讀取資源,而不須要向服務器請求。
##2. Connection:keep-alive
這個字段做爲迴應客戶端的Connection:keep-alive,告訴客戶端服務器的tcp鏈接也是一個長鏈接,客戶端能夠繼續使用這個tcp鏈接發送http請求。
##3. Content-Encoding:gzip
告訴客戶端,服務端發送的資源是採用gzip編碼的,客戶端看到這個信息後,應該採用gzip對資源進行解碼。
##4. Content-Type:text/html;charset=UTF-8
告訴客戶端,資源文件的類型,還有字符編碼,客戶端經過utf-8對資源進行解碼,而後對資源進行html解析。一般咱們會看到有些網站是亂碼的,每每就是服務器端沒有返回正確的編碼。
##5. Date:Sun, 21 Sep 2016 06:18:21 GMT
這個是服務端發送資源時的服務器時間,GMT是格林尼治所在地的標準時間。http協議中發送的時間都是GMT的,這主要是解決在互聯網上,不一樣時區在相互請求資源的時候,時間混亂問題。
##6. Expires:Sun, 1 Jan 2000 01:00:00 GMT
這個響應頭也是跟緩存有關的,告訴客戶端在這個時間前,能夠直接訪問緩存副本,很顯然這個值會存在問題,由於客戶端和服務器的時間不必定會都是相同的,若是時間不一樣就會致使問題。因此這個響應頭是沒有Cache-Control:max-age=*這個響應頭準確的,由於max-age=date中的date是個相對時間,不只更好理解,也更準確。
##7. Pragma:no-cache
這個含義與Cache-Control等同。
##8.Server:Tengine/1.4.6
這個是服務器和相對應的版本,只是告訴客戶端服務器的信息。
##9. Transfer-Encoding:chunked
這個響應頭告訴客戶端,服務器發送的資源的方式是分塊發送的。通常分塊發送的資源都是服務器動態生成的,在發送時還不知道發送資源的大小,因此採用分塊發送,每一塊都是獨立的,獨立的塊都能標示本身的長度,最後一塊是0長度的,當客戶端讀到這個0長度的塊時,就能夠肯定資源已經傳輸完了。
##10. Vary: Accept-Encoding
告訴緩存服務器,緩存壓縮文件和非壓縮文件兩個版本,如今這個字段用處並不大,由於如今的瀏覽器都是支持壓縮的。
響應狀態碼
響應狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。
常見狀態碼:
100~199
:表示服務器成功接收部分請求,要求客戶端繼續提交其他請求才能完成整個處理過程。
200~299
:表示服務器成功接收請求並已完成整個處理過程。經常使用200(OK 請求成功)。
300~399
:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、經常使用302(所請求的頁面已經臨時轉移至新的url)、307和304(使用緩存資源)。
400~499
:客戶端的請求有錯誤,經常使用404(服務器沒法找到被請求的頁面)、403(服務器拒絕訪問,權限不夠)。
500~599
:服務器端出現錯誤,經常使用500(請求未完成。服務器遇到不可預知的狀況)。 ##Cookie 和 Session:
服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求時,服務器會認爲新的客戶端。
爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。
Cookie:經過在 客戶端 記錄的信息肯定用戶的身份。
Session:經過在 服務器端 記錄的信息肯定用戶的身份。