網絡爬蟲--6.urllib庫的基本使用(2)

文章目錄

  • 一. urllib.parse.urlencode()和urllib.parse.unquote()
  • 二. Get方式
  • 三. 批量爬取百度貼吧數據
  • 四.POST方式
  • 五.關于CA
  • 六.處理HTTPS請求 SSL證書驗證

一. urllib.parse.urlencode()和urllib.parse.unquote()

編碼工作使用urllib.parse的urlencode()函數,幫我們將key:value這樣的鍵值對轉換成"key=value"這樣的字符串

解碼工作可以使用urllib.parse的unquote()函數。

# IPython3 中的測試結果
In [1]: import urllib.parseIn [2]: word = {"wd" : "傳智播客"}# 通過urllib.urlencode()方法,將字典鍵值對按URL編碼轉換,從而能被web服務器接受。
In [3]: urllib.parse.urlencode(word)  
Out[3]: "wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"# 通過urllib.unquote()方法,把 URL編碼字符串,轉換回原先字符串。
In [4]: print urllib.parse.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2")
wd=傳智播客

二. Get方式

一般HTTP請求提交數據,需要編碼成 URL編碼格式,然后做為url的一部分,或者作為參數傳到Request對象中。

GET請求一般用于我們向服務器獲取數據,比如說,我們用百度搜索傳智播客:https://www.baidu.com/s?wd=傳智播客

瀏覽器的url會跳轉成如圖所示:

在這里插入圖片描述
在其中我們可以看到在請求部分里,http://www.baidu.com/s? 之后出現一個長長的字符串,其中就包含我們要查詢的關鍵詞傳智播客,于是我們可以嘗試用默認的Get方式來發送請求。

import urllib.parse
import urllib.requesturl = "http://www.baidu.com/s"
word = {"wd":"傳智播客"}
# 轉換成url編碼格式(字符串)
word = urllib.parse.urlencode(word)
# url首個分隔符就是 ?
newurl = url + "?" + wordheaders={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}request = urllib.request.Request(newurl, headers=headers)response = urllib.request.urlopen(request)print (response.read())

三. 批量爬取百度貼吧數據

首先我們創建一個python文件,我們要完成的是,輸入一個百度貼吧的地址,比如:

百度貼吧LOL吧第一頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

發現規律了吧,貼吧中每個頁面不同之處,就是url最后的pn的值,其余的都是一樣的,我們可以抓住這個規律。簡單寫一個小爬蟲程序,來爬取百度LOL吧的所有網頁。

  1. 步驟一:先寫一個main,提示用戶輸入要爬取的貼吧名,并用urllib.urlencode()進行轉碼,然后組合url,假設是lol吧,那么組合后的url就是:http://tieba.baidu.com/f?kw=lol

  2. 步驟二:接下來,我們寫一個百度貼吧爬蟲接口,我們需要傳遞3個參數給這個接口, 一個是main里組合的url地址,以及起始頁碼和終止頁碼,表示要爬取頁碼的范圍。

  3. 步驟三:我們已經之前寫出一個爬取一個網頁的代碼。現在,我們可以將它封裝成一個小函數loadPage,供我們使用。

  4. 步驟四:最后如果我們希望將爬取到了每頁的信息存儲在本地磁盤上,我們可以簡單寫一個存儲文件的接口。

import urllibfrom notebook.notebookapp import raw_inputdef tiebaSpider(url, beginPage, endPage):"""作用:負責處理url,分配每個url去發送請求url:需要處理的第一個urlbeginPage: 爬蟲執行的起始頁面endPage: 爬蟲執行的截止頁面"""for page in range(beginPage, endPage + 1):pn = (page - 1) * 50filename = "第" + str(page) + "頁.html"# 組合為完整的 url,并且pn值每次增加50fullurl = url + "&pn=" + str(pn)print(fullurl)# 調用loadPage()發送請求獲取HTML頁面html = loadPage(fullurl, filename)# 將獲取到的HTML頁面寫入本地磁盤文件writeFile(html, filename)def loadPage(url, filename):'''作用:根據url發送請求,獲取服務器響應文件url:需要爬取的url地址filename: 文件名'''print ("正在下載" + filename)headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}request = urllib.request.Request(url, headers = headers)response = urllib.request.urlopen(request)return response.read()def writeFile(html, filename):"""作用:保存服務器響應文件到本地磁盤文件里html: 服務器響應文件filename: 本地磁盤文件名"""print ("正在存儲" + filename)with open(filename, 'wb') as f:f.write(html)print("-" * 20)# 模擬 main 函數
if __name__ == "__main__":kw = raw_input("請輸入需要爬取的貼吧:")# 輸入起始頁和終止頁,str轉成int類型beginPage = int(raw_input("請輸入起始頁:"))endPage = int(raw_input("請輸入終止頁:"))url = "http://tieba.baidu.com/f?"key = urllib.parse.urlencode({"kw" : kw})# 組合后的url示例:http://tieba.baidu.com/f?kw=lolurl = url + keytiebaSpider(url, beginPage, endPage)

