14Python爬蟲---爬蟲僞裝瀏覽器

一、什麼是瀏覽器僞裝技術

  有一些網站爲了避免爬蟲的惡意訪問,會設置一些反爬蟲機制,常見的飯爬蟲機制主要有:
  1、通過分析用戶請求的Headers信息進行反爬蟲
  2、通過檢測用戶行爲進行反爬蟲,比如通過判斷同一個IP在短時間內是否頻繁訪問對應網站等進行分析
  3、通過動態頁面增加爬蟲的爬取難度,達到反爬蟲的目的

  第一種反爬蟲機制在目前網站中應用的最多,大部分反爬蟲網站會對用戶請求的Headers信息的“User-Agent”字段進行檢測來判斷身份,有時,這類反爬蟲的網站還會對“Referer”字段進行檢測。我們可以在爬蟲中構造這些用戶請求的Headers信息,以此將爬蟲僞裝成瀏覽器,簡單的僞裝只需設置好“User-Agent”字段的信息即可,如果要進行高相似度的路藍旗僞裝,則需要將用戶請求的Headers信息中常見的字段都在爬蟲中設置好
  第二種反爬蟲機制的網站,可以通過之前學習的使用代理服務器並經常切換代理服務器的方式,一般就能夠攻克限制
  第三種反爬蟲機制的網站,可以利用一些工具軟件,比如selenium+phantomJS,就可以攻克限制

二、瀏覽器僞裝準備

通過Fiddler,訪問愛奇藝網站,獲取頭部信息,如下
僞裝
字段的格式,基本格式爲:“字段名”:”字段值”
字段名和對應的值之間通過”:”隔開


常見頭信息字段的含義:

常見字段1: Accept: text/htnl, application/xhtml+xml, application/xmlq=0.9,中/*;q=08
  • Accept字段主要用來表示瀏覽器能夠支持的內容類型有哪些。
  • text html表示HTMⅡL文檔。
  • application/ xhtml+xm表示 XHTML文檔。
  • application/xml表示XMAL文檔。
  • q代表權重係數,值介於0和1之間。
    所以這一行字段信息表示瀏覽器可以支持 text/html,application/xml、/等內容類型,支持的優先順序從左到右依次排列。
常見字段2: accept-encoding:gzip, deflate
  • accept-encoding字段主要用來表示瀏覽器支持的壓縮編碼有哪些。
  • gzip是壓縮編碼的一種。
  • deflate是一種無損數據壓縮算法。
    這一行字段信息表示瀏覽器可以支持gzp、 deflate等壓縮編碼。
常見字段3: Accept- Language:zhCN,zh;q=0.8,en-US;q=0.5,cnq=0.3
  • Accept-language主要用來表示瀏覽器所支持的語言類型。
  • zh-CN表示簡體中文語言。zh表示中文,CN表示簡體
  • en-Us表示英語(美國)語言
  • en表示英語語言
    所以之一行字段表示瀏覽器可以支持zh-CN、zh、en-US、cn等語言。
常見字段4:User- Agent: Mozilla5.0( Windows NT61;WOw64;rv:47.0) Gecko20100101Firefox/47.0
  • user-agent字段主要表示用戶代理,服務器可以通過該字段識別出客戶端的瀏覽器類客戶端的操作系統及版本號型、瀏覽器版本號主要以僞造該字段進行網頁排版引擎等客戶端信息。所以之前要模擬瀏覽器登錄,主要以僞造該字段進行。
  • Mozilla5.0表示瀏覽器名和版本號
  • Windows NT61;WOw64;rv:47.0 表示客戶端操作系統對應信息
  • Gecko表示網頁排版引擎對應信息。
  • Firefox/47.0表示火狐瀏覽器
    所以這一行字段表示信息爲對應的用戶代理信息是Mozilla5.0( Windows NT61;WOw64;rv:47.0) Gecko20100101Firefox/47.0
常見字段5: Connection:keep-alve
  • Connection表示客戶端與服務器的連接類型,對應的字段值主要有兩種
    • keep-alive表示持久性連接。
    • close表示單方面關閉連接,讓連接斷開。

所以此時,這一行字段表示客戶端與服務器的連接是持久性連接。

常見字段6:Host: wwwyouku.con
  • Host字段表示請求的服務器網址是什麼,此時這一行字段表示請求的服務器網址是www,youku,con。
常見字段7: Referer:網址
  • Referer字段主要表示來源網址地址,比如我們從htp:/ www,youku.conm網址中訪問了該網址下的子頁面http/tvyouku.com?spm=0.0.topnav.5-1-3!2-A.Onqoef,那麼此時來源網址爲htp:/ www,youku,con,即此時 Referer字段的值爲http:/ww
    youku. com

三、爬蟲僞裝瀏覽器實戰

1、使用代理服務器
import urllib.request
import http.cookiejar

url = "http://news.163.com/18/0306/09/DC71LRR20001875N.html"
# 以字典的形式設置headers
headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    # "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    "Connection": "keep-alive",
    "referer": "http://www.163.com"
}
#設置cookie
cjar = http.cookiejar.CookieJar()
proxy = urllib.request.ProxyHandler({'http': "127.0.0.1:8888"})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler, urllib.request.HTTPCookieProcessor(cjar))
# 建立空列表,爲了以制定格式存儲頭信息
headall = []
for key,value in headers.items():
    item = (key, value)
    headall.append(item)
# 將制定格式的headers信息添加好
opener.addheaders = headall
# 將opener安裝爲全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
# data = data.decode("utf-8")
fhandle = open("D://testweb/part6/1.html", "wb")
fhandle.write(data)
fhandle.close()

注意:
1、”Accept-Encoding”: “gzip, deflate
這句話的意思是本地接收壓縮格式的數據,服務器傳過來壓縮格式gzip的文件,而解壓這種gzip文件只能用deflate算法,瀏覽器能夠自動解壓,程序卻不能自動解壓gzip,需要額外進行設置才行,
總結:寫爬蟲程序時候還是不要寫’Accept-Encoding’: ‘gzip, deflate’了,就讓服務器傳原始文件過來吧,不用壓縮了。
2、使用Fiddler作爲代理,所爬取的網址要以具體文件或者“/”結尾,如果有具體文件,直接寫該具體文件的網址即可。
3、referer字段的值一般可以設置爲要爬取的網頁的域名地址或者對應網站的主頁地址。

2、不使用代理僞裝瀏覽器
import urllib.request
import http.cookiejar

url = "http://www.baidu.com"
# 以字典的形式設置headers
headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    # "Accept-Encoding": "gzip, deflate",
    "Accept-Encoding": "gb2313,utf-8",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    "Connection": "keep-alive",
    "referer": "baidu.com"

}
#設置cookie
cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall = []
# 將制定格式的headers信息添加好
for key,value in headers.items():
    item = (key,value)
    headall.append(item)
opener.addheaders = headall
# 將opener安裝爲全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
fhandle = open("D://testweb/part6/2.html", "wb")
fhandle.write(data)
fhandle.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章