爬虫之祖urlib 简易教程
目錄
一、前言框架
二、網(wǎng)址請求
2.1 打開網(wǎng)址
2.2 超時設置
2.3 錯誤抓取
三、更深請求
3.1 打開網(wǎng)址
3.2 請求頭添加
3.3 鏈接解析
四、Robots 協(xié)議
? ? ? ? ?五.萬能視頻下載?
? ? ? ? ??小彩蛋
一、前言框架
我們來學一下爬蟲之祖urlib,不管你什么模塊都是起源于該模塊。
urlib庫有幾個模塊,依次如下:
二、網(wǎng)址請求
2.1 打開網(wǎng)址
以請求我自己的博客為例子,我博客鏈接為:
https://blog.csdn.net/qq_25990967/article/details/121366143?spm=1001.2014.3001.5501我們使用urlib庫中的request模塊如下:
import urllib.request response = urllib.request.urlopen('https://blog.csdn.net/qq_25990967/article/details/121366143?spm=1001.2014.3001.5501') print(response.read().decode('utf-8'))#調用 read 方法可以得到返回的網(wǎng)頁內容,打印網(wǎng)頁內容運行結果:
我們接著來看看其它的問題:如何才知道自己請求網(wǎng)址成功?我可不想每次都把他打印出來才看自己成功沒有。
我們使用status函數(shù)來查看,這個單詞就是狀態(tài)的意思,如果返回結果為200就是請求成功,404就是請求失敗的意思。
假設我請求自己博客:
運行:
可以看到是200,代表請求成功了。那么我們來請求一個別的網(wǎng)址呢?比如我們現(xiàn)在來請求國外的facebook:
運行:
不出所料,失敗了,這也沒關系,正常的。?
2.2 超時設置
我們只需要加上timeout參數(shù)即可,為什么我們要用超時設置,因為有些網(wǎng)站我們不能馬上請求進入,有可能是自己網(wǎng)絡原因,也有可能是對方服務器卡頓等原因,因此需要設置一下超過規(guī)定的時間就不去請求了。
舉個例子:我要請求打開github不能超過十秒,如果超過十秒就不請求了。
運行看看:
顯示time out意思就是超時打開錯誤,如果你把請求十秒鐘改為30秒,再去試試能否成功?(畢竟國內上github會卡很正常)?
2.3 錯誤抓取
前面我們遇到了請求超時,就會報錯出一大堆,假如先去判是否請求成功,需要用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('請求超時')運行看看:
三、更深請求
3.1 打開網(wǎng)址
import urllib.request request = urllib.request.Request("https://www.csdn.net/?spm=1011.2124.3001.5359") response=urllib.request.urlopen(request) print(response.read().decode('utf-8'))說一下每一行大概是什么。
運行看看:
3.2 請求頭添加
為什么要添加請求頭,請求頭的作用是模擬瀏覽器去爬取內容,主要是為了被反扒。
有個新詞:反扒?為什么會被反扒?因為有些網(wǎng)站是不允許你去爬取的,但是我們就是需要爬取內容,因此我們使用請求頭來模擬進行。請求頭的添加能幫助我們解決百分之八十的反扒,不用擔心我,后面的反扒技術我都會教大家。
看個例子,我們已爬取CSDN首頁為例子:
大概說一些每一行的例子:
3.3 鏈接解析
我直接以CSDN官網(wǎng)首頁為例子。
1.urlparse
看看打印結果:
分析下結果:
ParseResult這個類型對象,打印了六個部分結果:
scheme是協(xié)議,這里協(xié)議就是https
netloc是域名,域名是啥就步說了吧,自己百度
path是訪問路徑
params就是參數(shù)
query就是查詢條件,一般用作get類型的url
fragment就是描點,用于定位頁面內部下拉位置
所以網(wǎng)址的標準鏈接格式就是:
這些能看懂一個網(wǎng)址什么組成的了吧
2.urlunparse
與第一個對立,他接受的參數(shù)是可迭代對象,對象長度必須是6
結果如下:
這就構造了一個url,當然隨便構造一個url是不能正常訪問的。對比上面的urlparse,一個是拆分url,這個就是構造url。
3.urlsplit
跟urlparse類似,知識返回結果只有五個,params合并到了path中
老規(guī)矩還是以CSDN首頁為例子,看打印結果:
但是呢,SplitResult是元組類型,可以通過索取獲得想要的,不用都打印出來:
from urllib.parse import urlsplit s=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,舉例如下:
根據(jù)前面打印拆分結果,我再給它復原了,運行結果如下,又得到csdn首頁鏈接了
5.urljoin
就是對鏈接的補充合并,自己可以多打印幾個試試
效果如下:
6.urlencode
跟上面的類似,也是用于構造url
例子如下:
結果:
7.parse_qs
from urllib.parse import parse_qs u='name=benxiaohai&age=21' print(parse_qs(u))parse_qs作用就是把得到的get請求參數(shù)字符串轉為字典,這樣便于好看理解。前面都是有序列化,這個就是反無序化。
8.parse_sql
from urllib.parse import parse_qsl u='name=benxiaoh&age=21' print(parse_qsl(u))效果:?
跟上面第七個方法類似,這個就是返回的列表,列表里裝的元組,元組左邊為名,右邊為值
9.quote
這個很常見,我的理解就是把中文轉換為url格式。對中文進行編碼。
10.unquote
from urllib.parse import unquote url='http://www.baidu.com/?wd=%E7%AC%A8%E5%B0%8F%E5%AD%A9' print(unquote(url))它就可以把被編碼后的中文還原。
這個模塊差不多就這些了,學習爬蟲慢慢來,不要一蹴而就。有了這個模塊就可以對url解析和構造了。
四、Robots 協(xié)議
雖然我在教大家爬蟲,但是我還是要聲明一下不要什么都去爬,所以我們來看下哪些可以爬,哪些不可以爬,這就要根據(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: 表示禁止,后面的內容蜘蛛禁止抓取;
allowed :表示允許蜘蛛抓取后面文件的內容;
好家伙,CSDN全部不允許爬,哈哈哈,沒事,適當爬可以的。
五.萬能視頻下載?
一下代碼只能在pycharm里運行!!!
首先介紹一下you-get庫,非常的強大!hhhhhhh
安裝方法:
pip install you_get下載代碼:
import sys from 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()輸出:
?小彩蛋
import sys from you_get import common as you_getwhile True:tar=input(r'請輸入保存地址:')url = input('請輸入視頻網(wǎng)址:')if 'bilibili' in url:sys.argv = ['you_get', '-o', tar, '--format=dash-flv', url]elif 'iqiyi' in url:sys.argv = ['you-get', '-o', tar, '--format=SD', url]elif 'youku' in url:sys.argv = ['you-get', '-o', tar, '--format=mp4hd', url]else:passyou_get.main()print('sucessfull')a = input('是否繼續(xù)?繼續(xù)按1,否則按2:')if a == '2':break print('下載成功!!') 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的爬虫之祖urlib 简易教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARMA模型性质之平稳AR模型得统计性质
- 下一篇: python实例 79,80