輸出結果:

請輸入需要爬取的貼吧:lol
請輸入起始頁:1
請輸入終止頁:3
http://tieba.baidu.com/f?kw=lol&pn=0
正在下載第1.html
正在存儲第1.html
--------------------
http://tieba.baidu.com/f?kw=lol&pn=50
正在下載第2.html
正在存儲第2.html
--------------------
http://tieba.baidu.com/f?kw=lol&pn=100
正在下載第3.html
正在存儲第3.html
--------------------

在這里插入圖片描述

四.POST方式

上面我們說了Request請求對象的里有data參數,它就是用在POST里的,我們要傳送的數據就是這個參數data,data是一個字典,里面要匹配鍵值對。

有道詞典翻譯網站:
輸入測試數據,再通過使用Fiddler觀察,其中有一條是POST請求,而向服務器發送的請求數據并不是在url里,那么我們可以試著模擬這個POST請求。
在這里插入圖片描述
于是,我們可以嘗試用POST方式發送請求。

import urllib.parse
import urllib.request# POST請求的目標URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"headers={"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}formdata = {"type":"AUTO","i":"i love python","doctype":"json","xmlVersion":"1.8","keyfrom":"fanyi.web","ue":"UTF-8","action":"FY_BY_ENTER","typoResult":"true"
}data = urllib.parse.urlencode(formdata)
data = data.encode('utf-8')request = urllib.request.Request(url, data = data, headers = headers)
response = urllib.request.urlopen(request)print ("*" * 100)
print (response.read())
print ("*" * 100)

輸出結果:

****************************************************************************************************
b'                          {"type":"EN2ZH_CN","errorCode":30,"elapsedTime":1,"translateResult":[[{"src":"\xe6\x82\xa8\xe7\x9a\x84\xe8\xaf\xb7\xe6\xb1\x82\xe6\x9d\xa5\xe6\xba\x90\xe9\x9d\x9e\xe6\xb3\x95\xef\xbc\x8c\xe5\x95\x86\xe4\xb8\x9a\xe7\x94\xa8\xe9\x80\x94\xe4\xbd\xbf\xe7\x94\xa8\xe8\xaf\xb7\xe5\x85\xb3\xe6\xb3\xa8\xe6\x9c\x89\xe9\x81\x93\xe7\xbf\xbb\xe8\xaf\x91API\xe5\xae\x98\xe6\x96\xb9\xe7\xbd\x91\xe7\xab\x99\\u201C\xe6\x9c\x89\xe9\x81\x93\xe6\x99\xba\xe4\xba\x91\\u201D: http:\\/\\/ai.youdao.com","tgt":"\xe6\x82\xa8\xe7\x9a\x84\xe8\xaf\xb7\xe6\xb1\x82\xe6\x9d\xa5\xe6\xba\x90\xe9\x9d\x9e\xe6\xb3\x95\xef\xbc\x8c\xe5\x95\x86\xe4\xb8\x9a\xe7\x94\xa8\xe9\x80\x94\xe4\xbd\xbf\xe7\x94\xa8\xe8\xaf\xb7\xe5\x85\xb3\xe6\xb3\xa8\xe6\x9c\x89\xe9\x81\x93\xe7\xbf\xbb\xe8\xaf\x91API\xe5\xae\x98\xe6\x96\xb9\xe7\xbd\x91\xe7\xab\x99\\u201C\xe6\x9c\x89\xe9\x81\x93\xe6\x99\xba\xe4\xba\x91\\u201D: http:\\/\\/ai.youdao.com"}]]}\n'
****************************************************************************************************

五.關于CA

CA(Certificate Authority)是數字證書認證中心的簡稱,是指發放、管理、廢除數字證書的受信任的第三方機構,如北京數字認證股份有限公司、上海市數字證書認證中心有限公司等…

CA的作用是檢查證書持有者身份的合法性,并簽發證書,以防證書被偽造或篡改,以及對證書和密鑰進行管理。

現實生活中可以用身份證來證明身份, 那么在網絡世界里,數字證書就是身份證。和現實生活不同的是,并不是每個上網的用戶都有數字證書的,往往只有當一個人需要證明自己的身份的時候才需要用到數字證書。

