urllib.request用于打開和讀取url,模擬瀏覽器發送一個http請求,并獲取響應結果。
urllib.request.urlopen的語法格式:
urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
參數說明:
- url
url參數是str類型的地址,也就是訪問的url,例如:https://image.baidu.com - data
默認值為None,urllib判斷參數data是否為None從而區分請求方式。或參數data為None,則代表請求方式為Get,反之則為Post。參數data以字典形式存儲數據,并將參數data由字典類型轉換成字節類型完成Post請求。
返回對象
urlopen函數,返回的結果,是一個http.client.HTTPResponse對象
Get方式爬取數據
import urllib.requestresponse=urllib.request.urlopen("https://image.baidu.com")
result=response.read()
print(result)
查看打印的部分內容(因為百度的頁面數據太多了)
b'<!DOCTYPE html>\n<html lang="">\n <head>\n <meta charset=utf-8>\n <meta http-equiv=X-UA-Compatible content="IE=edge">\n <meta name=viewport content="width=device-width,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0">\n <title>\xe5\x9b\xbe\xe6\x90\x9c\xe9\xa6\x96\xe9\xa1\xb5</title>\n
發現titile居然是一堆十六進制的亂碼,只說明我們代碼里還沒有處理字符集,這時候就需要去瀏覽器中打開網址:https://image.baidu.com,查看源代碼的字符集了,發現字符集是“utf-8”
修改代碼重新爬取試試:
import urllib.requestresponse=urllib.request.urlopen("https://image.baidu.com")
result=response.read().decode("utf-8") #decode就是處理編碼格式的
print(result)
輸出的內容這才對:
<!DOCTYPE html>
<html lang=""><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0"><title>圖搜首頁</title>...</head>
</html>
所以呢,總結起來,爬蟲的時候,一定要分析目標頁面的編碼,避免返工改一些無聊的bug,當然程序員防御性編程這無話可說