Python3網絡爬蟲(四):使用User Agent和代理IP隱藏身份

原做者及原文連接:blog.csdn.net/c406495762/…html

運行平臺:Windows Python版本:Python3.x IDE:Sublime text3python

1、爲什麼要設置User Agent

有一些網站不喜歡被爬蟲程序訪問,因此會檢測鏈接對象,若是是爬蟲程序,也就是非人點擊訪問,它就會不讓你繼續訪問,因此爲了要讓程序能夠正常運行,須要隱藏本身的爬蟲程序的身份。此時,咱們就能夠經過設置User Agent的來達到隱藏身份的目的,User Agent的中文名爲用戶代理,簡稱UA。正則表達式

User Agent存放於Headers中,服務器就是經過查看Headers中的User Agent來判斷是誰在訪問。在Python中,若是不設置User Agent,程序將使用默認的參數,那麼這個User Agent就會有Python的字樣,若是服務器檢查User Agent,那麼沒有設置User Agent的Python程序將沒法正常訪問網站。瀏覽器

Python容許咱們修改這個User Agent來模擬瀏覽器訪問,它的強大毋庸置疑。bash

2、常見的User Agent

1.Android

  • Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
  • Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
  • Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

2.Firefox

  • Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
  • Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0

3.Google Chrome

  • Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
  • Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19

4.iOS

  • Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 - Mobile/9A334 Safari/7534.48.3
  • Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 - - Mobile/3A101a Safari/419.3

上面列舉了Andriod、Firefox、Google Chrome、iOS的一些User Agent,直接copy就能用。服務器

3、設置User Agent的方法

先看下urllib.request.Request()學習

從上圖能夠看出,在建立Request對象的時候,能夠傳入headers參數。 所以,想要設置User Agent,有兩種方法:測試

  • 1.在建立Request對象的時候,填入headers參數(包含User Agent信息),這個Headers參數要求爲字典;網站

  • 2.在建立Request對象的時候不添加headers參數,在建立完成以後,使用add_header()的方法,添加headers。ui

方法一:

建立文件urllib_test09.py,使用上面提到的Android的第一個User Agent,在建立Request對象的時候傳入headers參數,編寫代碼以下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    #以CSDN爲例,CSDN不更改User Agent是沒法訪問的
    url = 'http://www.csdn.net/'
    head = {}
    #寫入User Agent信息
    head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
 #建立Request對象
    req = request.Request(url, headers=head)
    #傳入建立好的Request對象
    response = request.urlopen(req)
    #讀取響應信息並解碼
    html = response.read().decode('utf-8')
    #打印信息
    print(html)
複製代碼

運行結果以下:

方法二:

建立文件urllib_test10.py,使用上面提到的Android的第一個User Agent,在建立Request對象時不傳入headers參數,建立以後使用add_header()方法,添加headers,編寫代碼以下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    #以CSDN爲例,CSDN不更改User Agent是沒法訪問的
    url = 'http://www.csdn.net/'
    #建立Request對象
    req = request.Request(url)
    #傳入headers
    req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
    #傳入建立好的Request對象
    response = request.urlopen(req)
    #讀取響應信息並解碼
    html = response.read().decode('utf-8')
    #打印信息
    print(html)
複製代碼

運行結果和上一個方法是同樣的。

4、IP代理的使用

1.爲什麼使用IP代理

User Agent已經設置好了,可是還應該考慮一個問題,程序的運行速度是很快的,若是咱們利用一個爬蟲程序在網站爬取東西,一個固定IP的訪問頻率就會很高,這不符合人爲操做的標準,由於人操做不可能在幾ms內,進行如此頻繁的訪問。因此一些網站會設置一個IP訪問頻率的閾值,若是一個IP訪問頻率超過這個閾值,說明這個不是人在訪問,而是一個爬蟲程序。

2.通常步驟說明

一個很簡單的解決辦法就是設置延時,可是這顯然不符合爬蟲快速爬取信息的目的,因此另外一種更好的方法就是使用IP代理。使用代理的步驟:

(1)調用urlib.request.ProxyHandler(),proxies參數爲一個字典。

(2)建立Opener(相似於urlopen,這個代開方式是咱們本身定製的)

(3)安裝Opener

使用install_opener方法以後,會將程序默認的urlopen方法替換掉。也就是說,若是使用install_opener以後,在該文件中,再次調用urlopen會使用本身建立好的opener。若是不想替換掉,只是想臨時使用一下,可使用opener.open(url),這樣就不會對程序默認的urlopen有影響。

3.代理IP選取

在寫代碼以前,先在代理IP網站選好一個IP地址,推薦西刺代理IP。

URL:http://www.xicidaili.com/

注意:固然也能夠寫個正則表達式從網站直接爬取IP,可是要記住不要太頻繁爬取,加個延時什麼的,太頻繁給服務器帶來壓力了,服務器會直接把你block,不讓你訪問的,我就被封了兩天。

從西刺網站選出信號好的IP,個人選擇以下:(106.46.136.112:808)

編寫代碼訪問http://www.whatismyip.com.tw/,該網站是測試本身IP爲多少的網址,服務器會返回訪問者的IP。

4.代碼實例

建立文件urllib_test11.py,編寫代碼以下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
    #訪問網址
    url = 'http://www.whatismyip.com.tw/'
    #這是代理IP
    proxy = {'http':'106.46.136.112:808'}
    #建立ProxyHandler
    proxy_support = request.ProxyHandler(proxy)
    #建立Opener
    opener = request.build_opener(proxy_support)
    #添加User Angent
    opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
    #安裝OPener
    request.install_opener(opener)
    #使用本身安裝好的Opener
    response = request.urlopen(url)
    #讀取相應信息並解碼
    html = response.read().decode("utf-8")
    #打印信息
    print(html)
複製代碼

運行結果以下:

從上圖能夠看出,訪問的IP已經假裝成了106.46.136.112。


相關文章和視頻推薦

圓方圓學院聚集 Python + AI 名師,打造精品的 Python + AI 技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。 公開課地址: ke.qq.com/course/3627…

加入python學習討論羣 78486745 ,獲取資料,和廣大羣友一塊兒學習。

圓方圓python技術討論羣
圓方圓python技術討論羣
相關文章
相關標籤/搜索