搜尋
首頁後端開發Python教學[Python]網路爬蟲(五):urllib2的使用細節與抓站技巧

前面說到了urllib2的簡單入門,下面整理了一部分urllib2的使用細節。


1.Proxy 的設定

urllib2 預設會使用環境變數 http_proxy 設定 HTTP Proxy。

如果想在程式中明確控制 Proxy 而不受環境變數的影響,可以使用代理。

新建test14來實作一個簡單的代理Demo:

import urllib2  
enable_proxy = True  
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})  
null_proxy_handler = urllib2.ProxyHandler({})  
if enable_proxy:  
    opener = urllib2.build_opener(proxy_handler)  
else:  
    opener = urllib2.build_opener(null_proxy_handler)  
urllib2.install_opener(opener)

這裡要注意的一個細節,使用 urllib2.install_opener() 會設定 urllib2 的全域 opener 。

這樣後面的使用會很方便,但不能做更細緻的控制,例如想在程式中使用兩個不同的 Proxy 設定等。

比較好的做法是不使用 install_opener 去更改全域的設置,而只是直接調用 opener 的 open 方法來代替全域的 urlopen 方法。


2.Timeout 設定
在舊版 Python 中(Python2.6前),urllib2 的 API 並沒有暴露 Timeout 的設置,要設定 Timeout 值,只能更改 Socket 的全域 Timeout 值。

import urllib2  
import socket  
socket.setdefaulttimeout(10) # 10 秒钟后超时  
urllib2.socket.setdefaulttimeout(10) # 另一种方式

在 Python 2.6 以後,超時可以透過 urllib2.urlopen() 的 timeout 參數直接設定。

import urllib2  
response = urllib2.urlopen('http://www.google.com', timeout=10)

3.在HTTP Request 中加入特定的Header

要加入header,需要使用Request 物件:

import urllib2  
request = urllib2.Request('http://www.baidu.com/')  
request.add_header('User-Agent', 'fake-client')  
response = urllib2.urlopen(request)  
print response.read()

對有些header 要特別留意,伺服器會針對這些header 做檢查
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 設定錯誤會導致伺服器拒絕服務



4.Redirect
urllib2 預設值進行預設值 3XXirect ,無需人工配置。要偵測是否發生了 redirect 動作,只要檢查 Response 的 URL 和 Request 的 URL 是否一致就可以了。

import urllib2  
my_url = 'http://www.google.cn'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected  
  
my_url = 'http://rrurl.cn/b1UZuP'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected

如果不想自動 redirect,除了使用更較低層次的 httplib 函式庫之外,還可以自訂HTTPRedirectHandler 類別。

import urllib2  
class RedirectHandler(urllib2.HTTPRedirectHandler):  
    def http_error_301(self, req, fp, code, msg, headers):  
        print "301"  
        pass  
    def http_error_302(self, req, fp, code, msg, headers):  
        print "303"  
        pass  
  
opener = urllib2.build_opener(RedirectHandler)  
opener.open('http://rrurl.cn/b1UZuP')

5.Cookie

urllib2 對 Cookie 的處理也是自動的。如果需要得到某個Cookie 項目的值,可以這麼做:

import urllib2  
import cookielib  
cookie = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))  
response = opener.open('http://www.baidu.com')  
for item in cookie:  
    print 'Name = '+item.name  
    print 'Value = '+item.value

運行之後就會輸出訪問百度的Cookie值:

[Python]網路爬蟲(五):urllib2的使用細節與抓站技巧

6.使用HTTP 的PUT 和DELETE 方法

url和POST 方法,如果要使用HTTP PUT 和DELETE ,只能使用比較低層的httplib 函式庫。雖然如此,我們還是能透過下面的方式,讓urllib2 能夠發出PUT 或DELETE 的請求:

import urllib2  
request = urllib2.Request(uri, data=data)  
request.get_method = lambda: 'PUT' # or 'DELETE'  
response = urllib2.urlopen(request)

7.得到HTTP 的回傳碼

對於200 OK 來說,只要使用urlopen 傳回的response 物件的getcode()方法就可以得到HTTP 的回傳碼。但對其它回傳碼來說,urlopen 會拋出例外。這時候,就要檢查異常物件的code 屬性了:

import urllib2  
try:  
    response = urllib2.urlopen('http://bbs.csdn.net/why')  
except urllib2.HTTPError, e:  
    print e.code

8.Debug Log

使用urllib2 時,可以透過下面的方法把debug Log 打開,這樣收發包的內容就會在螢幕上列印出來,方便調試,有時可以省去抓包的工作

import urllib2  
httpHandler = urllib2.HTTPHandler(debuglevel=1)  
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)  
opener = urllib2.build_opener(httpHandler, httpsHandler)  
urllib2.install_opener(opener)  
response = urllib2.urlopen('http://www.google.com')

這樣就可以看到傳輸的資料包內容了:

[Python]網路爬蟲(五):urllib2的使用細節與抓站技巧


9.表單的處理

登入表,表

