網路爬蟲(五):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) # 另一種方式
在Python2.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()
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預設情況下會針對HTTP 3XX返回碼自動進行redirect動作,無需人工配置。
要檢測是否發生了redirect動作,只要檢查一下Resonse的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
6.使用HTTP的PUT和DELETE方法
urllib2只支援HTTP的GET和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')
9.表單的處理
登入必要填表,表單怎麼填?
首先利用工具擷取所要填表的內容。
比如我一般用firefox_httpfox外掛來看看自己到底傳送了些什麼包。
以verycd為例,先找到自己發的POST請求,以及POST表單項。
可以看到verycd的話需要填username,password,continueURL,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-Forwarded-For改了。
相關文章
- 使用python爬蟲抓站的一些技巧總結:進階篇Python爬蟲
- 爬蟲細節總結爬蟲
- 【爬蟲】網頁抓包工具--Charles的使用教程爬蟲網頁
- 網路爬蟲詳細設計方案爬蟲
- Python爬蟲(2):Coursera抓站小結Python爬蟲
- Python 標準庫 urllib2 的使用細節Python
- 網際網路網站的反爬蟲策略淺析網站爬蟲
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- 爬蟲代理IP的使用技巧爬蟲
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架
- 【爬蟲】網頁抓包工具--Fiddler爬蟲網頁
- 網路爬蟲爬蟲
- urllib2實現簡單爬蟲爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 網路爬蟲的原理爬蟲
- 傻傻的網路爬蟲爬蟲
- 全棧 - 8 爬蟲 使用 urllib2 獲取資料全棧爬蟲
- 網路爬蟲之關於爬蟲 http 代理的常見使用方式爬蟲HTTP
- scrapy + mogoDB 網站爬蟲Go網站爬蟲
- 招聘網站爬蟲模板網站爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 簡單的爬蟲:爬取網站內容正文與圖片爬蟲網站
- Python 爬蟲、抓包Python爬蟲
- 網路爬蟲精要爬蟲
- 網路爬蟲示例爬蟲
- 網路爬蟲怎麼使用ip代理爬蟲
- 爬蟲抓取網頁的詳細流程爬蟲網頁
- 爬蟲進階:反反爬蟲技巧爬蟲
- 網路爬蟲的反扒策略爬蟲
- 爬蟲:HTTP請求與HTML解析(爬取某乎網站)爬蟲HTTPHTML網站
- Python使用多程式提高網路爬蟲的爬取速度Python爬蟲
- 爬蟲學習之基於Scrapy的網路爬蟲爬蟲
- 最簡單的網路圖片的爬取 --Pyhon網路爬蟲與資訊獲取爬蟲
- 什麼是Python網路爬蟲?常見的網路爬蟲有哪些?Python爬蟲
- 【0基礎學爬蟲】爬蟲基礎之網路請求庫的使用爬蟲
- 如何使用robots禁止各大搜尋引擎爬蟲爬取網站爬蟲網站
- 網路爬蟲專案爬蟲
- 使用Scrapy構建一個網路爬蟲爬蟲