普通用戶一般是不需要,因為網站并不關心是誰訪問了網站,現在的網站只關心流量。但是反過來,網站就需要證明自己的身份了。

比如說現在釣魚網站很多的,比如你想訪問的是www.baidu.com,但其實你訪問的是www.daibu.com”,所以在提交自己的隱私信息之前需要驗證一下網站的身份,要求網站出示數字證書。

一般正常的網站都會主動出示自己的數字證書,來確保客戶端和網站服務器之間的通信數據是加密安全的。

六.處理HTTPS請求 SSL證書驗證

現在隨處可見 https 開頭的網站,urllib可以為 HTTPS 請求驗證SSL證書,就像web瀏覽器一樣,如果網站的SSL證書是經過CA認證的,則能夠正常訪問,如:https://www.baidu.com/等,如果SSL證書驗證不通過,或者操作系統不信任服務器的安全證書,會警告用戶證書不受信任。
在這里插入圖片描述
urllib在訪問的時候則會報出SSLError:

import urllib.parse
import urllib.requesturl = "https://www.12306.cn/mormhweb/"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}request = urllib.request.Request(url, headers = headers)response = urllib.request.urlopen(request)print (response.read())

運行結果:

URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>

所以,如果以后遇到這種網站,我們需要單獨處理SSL證書,讓程序忽略SSL證書驗證錯誤,即可正常訪問。

import urllib.parse
import urllib.request
# 1. 導入Python SSL處理模塊
import ssl# 2. 表示忽略未經核實的SSL證書認證
context = ssl._create_unverified_context()url = "https://www.12306.cn/mormhweb/"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}request = urllib.request.Request(url, headers = headers)# 3. 在urlopen()方法里 指明添加 context 參數
response = urllib.request.urlopen(request, context = context)print (response.read().decode())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面向對象語言的技術特點

1.支持類與對象概念的機制 所有面向對象語言都允許用戶動態創建對象&#xff0c;并且可以用指針引用動態創建的對象。允許動態創建對象&#xff0c;就意味著系統必須處理內存管理問題&#xff0c;如果不及時釋放不再需要的對象所占用的內存&#xff0c;動態存儲分配就有可能耗…

INI 文件的操作

在程序中經常要用到設置或者其他少量數據的存盤&#xff0c;以便程序在下一次執行的時候可以使用&#xff0c;比如說保存本次程序執行時窗口的位置、大小、一些用戶設置的數據等等&#xff0c;在 Dos 下編程的時候&#xff0c;我們一般自己產生一個文件&#xff0c;由自己把這些…

摩拜大數據殺熟?官方:老用戶押金的確退款延遲

近日&#xff0c;有媒體曝出摩拜單車一些老用戶出現押金難退現象。有的消費者點擊退款后&#xff0c;系統不斷奔潰&#xff1b;有的申請退款后&#xff0c;賬戶又莫名出現押金&#xff0c;就像未申請一樣&#xff1b;也有人終于提交了退款&#xff0c;等候數日卻遲遲不見到賬。…

Junit Test使用樣例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 配置&#xff1a; 調用類&#xff1a; import java.util.List;import javax.annotation.Resource;import org.apache.shiro.crypto.Rand…

Django congtent types應用

contenttypes 是Django內置的一個應用&#xff0c;可以追蹤項目中所有app和model的對應關系&#xff0c;并記錄在ContentType表中。 每當我們創建了新的model并執行數據庫遷移后&#xff0c;ContentType表中就會自動新增一條記錄。比如我在應用app01的models.py中創建表class E…

網絡爬蟲--7.Handler處理器 和 自定義Opener

文章目錄一. 引言二. 簡單的自定義opener()三. ProxyHandler處理器&#xff08;代理設置&#xff09;四. Cookie1.Cookie原理2.Cookie應用五. cookiejar庫 和 HTTPCookieProcessor處理器1.案例一:獲取Cookie&#xff0c;并保存到CookieJar()對象中2.案例二&#xff1a;利用cook…

如何選擇面向對象語言

開發人員在選擇面向對象語言時&#xff0c;還應該著重考慮以下一些實際因素。 1. 將來能否占主導地位 為了使自己的產品在若干年后仍然具有很強的生命力&#xff0c;人們可能希望采用將來占主導地位的語言編程。 根據目前占有的市場份額&#xff0c;以及專業書刊和學術會議上所…

Unicode編碼及其實現:UTF-16、UTF-8,and more

本文主要討論Unicode的編碼與各種實現&#xff0c;著重討論UTF-16&#xff0c;UTF-8的實現規則&#xff0c;以及Big-endian和Little-Endian的存儲規則。 一、Unicode編碼 Unicode出現之前已經有各種編碼標準&#xff1a;ANSI、ISO8859-1、GB2312、GBK以及BIG-5等。Unicode試圖統…

