摘要:文章目錄一前言框架二網址請求打開網址超時設置錯誤抓取三更深請求打開網址請求頭添加鏈接解析四協議五萬能視頻下載一前言框架之前我一直沒想教大家,思考萬分,還是要補一下這個教程。對中文進行編碼。
之前我一直沒想教大家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"))#調用 read 方法可以得到返回的網頁內容,打印網頁內容
運行結果:
留個問題:你可否去請求一下別的網址試試?比如你自己的博客?
我們接著來看看其它的問題:如何才知道自己請求網址成功?我可不想每次都把他打印出來才看自己成功沒有。
我們使用status函數來查看,這個單詞就是狀態的意思,如果返回結果為200就是請求成功,404就是請求失敗的意思。
假設我請求自己博客:
import urllib.request response = urllib.request.urlopen("https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343") print(response.status)
運行:
可以看到是200,代表請求成功了。那么我們來請求一個別的網址呢?比如我們現在來請求國外的facebook:
import urllib.request response = urllib.request.urlopen("https://www.facebook.com/") print(response.status)
運行:
驚奇的是我請求成功了,不過我估計你們可能會請求得到404,這也沒關系,正常的。
我們只需要加上timeout參數即可,為什么我們要用超時設置,因為有些網站我們不能馬上請求進入,有可能是自己網絡原因,也有可能是對方服務器卡頓等原因,因此需要設置一下超過規定的時間就不去請求了。
舉個例子:我要請求打開github不能超過十秒,如果超過十秒就不請求了。
import urllib.request response = urllib.request.urlopen("https://github.com/",timeout=10) print(response.status)
運行看看:
顯示time out意思就是超時打開錯誤,如果你把請求十秒鐘改為30秒,再去試試能否成功?(畢竟國內上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"))
說一下每一行大概是什么。
運行看看:
為什么要添加請求頭,請求頭的作用是模擬瀏覽器去爬取內容,主要是為了被反扒。
有個新詞:反扒 為什么會被反扒?因為有些網站是不允許你去爬取的,但是我們就是需要爬取內容,因此我們使用請求頭來模擬進行。請求頭的添加能幫助我們解決百分之八十的反扒,不用擔心我,后面的反扒技術我都會教大家。
看個例子,我們已爬取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官網首頁為例子。
1.urlparse
from urllib.parse import urlparses=urlparse("https://www.csdn.net/?spm=1011.2124.3001.5359")#解析的網址print(type(s),s)#打印類型和解析結果
看看打印結果:
分析下結果:
ParseResult這個類型對象,打印了六個部分結果:
scheme是協議,這里協議就是https
netloc是域名,域名是啥就步說了吧,自己百度
path是訪問路徑
params就是參數
query就是查詢條件,一般用作get類型的url
fragment就是描點,用于定位頁面內部下拉位置
所以網址的標準鏈接格式就是:
scheme://netloc/path;params?query#fragment
這些能看懂一個網址什么組成的了吧
2.urlunparse
與第一個對立,他接受的參數是可迭代對象,對象長度必須是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)
老規矩還是以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))
根據前面打印拆分結果,我再給它復原了,運行結果如下,又得到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請求參數字符串轉為字典,這樣便于好看理解。前面都是有序列化,這個就是反無序化。
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解析和構造了。
雖然我在教大家爬蟲,但是我還是要聲明一下不要什么都去爬,所以我們來看下哪些可以爬,哪些不可以爬,這就要根據robots協議了。(當然我們可能不會完全遵守他的協議,不然爬蟲也沒啥意思了,自己把握分寸)
首先我們來學會一下如何查看協議,比如我們要訪問CSDM網址:
https://www.csdn.net/
查看協議就是:在網址后面加上robots.txt
https://www.csdn.net/robots.txt
輸入回車:
看看這個協議的含義:
user-agent:后面是蜘蛛的名稱,表示一種代理的意思;
disallowed: 表示禁止,后面的內容蜘蛛禁止抓取;
allowed :表示允許蜘蛛抓取后面文件的內容;
好家伙,CSDN全部不允許爬,哈哈哈,沒事,適當爬可以的。
具體我就不說了,這個可以下載幾乎百分之就是的網上和平臺的視頻,自己去嘗試(請悄悄使用)
下載安裝包:
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"# 傳參數sys.argv=["you-get","-o",directory,"--format=flv",url]you_get.main()
效果:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/124797.html
摘要:想辦法區分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態圈完善,是最大對手。最要命的是爬蟲需要經常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:目標很簡單,因為我想要爬一下證券化率,然后可視化輸出結果。證券化率的基礎就是上市公司的總市值,對于證券化率其實還蠻多說法的,比如雪球的這篇文。我們可以利用這個回調函數來顯示當前的下載進度。 寫在前面的叨叨 折騰了這么久,我終于在喝完一聽快樂肥宅水后下定決心來學習寫爬蟲了。目標很簡單,因為我想要爬一下證券化率,然后可視化輸出結果。證券化率的基礎就是上市公司的總市值,對于證券化率其實還蠻多...
摘要:當我們試圖從新浪微博抓取數據時,我們會發現網頁上提示未登錄,無法查看其他用戶的信息。三模擬登錄下面將介紹使用獲取新浪微博,然后使用提交從而實現模擬登錄。 當我們試圖從新浪微博抓取數據時,我們會發現網頁上提示未登錄,無法查看其他用戶的信息。模擬登錄是定向爬蟲制作中一個必須克服的問題,只有這樣才能爬取到更多的內容。 showImg(https://segmentfault.com/img/...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
閱讀 2674·2021-11-24 09:38
閱讀 1985·2019-08-30 15:53
閱讀 1246·2019-08-30 15:44
閱讀 3237·2019-08-30 14:10
閱讀 3587·2019-08-29 16:29
閱讀 1808·2019-08-29 16:23
閱讀 1107·2019-08-29 16:20
閱讀 1476·2019-08-29 11:13