首先利用工具截取所要填表的內容。
例如我通常用firefox+httpfox外掛來看看自己到底送了什麼包。
以verycd為例,先找到自己發的POST請求,以及POST表單項目。
可以看到verycd的話需要填username,password,continueURI,fk,login_submit這幾項,其中fk是隨機生成的(其實不太隨機,看上去像是把epoch時間經過簡單的編碼生成的),需要從網頁獲取,也就是說先訪問一次網頁,用正規表示式等工具截取返回資料中的fk項。 continueURI顧名思義可以隨便寫,login_submit是固定的,這從原始碼可以看出。還有username,password那就很顯然了:

# -*- coding: utf-8 -*-  
import urllib  
import urllib2  
postdata=urllib.urlencode({  
    'username':'汪小光',  
    'password':'why888',  
    'continueURI':'http://www.verycd.com/',  
    'fk':'',  
    'login_submit':'登录'  
})  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin',  
    data = postdata  
)  
result = urllib2.urlopen(req)  
print result.read()

10.偽裝成瀏覽器訪問
某些網站反感爬蟲的到訪,於是對爬蟲一律拒絕請求
這時候我們需要偽裝成瀏覽器,這可以通過修改http包中的header來實現

#…  
  
headers = {  
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  
}  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',  
    data = postdata,  
    headers = headers  
)  
#...

11.對付"反盜鏈"
某些站點有所謂的反盜鏈設置,其實說穿了很簡單,


就是檢查你發送請求的header裡面,referer網站是不是他自己,

所以我們只需要像把headers的referer改成該網站即可,以cnbeta為例:

#...
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}
#...


headers是一個dict資料結構,你可以放入任何想要的header,來做一些偽裝。

例如,有些網站喜歡讀header中的X-Forwarded-For來看看人家的真實IP,可以直接把X-Forwarde-For改了。

以上就是 [Python]網路爬蟲(五):urllib2的使用細節與抓站技巧的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在Python數組中存儲哪些數據類型?可以在Python數組中存儲哪些數據類型?Apr 27, 2025 am 12:11 AM

pythonlistscanStoryDatatepe,ArrayModulearRaysStoreOneType,and numpyArraySareSareAraysareSareAraysareSareComputations.1)列出sareversArversAtileButlessMemory-Felide.2)arraymoduleareareMogeMogeNareSaremogeNormogeNoreSoustAta.3)

如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?Apr 27, 2025 am 12:10 AM

WhenyouattempttostoreavalueofthewrongdatatypeinaPythonarray,you'llencounteraTypeError.Thisisduetothearraymodule'sstricttypeenforcement,whichrequiresallelementstobeofthesametypeasspecifiedbythetypecode.Forperformancereasons,arraysaremoreefficientthanl

Python標準庫的哪一部分是:列表或數組?Python標準庫的哪一部分是:列表或數組?Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

您應該檢查腳本是否使用錯誤的Python版本執行?您應該檢查腳本是否使用錯誤的Python版本執行?Apr 27, 2025 am 12:01 AM

ThescriptisrunningwiththewrongPythonversionduetoincorrectdefaultinterpretersettings.Tofixthis:1)CheckthedefaultPythonversionusingpython--versionorpython3--version.2)Usevirtualenvironmentsbycreatingonewithpython3.9-mvenvmyenv,activatingit,andverifying

在Python陣列上可以執行哪些常見操作?在Python陣列上可以執行哪些常見操作?Apr 26, 2025 am 12:22 AM

Pythonarrayssupportvariousoperations:1)Slicingextractssubsets,2)Appending/Extendingaddselements,3)Insertingplaceselementsatspecificpositions,4)Removingdeleteselements,5)Sorting/Reversingchangesorder,and6)Listcomprehensionscreatenewlistsbasedonexistin

在哪些類型的應用程序中,Numpy數組常用?在哪些類型的應用程序中,Numpy數組常用?Apr 26, 2025 am 12:13 AM

NumPyarraysareessentialforapplicationsrequiringefficientnumericalcomputationsanddatamanipulation.Theyarecrucialindatascience,machinelearning,physics,engineering,andfinanceduetotheirabilitytohandlelarge-scaledataefficiently.Forexample,infinancialanaly

您什麼時候選擇在Python中的列表上使用數組?您什麼時候選擇在Python中的列表上使用數組?Apr 26, 2025 am 12:12 AM

useanArray.ArarayoveralistinpythonwhendeAlingwithHomoGeneData,performance-Caliticalcode,orinterfacingwithccode.1)同質性data:arraysSaveMemorywithTypedElements.2)績效code-performance-calitialcode-calliginal-clitical-clitical-calligation-Critical-Code:Arraysofferferbetterperbetterperperformanceformanceformancefornallancefornalumericalical.3)

所有列表操作是否由數組支持,反之亦然?為什麼或為什麼不呢?所有列表操作是否由數組支持,反之亦然?為什麼或為什麼不呢?Apr 26, 2025 am 12:05 AM

不,notalllistoperationsareSupportedByArrays,andviceversa.1)arraysdonotsupportdynamicoperationslikeappendorinsertwithoutresizing,wheremactsperformance.2)listssdonotguaranteeconecontanttanttanttanttanttanttanttanttanttimecomplecomecomplecomecomecomecomecomecomplecomectacccesslectaccesslecrectaccesslerikearraysodo。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具