Apache Tiles的使用 前配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用方法見&#xff1a; http://blog.csdn.net/jiangyu1013/article/details/53161580 1.加maven 依賴&#xff1a; <!-- 頁面布局…

day212223:線程、進程、協程

1、程序工作原理 進程的限制&#xff1a;每一個時刻只能有一個線程來工作。多進程的優點&#xff1a;同時利用多個cpu&#xff0c;能夠同時進行多個操作。缺點&#xff1a;對內存消耗比較高當進程數多于cpu數量的時候會導致不能被調用&#xff0c;進程不是越多越好&#xff0c;…

php課程 8-28 php如何繪制生成顯示圖片

php課程 8-28 php如何繪制生成顯示圖片 一、總結 一句話總結&#xff1a;gd庫輕松解決 1、php圖片操作生成的圖的兩種去向是什么&#xff1f; 一種在頁面直接輸出&#xff0c;一種存進本地磁盤 2、php操作圖片的庫有哪些&#xff1f; PHP: Image Processing and Generation - M…

代碼行技術

用代碼行技術估算軟件規模時&#xff0c;當程序較小時常用的單位是代碼行數&#xff08;LOC&#xff09;&#xff0c;當程序較大時常用的單位是千行代碼數&#xff08;KLOC&#xff09;。 代碼行技術的主要優點是&#xff0c;代碼是所有軟件開發項目都有的“產品”&#xff0c;…

網絡爬蟲--8.編碼趣聞

很久很久以前&#xff0c;有一群人&#xff0c;他們決定用8個可以開合的晶體管來組合成不同的狀態&#xff0c;以表示世界上的萬物。他們看到8個開關狀態是好的&#xff0c;于是他們把這稱為"字節"。 再后來&#xff0c;他們又做了一些可以處理這些字節的機器&#…

科技領域的一分鐘

各位果迷是否能想象在一分鐘之內&#xff0c;科技領域都會發生什么事情&#xff1f;——蘋果平均每分鐘賣出81部 iPad&#xff1b;在 iPhone 4S 發布后的第一個周末&#xff0c;每分鐘賣出925部 iPhone 4S&#xff1b;RIM每分鐘賣出103臺黑莓手機&#xff1b;Amazon每分鐘賣出1…

flavr—超級漂亮的jQuery扁平彈出對話框

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 插件描述&#xff1a;flavr是一個時尚的扁平彈出對話框為您的下一個網站。 flavr是響應設計布局&#xff0c;能夠適應任何屏幕大小。 得…

經緯度之間的距離計算

來自谷歌地圖的計算公式&#xff1a; 通過JAVA的Math類各種方法調用。實現上述公式 private static double EARTH_RADIUS 6378.137;// 單位千米/*** 角度弧度計算公式 rad:(). <br/>* * 360度2π πMath.PI* * x度 x*π/360 弧度* * author chiwei* param d* return* s…

在CentOS7阿里云服務器部署ThinkPHP5,并配置phpstrom實現同步開發(微信小程序及管理員后端)...

小程序和后端同步開發 1.服務器安裝tp5框架&#xff1a; 方法很多比如&#xff1a;github、linux命令直接手動下、composer 都可以&#xff0c;方法很多&#xff0c;百度一下&#xff0c;不再累述 2.這時你會發現怎么都訪問出現不了這個令人舒心的界面&#xff08;ok第一個坑到…

ER圖( 實體聯系圖)

E-R圖也稱實體-聯系圖(Entity Relationship Diagram)&#xff0c;提供了表示實體類型、屬性和聯系的方法&#xff0c;用來描述現實世界的概念模型。 它是描述現實世界概念結構模型的有效方法。是表示概念模型的一種方式&#xff0c;用矩形表示實體型&#xff0c;矩形框內寫明…

網絡爬蟲--9.正則表達式

文章目錄一. 正則表達式1.為什么要學正則表達式2.什么是正則表達式3.正則表達式匹配規則二. Python 的 re 模塊1.re 模塊的一般使用步驟2.compile 函數3.match 方法4.search 方法5.findall 方法6.finditer 方法7.split 方法8.sub 方法9.匹配中文10.貪婪模式與非貪婪模式1&#…

概念模型

將需求分析得到的用戶需求抽象為信息結構&#xff08;即概念模型&#xff09;的過程就是概念結構設計 概念模型的特點 &#xff08;1&#xff09;能真實、充分地反映現實世界&#xff0c;是現實世界的一個真 實模型。 &#xff08;2&#xff09;易于理解&#xff0c;從…