摘要:文章目錄一前言框架二網(wǎng)址請求打開網(wǎng)址超時設置錯誤抓取三更深請求打開網(wǎng)址請求頭添加鏈接解析四協(xié)議五萬能視頻下載一前言框架之前我一直沒想教大家,思考萬分,還是要補一下這個教程。對中文進行編碼。
之前我一直沒想教大家urlib,思考萬分,還是要補一下這個教程。
我們來學一下爬蟲之祖urlib,不管你什么模塊都是起源于該模塊。
urlib庫有幾個模塊,依次如下:
以請求我自己的博客為例子,我博客鏈接為:
https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343
我們使用urlib庫中的request模塊如下:
import urllib.request response = urllib.request.urlopen("https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343") print(response.read().decode("utf-8"))#調(diào)用 read 方法可以得到返回的網(wǎng)頁內(nèi)容,打印網(wǎng)頁內(nèi)容
運行結果:
留個問題:你可否去請求一下別的網(wǎng)址試試?比如你自己的博客?
我們接著來看看其它的問題:如何才知道自己請求網(wǎng)址成功?我可不想每次都把他打印出來才看自己成功沒有。
我們使用status函數(shù)來查看,這個單詞就是狀態(tài)的意思,如果返回結果為200就是請求成功,404就是請求失敗的意思。
假設我請求自己博客:
import urllib.request response = urllib.request.urlopen("https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343") print(response.status)
運行:
可以看到是200,代表請求成功了。那么我們來請求一個別的網(wǎng)址呢?比如我們現(xiàn)在來請求國外的facebook:
import urllib.request response = urllib.request.urlopen("https://www.facebook.com/") print(response.status)
運行:
驚奇的是我請求成功了,不過我估計你們可能會請求得到404,這也沒關系,正常的。
我們只需要加上timeout參數(shù)即可,為什么我們要用超時設置,因為有些網(wǎng)站我們不能馬上請求進入,有可能是自己網(wǎng)絡原因,也有可能是對方服務器卡頓等原因,因此需要設置一下超過規(guī)定的時間就不去請求了。
舉個例子:我要請求打開github不能超過十秒,如果超過十秒就不請求了。
import urllib.request response = urllib.request.urlopen("https://github.com/",timeout=10) print(response.status)
運行看看:
顯示time out意思就是超時打開錯誤,如果你把請求十秒鐘改為30秒,再去試試能否成功?(畢竟國內(nèi)上github會卡很正常)
前面我們遇到了請求超時,就會報錯出一大堆,假如先去判是否請求成功,需要用try…except來獲取報錯信息,具體如下:
import socket import urllib.request import urllib.error try: response = urllib.request.urlopen("https://github.com/", timeout=5) except urllib.error.URLError as e: if isinstance(e.reason, socket.timeout): print("請求超時")
運行看看:
import urllib.requestrequest = urllib.request.Request("https://www.csdn.net/?spm=1011.2124.3001.5359")response=urllib.request.urlopen(request)print(response.read().decode("utf-8"))
說一下每一行大概是什么。
運行看看:
為什么要添加請求頭,請求頭的作用是模擬瀏覽器去爬取內(nèi)容,主要是為了被反扒。
有個新詞:反扒 為什么會被反扒?因為有些網(wǎng)站是不允許你去爬取的,但是我們就是需要爬取內(nèi)容,因此我們使用請求頭來模擬進行。請求頭的添加能幫助我們解決百分之八十的反扒,不用擔心我,后面的反扒技術我都會教大家。
看個例子,我們已爬取CSDN首頁為例子:
from urllib import requesturl="https://www.csdn.net/?spm=1011.2124.3001.5359"headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}req=request.Request(url=url,headers=headers)response=request.urlopen(req)print(response.read().decode("utf-8"))
大概說一些每一行的例子:
我直接以CSDN官網(wǎng)首頁為例子。
1.urlparse
from urllib.parse import urlparses=urlparse("https://www.csdn.net/?spm=1011.2124.3001.5359")#解析的網(wǎng)址print(type(s),s)#打印類型和解析結果
看看打印結果:
分析下結果:
ParseResult這個類型對象,打印了六個部分結果:
scheme是協(xié)議,這里協(xié)議就是https
netloc是域名,域名是啥就步說了吧,自己百度
path是訪問路徑
params就是參數(shù)
query就是查詢條件,一般用作get類型的url
fragment就是描點,用于定位頁面內(nèi)部下拉位置
所以網(wǎng)址的標準鏈接格式就是:
scheme://netloc/path;params?query#fragment
這些能看懂一個網(wǎng)址什么組成的了吧
2.urlunparse
與第一個對立,他接受的參數(shù)是可迭代對象,對象長度必須是6
from urllib.parse import urlunparsedata=["http","www.baidu.com","index.com","user","a=7","comment"]print(urlunparse(data))
結果如下:
這就構造了一個url,當然隨便構造一個url是不能正常訪問的。對比上面的urlparse,一個是拆分url,這個就是構造url。
3.urlsplit
跟urlparse類似,知識返回結果只有五個,params合并到了path中
from urllib.parse import urlsplits=urlsplit("https://www.csdn.net/?spm=1011.2124.3001.5359")print(type(s),s)
老規(guī)矩還是以CSDN首頁為例子,看打印結果:
但是呢,SplitResult是元組類型,可以通過索取獲得想要的,不用都打印出來:
from urllib.parse import urlsplits=urlsplit("https://www.csdn.net/?spm=1011.2124.3001.5359")# print(type(s),s)print(s.path)print(s.netloc)print(s[1])print(s[3])
這樣打印結果姐如下:
4.urlunsplit()
跟上面那個方法類似,這個就是再把各個部分組合成完整的鏈接,長度必須是5,舉例如下:
from urllib.parse import urlunsplitdata=["http","www.csdn.net","/","spm=1011.2124.3001.5359"," "]print(urlunsplit(data))
根據(jù)前面打印拆分結果,我再給它復原了,運行結果如下,又得到csdn首頁鏈接了
5.urljoin
就是對鏈接的補充合并,自己可以多打印幾個試試
from urllib.parse import urljoinprint(urljoin("http://www.baidu.com","index.html"))print(urljoin("http://www.baidu.com","http://www.baidu.com/index.html"))
效果如下:
6.urlencode
跟上面的類似,也是用于構造url
例子如下:
from urllib.parse import urlencodeparms={ "name":"chuan", "age":"20"}b_url="http://www.baidu.com?"url=b_url+urlencode(parms)print(url)
結果:
7.parse_qs
from urllib.parse import parse_qsu="name=chuan&age=20"print(parse_qs(u))
parse_qs作用就是把得到的get請求參數(shù)字符串轉為字典,這樣便于好看理解。前面都是有序列化,這個就是反無序化。
8.parse_sql
from urllib.parse import parse_qslu="name=chuan&age=20"print(parse_qsl(u))
跟上面第七個方法類似,這個就是返回的列表,列表里裝的元組,元組左邊為名,右邊為值
9.quote
from urllib.parse import quotekey="川川"url="http://www.baidu.com/?wd="+quote(key)print(url)
這個很常見,我的理解就是把中文轉換為url格式。對中文進行編碼。
10.unquote
from urllib.parse import unquoteurl="http://www.baidu.com/?wd=%E5%B7%9D%E5%B7%9D"print(unquote(url))
它就可以把被編碼后的中文還原。
這個模塊差不多就這些了,學習爬蟲慢慢來,不要一蹴而就。有了這個模塊就可以對url解析和構造了。
雖然我在教大家爬蟲,但是我還是要聲明一下不要什么都去爬,所以我們來看下哪些可以爬,哪些不可以爬,這就要根據(jù)robots協(xié)議了。(當然我們可能不會完全遵守他的協(xié)議,不然爬蟲也沒啥意思了,自己把握分寸)
首先我們來學會一下如何查看協(xié)議,比如我們要訪問CSDM網(wǎng)址:
https://www.csdn.net/
查看協(xié)議就是:在網(wǎng)址后面加上robots.txt
https://www.csdn.net/robots.txt
輸入回車:
看看這個協(xié)議的含義:
user-agent:后面是蜘蛛的名稱,表示一種代理的意思;
disallowed: 表示禁止,后面的內(nèi)容蜘蛛禁止抓?。?br /> allowed :表示允許蜘蛛抓取后面文件的內(nèi)容;
好家伙,CSDN全部不允許爬,哈哈哈,沒事,適當爬可以的。
具體我就不說了,這個可以下載幾乎百分之就是的網(wǎng)上和平臺的視頻,自己去嘗試(請悄悄使用)
下載安裝包:
pip install you_get
與代碼同級目錄新建一個mp4文件夾。
源代碼如下:
import sysfrom you_get import common as you_get# 導入you-get庫# 設置下載目錄directory=r"mp4//"# 要下載的視頻地址url="https://music.163.com/#/mv?id=14306186"# 傳參數(shù)sys.argv=["you-get","-o",directory,"--format=flv",url]you_get.main()
效果:
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/124797.html
摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態(tài)圈完善,是最大對手。最要命的是爬蟲需要經(jīng)常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網(wǎng)站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務,服務范圍涵蓋社交網(wǎng)絡電子商務分類信息學術研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:目標很簡單,因為我想要爬一下證券化率,然后可視化輸出結果。證券化率的基礎就是上市公司的總市值,對于證券化率其實還蠻多說法的,比如雪球的這篇文。我們可以利用這個回調(diào)函數(shù)來顯示當前的下載進度。 寫在前面的叨叨 折騰了這么久,我終于在喝完一聽快樂肥宅水后下定決心來學習寫爬蟲了。目標很簡單,因為我想要爬一下證券化率,然后可視化輸出結果。證券化率的基礎就是上市公司的總市值,對于證券化率其實還蠻多...
摘要:當我們試圖從新浪微博抓取數(shù)據(jù)時,我們會發(fā)現(xiàn)網(wǎng)頁上提示未登錄,無法查看其他用戶的信息。三模擬登錄下面將介紹使用獲取新浪微博,然后使用提交從而實現(xiàn)模擬登錄。 當我們試圖從新浪微博抓取數(shù)據(jù)時,我們會發(fā)現(xiàn)網(wǎng)頁上提示未登錄,無法查看其他用戶的信息。模擬登錄是定向爬蟲制作中一個必須克服的問題,只有這樣才能爬取到更多的內(nèi)容。 showImg(https://segmentfault.com/img/...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結構、語法...
閱讀 2680·2021-11-24 09:38
閱讀 1991·2019-08-30 15:53
閱讀 1261·2019-08-30 15:44
閱讀 3242·2019-08-30 14:10
閱讀 3594·2019-08-29 16:29
閱讀 1813·2019-08-29 16:23
閱讀 1110·2019-08-29 16:20
閱讀 1482·2019-08-29 11:13