爬蟲基礎(1):urllib庫
阿新 • • 發佈:2019-06-10
urllib庫
urllib庫是python中的一個基本網路請求庫。用於模擬瀏覽器的行為,向指定伺服器傳送請求,並接收返回的資料。
在python3中所有的網路請求相關函式都集中在urllib.request模組下面
urlopen函式
向伺服器發起請求
urlopen函式的引數
- url 目標地址
- data 如果有這個引數,將變為post請求
- 返回值 http.client.HTTPResponse物件,其中含有下面幾個方法:
- read(size) size為空則讀取所有
- readline() 讀取一行
- readlines() 讀取多行
- getcode() 讀取狀態值
基本的使用:
from urllib import request res = request.urlopen("http://www.baidu.com") print(res.read())
urlretrieve函式
這個函式可以方便的將網頁的一個檔案儲存到本地。
urlretrieve函式的引數
- url 目標地址
- 下載路徑
基本使用
from urllib import request request.urlretrieve("http://www.baidu.com","index.html") #下載百度首頁到index.html
urlencode函式
用於完成url中中文以及特殊字元的編碼和解碼
基本使用:
from urllib import parse
params = {
"name": "張三",
"age": 14,
"地址": "上海市海河大道1544弄3號樓302"
}
res = parse.urlencode(params)
print(res)
執行結果:
age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302
在百度上搜索劉德華
from urllib import request
from urllib import parse
# request.urlopen("http://www.baidu.com/s/?wd=劉德華") #直接這樣請求會報錯
url = "http://www.baidu.com/s/?"
# 定義引數字典
params = {
"wd": "劉德華"
}
# 引數轉碼
qs = parse.urlencode(params)
# url拼接
url += qs
# 傳送請求
res = request.urlopen(url)
print(res.read())
parse_qs函式
將已經編碼的url進行解碼
基本使用
from urllib import parse
qs = "age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302"
res = parse.parse_qs(qs)
print(res)
執行結果
{'name': ['張三'], 'age': ['14'], '地址': ['上海市海河大道1544弄3號樓302']}
urlparse 和 urlsplit函式
用於將url各個部分進行分割
基本使用
from urllib import parse
url = "http://www.baidu.com/s/?wd=python"
res = parse.urlsplit(url)
print(res)
res = parse.urlparse(url)
print(res)
執行結果:
SplitResult(scheme='http', netloc='www.baidu.com', path='/s/', query='wd=python', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/s/', params='', query='wd=python', fragment='')
可以發現兩個結果基本相同,唯一不同的是urlsplit()函式返回結果沒有params屬性
request.Request類
如果需要在請求中新增header資訊,則必須用request.Request類實現
基本使用:
# 通過構造請求頭 獲取拉勾網的招聘資訊
from urllib import request
from urllib import parse
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
"Cookie": "_ga=GA1.2.620765502.1560083999; _gid=GA1.2.758158058.1560083999; user_trace_token=20190609203959-b18d608c-8ab3-11e9-a228-5254005c3644; LGUID=20190609203959-b18d64d3-8ab3-11e9-a228-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAAAIAACBI2C1935D6770E19BC5BE4390354414026; X_HTTP_TOKEN=b6c2ab256a325419948821065120ec66a55a5e4b49; _gat=1; LGSID=20190610090729-1e5547bf-8b1c-11e9-a22c-5254005c3644; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGRID=20190610090729-1e5549e6-8b1c-11e9-a22c-5254005c3644; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560084000,1560090525,1560128850; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560128850; TG-TRACK-CODE=index_search; SEARCH_ID=60cd24c737344a6f98c48dd4fc94c39c"
}
data = {
"first": "true",
"pn": 1,
"kd": "python"
}
req = request.Request(url, headers=headers, data=(
parse.urlencode(data)).encode("utf-8"), method="POST")
resp = request.urlopen(req)
print(resp.read().decode("utf-8"))