利用python爬虫(part2)--urllib.parse模块
學習筆記
文章目錄
- URL地址編碼模塊
- 作用
- 常用的方法
- urllib.parse.utlencode({dict})
- urllib.parse.quote(string)編碼
- urllib.parse.unquote(string)解碼
URL地址編碼模塊
- 模塊
作用
對URL地址中的查詢參數進行編碼。
比如,我們在百度中查詢【垂耳兔】:
可以看到其URL地址(編碼前):
https://www.baidu.com/s?wd=垂耳兔&rsv_spt=1&rsv_iqid=0xe5d979f300027bbc&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&rsv_t=1e54j7VuDW5lTX6%2B7OlhbhlIKUVoVOH%2F2LuYPHgQU46Iab8FfpjQiHRIouHM3DEMCAug&oq=%E5%9E%82%E8%80%B3%E5%85%94&rsv_pq=872089960004898e我們看到了一堆查詢參數,太多了!需要注意的是,這里僅有一部分查詢參數是我們需要的,而有些則是不需要的。一般來說【wd=垂耳兔】這個參數,我們肯定是需要的,因為這個參數包含了我們要查詢的內容。
當我們向網站發起請求時,肯定不能傳遞這樣的URL地址,URL地址需要符合一定的傳輸協議。此時,我們需要對這個URL地址進行編碼,來滿足請求規則。
常用的方法
urllib.parse.utlencode({dict})
我們看到urllib.parse utlencode()方法的參數中有一個字典,這個字典里可以放查詢參數。
比如,我們可以設置參數為如下字典:
{'wd':'垂耳兔'}urllib.parse utlencode()方法可以對字典中的查詢參數進行編碼,將其轉換成滿足請求規則的URL地址。
舉個例子
我們設置查詢參數,在百度搜索上查詢【垂耳兔】:
from urllib import request from urllib import parseurl = 'http://www.baidu.com/s?' headers = {'User-Agent':'Mozilla/5.0'}query_string = parse.urlencode({'wd':'垂耳兔'}) url_com = url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8') print(html)部分結果:
<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="utf-8"><title>百度安全驗證</title>可以看到,百度返回信息,需要我們進行驗證,嚶嚶嚶,可能是我被百度識破了偽裝。哎…不管怎樣,我們先試著驗證一下,再看看有沒有拿到查詢結果:
嗯,驗證后的確拿到了查詢結果:
接下來,我們可以在百度中不停的翻頁,查看不同頁面中的url有什么變化,從而判斷各個查詢參數有什么作用.
我們發現,當我們翻頁到第2頁時,pn參數變為10,當我們翻頁到第3頁時,pn參數變為20:
由此,我們發現,pn參數應該可以控制頁數。
現在我們再敲一段代碼,設置pn查詢參數值為20,來指定查詢結果頁數:
from urllib import request from urllib import parsemy_url = 'http://www.baidu.com/s?' headers = {'User-Agent':'Mozilla/5.0'} query_string_dict = {'wd':'垂耳兔','pn': 20}query_string = parse.urlencode(query_string_dict) url_com = my_url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8') print(html)部分結果:
<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="utf-8"><title>百度安全驗證</title>沒錯,又需要驗證,才能獲取網頁,這個問題,我們之后再解決,現在為了學查詢參數這個知識點,我先忍著。
驗證后獲取的網頁:
可以看到,我們成功獲取了第3頁的查詢結果。
需要注意的是,我們看到URL中各個查詢參數之間都是通過【&】進行拼接的,我們在代碼中不手動添加【&】真的可以嗎?答案是可以的,在用urllib.parse utlencode()方法進行編碼時,它會自動的在各個查詢參數之間添加【&】,我們來驗證一下:
query_string_dict = {'wd':'垂耳兔','pn': 20}query_string = parse.urlencode(query_string_dict) print(query_string)結果:
wd=%E5%9E%82%E8%80%B3%E5%85%94&pn=20- 案例
在這個案例中,我們要將查詢結果存在一個HTML文件中。為了避免,通過程序向百度發送請求,結果要驗證的尷尬情景,我們換一個搜索引擎,爬取查詢結果,那么就用搜狗吧!
我們首先在瀏覽器中查詢【垂耳兔】:
我們看到,貌似需要用到query查詢參數。
我們在瀏覽器中翻到第3頁:
可以看到,page查詢參數變為了3,由此我們判斷,這個page參數可以控制頁數。
接下來,我們通過程序來查詢【垂耳兔】,并查看第3頁的查詢結果:
from urllib import request from urllib import parsemy_url = 'https://www.sogou.com/web?' headers = {'User-Agent':'Mozilla/5.0'} query_string_dict = {'query':'垂耳兔','page':3}query_string = parse.urlencode(query_string_dict) url_com = my_url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8') print(html)部分結果:
<div class="str_info_div"><p class="str_info"><span class="str-c-txt blue-color" style ="display:none" id="sogou_vr_30000909_pink_1"><strong>[</strong><i>圖文</i><strong>]</strong></span> <em><!--red_beg-->垂耳兔<!--red_end--></em>是寵物兔中非常流行的品種,它最大的特點就是有著一對垂著的耳朵。其可愛萌萌的樣子實在讓人忍不住想要馬上把它抱回家飼養。在飼養<em><!--red_beg-->垂耳兔<!--red_end--></em>之前,了解一些相關知...</p><div class="fb" ><cite id="cacheresult_info_1">太平洋時尚網 - pet.pclady.com.cn/1... - 2016-8-1</cite> - <!--resultsnap_beg--><a target="_blank" style="color: #666666;" href="http://snapshot.sogoucdn.com/websnapshot?ie=utf8&url=http%3A%2F%2Fpet.pclady.com.cn%2F155%2F1554499.html&did=c103019d5b6c85bf-a459bc045d54e056-6e9a7b6e8e4014d44eeae2ab2434a020&k=d03273cdb123cc84b7d5ef1b12c8f90c&encodedQuery=%E5%9E%82%E8%80%B3%E5%85%94&query=%E5%9E%82%E8%80%B3%E5%85%94&&w=01020400&m=0&st=1" id="sogou_snapshot_1"><!--resultsnap_end-->快照</a></div>可以看到,我們的確獲取到了查詢頁面。
接下來我們將查詢到的頁面,用gb18030編碼格式,保存成HTML文件:
#gbk-gb2312-gb18030 with open('ChuiRr.html', 'w', encoding = 'gb18030') as f:f.write(html)我們用Sublime檢查一下,剛剛創建的ChuiEr.html文件:
再用Chrome瀏覽器打開這個HTML文件:
雖然打開了,但是亂碼了~ 這個問題依然留下來,以后解決。
urllib.parse.quote(string)編碼
urllib.parse.quote()方法可以對字符串進行編碼。
舉個例子1
代碼:
from urllib import parsestring = '黑白道奇' print(parse.quote(string))結果:
%E9%BB%91%E7%99%BD%E9%81%93%E5%A5%87舉個例子2
代碼:
from urllib import parsemy_url = 'https://www.sogou.com/web?query={}'word = input('請輸入搜索內容:') query_string = parse.quote(word) print(my_url.format(query_string))控制臺輸出:
urllib.parse.unquote(string)解碼
舉個例子
代碼:
from urllib import parse word = input('請輸入搜索內容:') query_string = parse.quote(word) result = parse.unquote(query_string) print(result)結果:
總結
以上是生活随笔為你收集整理的利用python爬虫(part2)--urllib.parse模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手挂榜是什么意思(快手创作者服务平台)
- 下一篇: 利用python爬虫(part3)--正