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