本次學習的環境是基於python 3.3.5,實驗的工具是pycharm 5.0.1
基礎的知識我就不再介紹,比如http的基礎知識、爬蟲的相關背景
直接開始爬蟲的學習吧!
常見的urllib2庫在python3.x的版本中改名啦!叫urllib.request了!
urlopen()可以接收三個引數即urlopen(url, data, timeout)
url即你要請求的url位址,data是訪問這個url需要傳送的資料,timeout是超時時間
url是必填引數,其餘兩個是可選引數
urllib.request.urlopen(url)會返回乙個http.client.httpresponse物件
這個返回的物件可以使用read()方法,來返回資料
這樣乙個指令碼就可以讓我們得到所填入的# encoding: utf-8
import urllib.request
response = urllib.request
.urlopen("")
print(response.read())
www.baidu.com
這個**的網頁原始碼,你可以開啟瀏覽器,然後按下f12來對照看是不是一樣
如果我們不呼叫read這個方法,會列印出什麼呢?會列印出下面這樣一行
這樣就直接把這個物件的描述列印出來了,而不是具體內容了
根據我們的習慣,我們應該當傳入乙個request的例項,我們可以改寫上面的**為
這樣也是完全相同的效果,我們必須注意的是庫是區分大小寫的,request寫成request是不能被識別的,會報錯# encoding: utf-8
import urllib.request
request = urllib.request.request("")
response = urllib.request.urlopen(request)
print(response.read())
這樣我們就完成了構建乙個request,然後得到伺服器對請求的應答,這樣更符合直觀的邏輯
需要說明的是,urllib.request.request()是統一處理所有url頭的方法,你可以直接使用也是可以的
web傳遞表單資料的常見方式有post和get兩種方式,我們可以構造乙個表單作為data,然後編碼成標準形式,作為引數傳遞給request物件
值得注意的是,編碼所使用的庫為urllib的函式而不是像之前的程式可以只引用乙個urllib2庫就可以了,python 3.x的版本和和之前的2.x的版本差距還是真大
遇到這個錯誤typeerror: post data should be bytes or an iterable of bytes. it cannot be of type str
時,是需要在url編碼後再使用utf-8進行編碼,否則會出現這個型別錯誤。修改方法是)urllib.parse.urlencode(values).encode(encoding='utf8')
還必須指出的是,在python 2.x中所使用的urllib.urlencode並不存在了,只能使用urllib.parse.urlencode
進行替換
**如下
你需要替換成乙個你可以登入的url位址,就可以進行測試了,或者你可以在本地自己搭建乙個最簡單的cgi指令碼來進行測試# encoding: utf-8
import urllib
import urllib.request
value =
data = urllib.parse.urlencode(value).encode(encoding='utf8')
url = ""
request = urllib.request.request(url , data)
response = urllib.request.urlopen(request)
print(response.read())
上面這個方法是使用post來進行傳遞表單資料時,下面介紹get如何進行表單資料的傳送
python3對文字和二進位制資料作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示,二者不能混用。# encoding: utf-8
import urllib
import urllib.request
value =
data = urllib.parse.urlencode(value).encode(encoding='utf8')
url = ""
geturl = url + "?" + data
request = urllib.request.request(geturl)
response = urllib.request.urlopen(request)
print(response.read())
所以你如果這樣執行的話,必然遇到錯誤typeerror: can't convert 'bytes' object to str implicitly
因為此時的data是byte型的,而url是str型的,兩者不能連線起來的,需要把byte型的data轉換成str型
使用.decode()進行解碼,就能將byte型的data轉換成str型,geturl就統一為str型就可以進行連線了。這樣就可以成功執行了,只不過同上乙個一樣,你需要找乙個能夠成功的 url位址# encoding: utf-8
import urllib
import urllib.request
value =
data = urllib.parse.urlencode(value).encode(encoding='utf8')
url = ""
geturl = url + "?" + data.decode()
request = urllib.request.request(geturl)
response = urllib.request.urlopen(request)
print(response.read())
所以我們修改乙個user-agent作為範例
還可以繼續修改referer,這樣可以反反盜鏈# encoding: utf-8
import urllib
import urllib.request
user_agent = 'mozilla/4.0 (compatible; msie
5.5; windows
nt)'
value =
data = urllib.parse.urlencode(value).encode(encoding='utf8')
headers =
url = ""
request = urllib.request.request(url , data, headers)
response = urllib.request.urlopen(request)
print(response.read())
timeout的設定,如果有的**響應速度過慢,可以通過設定timeout來避免無限制等待響應,之前也說過,urlopen的第三個引數就是timeout,顯式設定即可# encoding: utf-8
import urllib
import urllib.request
user_agent = 'mozilla/4.0 (compatible; msie
5.5; windows
nt)'
value =
data = urllib.parse.urlencode(value).encode(encoding='utf8')
headers =
url = ""
request = urllib.request.request(url , data, headers)
response = urllib.request.urlopen(request)
print(response.read())
有時候不得不使用**伺服器來避免乙個ip訪問請求過多遭到禁止,那麼如何設定**就是一門學問,這裡簡明寫個小例子
# encoding: utf-8
import urllib.request
enable_proxy = true
proxy_handler = urllib.request.proxyhandler()
null_proxy_handler = urllib.request.proxyhandler({})
if enable_proxy:
opener = urllib.request.build_opener(proxy_handler)
else:
opener = urllib.request.build_opener(null_proxy_handler)
urllib.request.install_opener(opener)
Python爬蟲學習稿(三)
一 資料結構 我們必須知道,乙個網頁上存在許多鏈結,並且如果已經爬取過的頁面是不需要再重複進行爬取的,那麼爬蟲就需要判斷,這個頁面是否曾經被爬取過 頁面上的這些鏈結爬取的順序 解決問題一 python自從2.3後提供了一種名為集合 set 的資料結構,和數學上的集合一樣,支援交 並 差等運算,set...
python 爬蟲學習一
爬取目標 為aspx 使用到了 viewstate eventvalidation cookie來驗證。使用beautifulsoup來解析網頁內容。encoding utf 8 from bs4 import beautifulsoup import urllib import urllib2 d...
python爬蟲學習(一)
簡單例子 抓取網頁全部內容後,根據正規表示式,獲取符合條件的字串列表 from urllib import request 正規表示式 import re url 讀取並解碼,針對中文 編碼是encode response request.urlopen url read decode print ...