日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫之祖urlib 简易教程

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫之祖urlib 简易教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、前言框架

二、網(wǎng)址請求

2.1 打開網(wǎng)址

2.2 超時(shí)設(shè)置

2.3 錯(cuò)誤抓取

三、更深請求

3.1 打開網(wǎng)址

3.2 請求頭添加

3.3 鏈接解析

四、Robots 協(xié)議

? ? ? ? ?五.萬能視頻下載?

? ? ? ? ??小彩蛋


一、前言框架

我們來學(xué)一下爬蟲之祖urlib,不管你什么模塊都是起源于該模塊。
urlib庫有幾個(gè)模塊,依次如下:

  • request :用于請求網(wǎng)址的模塊
  • error:異常處理模塊
  • parse:用于修改拼接等的模塊
  • robotparser:用來判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬
  • 二、網(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'))#調(diào)用 read 方法可以得到返回的網(wǎng)頁內(nèi)容,打印網(wǎng)頁內(nèi)容

    運(yùn)行結(jié)果:

    我們接著來看看其它的問題:如何才知道自己請求網(wǎng)址成功?我可不想每次都把他打印出來才看自己成功沒有。
    我們使用status函數(shù)來查看,這個(gè)單詞就是狀態(tài)的意思,如果返回結(jié)果為200就是請求成功,404就是請求失敗的意思。
    假設(shè)我請求自己博客:

    import urllib.request response = urllib.request.urlopen('https://blog.csdn.net/qq_25990967/article/details/121366143?spm=1001.2014.3001.5501') print(response.status)

    運(yùn)行:

    可以看到是200,代表請求成功了。那么我們來請求一個(gè)別的網(wǎng)址呢?比如我們現(xiàn)在來請求國外的facebook:

    import urllib.request response = urllib.request.urlopen('https://www.facebook.com/') print(response.status)

    運(yùn)行:

    不出所料,失敗了,這也沒關(guān)系,正常的。?

    2.2 超時(shí)設(shè)置

    我們只需要加上timeout參數(shù)即可,為什么我們要用超時(shí)設(shè)置,因?yàn)橛行┚W(wǎng)站我們不能馬上請求進(jìn)入,有可能是自己網(wǎng)絡(luò)原因,也有可能是對方服務(wù)器卡頓等原因,因此需要設(shè)置一下超過規(guī)定的時(shí)間就不去請求了。
    舉個(gè)例子:我要請求打開github不能超過十秒,如果超過十秒就不請求了。

    import urllib.request response = urllib.request.urlopen('https://github.com/',timeout=10) print(response.status)

    運(yùn)行看看:

    顯示time out意思就是超時(shí)打開錯(cuò)誤,如果你把請求十秒鐘改為30秒,再去試試能否成功?(畢竟國內(nèi)上github會(huì)卡很正常)?

    2.3 錯(cuò)誤抓取

    前面我們遇到了請求超時(shí),就會(huì)報(bào)錯(cuò)出一大堆,假如先去判是否請求成功,需要用try…except來獲取報(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('請求超時(shí)')

    運(yùn)行看看:

    三、更深請求

    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'))

    說一下每一行大概是什么。

  • 第一行導(dǎo)入模塊
  • 第二行用Requests請求網(wǎng)址
  • 第三行再用urlopen打開網(wǎng)址
  • 第四行用read打印內(nèi)容
  • 運(yùn)行看看:

    3.2 請求頭添加

    為什么要添加請求頭,請求頭的作用是模擬瀏覽器去爬取內(nèi)容,主要是為了被反扒。
    有個(gè)新詞:反扒?為什么會(huì)被反扒?因?yàn)橛行┚W(wǎng)站是不允許你去爬取的,但是我們就是需要爬取內(nèi)容,因此我們使用請求頭來模擬進(jìn)行。請求頭的添加能幫助我們解決百分之八十的反扒,不用擔(dān)心我,后面的反扒技術(shù)我都會(huì)教大家。
    看個(gè)例子,我們已爬取CSDN首頁為例子:

    from urllib import request url='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'))

    大概說一些每一行的例子:

  • 第一行從庫導(dǎo)入模塊
  • 第二行就是我們需要請求的網(wǎng)址
  • 第三行就是我們的請求頭,固定這個(gè)模式,不用去背,以后添加請求頭復(fù)制粘貼就行
  • 第四行就是使用請求頭去請求網(wǎng)址
  • 第五行:請求成功打開網(wǎng)址(urlopen翻譯過來就是打開網(wǎng)址的意思啊)
  • 第六行用read打印內(nèi)容
  • 3.3 鏈接解析

    我直接以CSDN官網(wǎng)首頁為例子。
    1.urlparse

    from urllib.parse import urlparse s=urlparse('https://www.csdn.net/?spm=1011.2124.3001.5359')#解析的網(wǎng)址 print(type(s),s)#打印類型和解析結(jié)果

    看看打印結(jié)果:

    分析下結(jié)果:
    ParseResult這個(gè)類型對象,打印了六個(gè)部分結(jié)果:
    scheme是協(xié)議,這里協(xié)議就是https
    netloc是域名,域名是啥就步說了吧,自己百度
    path是訪問路徑
    params就是參數(shù)
    query就是查詢條件,一般用作get類型的url
    fragment就是描點(diǎn),用于定位頁面內(nèi)部下拉位置
    所以網(wǎng)址的標(biāo)準(zhǔn)鏈接格式就是:

    scheme://netloc/path;params?query#fragment

    這些能看懂一個(gè)網(wǎng)址什么組成的了吧
    2.urlunparse
    與第一個(gè)對立,他接受的參數(shù)是可迭代對象,對象長度必須是6

    from urllib.parse import urlunparse data=['http','www.baidu.com','index.com','user','a=7','comment'] print(urlunparse(data))

    結(jié)果如下:

    這就構(gòu)造了一個(gè)url,當(dāng)然隨便構(gòu)造一個(gè)url是不能正常訪問的。對比上面的urlparse,一個(gè)是拆分url,這個(gè)就是構(gòu)造url。
    3.urlsplit
    跟urlparse類似,知識返回結(jié)果只有五個(gè),params合并到了path中

    from urllib.parse import urlsplit s=urlsplit('https://www.csdn.net/?spm=1011.2124.3001.5359') print(type(s),s)

    老規(guī)矩還是以CSDN首頁為例子,看打印結(jié)果:

    但是呢,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])

    這樣打印結(jié)果姐如下:

    4.urlunsplit()
    跟上面那個(gè)方法類似,這個(gè)就是再把各個(gè)部分組合成完整的鏈接,長度必須是5,舉例如下:

    from urllib.parse import urlunsplit data=['http','www.csdn.net','/','spm=1011.2124.3001.5359',' '] print(urlunsplit(data))

    根據(jù)前面打印拆分結(jié)果,我再給它復(fù)原了,運(yùn)行結(jié)果如下,又得到csdn首頁鏈接了

    5.urljoin
    就是對鏈接的補(bǔ)充合并,自己可以多打印幾個(gè)試試

    from urllib.parse import urljoin print(urljoin('http://www.baidu.com','index.html')) print(urljoin('http://www.baidu.com','http://www.baidu.com/index.html'))

    效果如下:

    6.urlencode
    跟上面的類似,也是用于構(gòu)造url
    例子如下:

    from urllib.parse import urlencode parms={'name':'benxiaohai','age':'21' } b_url='http://www.baidu.com?' url=b_url+urlencode(parms) print(url)

    結(jié)果:

    7.parse_qs

    from urllib.parse import parse_qs u='name=benxiaohai&age=21' print(parse_qs(u))

    parse_qs作用就是把得到的get請求參數(shù)字符串轉(zhuǎn)為字典,這樣便于好看理解。前面都是有序列化,這個(gè)就是反無序化。

    8.parse_sql

    from urllib.parse import parse_qsl u='name=benxiaoh&age=21' print(parse_qsl(u))

    效果:?

    跟上面第七個(gè)方法類似,這個(gè)就是返回的列表,列表里裝的元組,元組左邊為名,右邊為值
    9.quote

    from urllib.parse import quote key='笨小孩' url='http://www.baidu.com/?wd='+quote(key) print(url)

    這個(gè)很常見,我的理解就是把中文轉(zhuǎn)換為url格式。對中文進(jìn)行編碼。

    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))

    它就可以把被編碼后的中文還原。

    這個(gè)模塊差不多就這些了,學(xué)習(xí)爬蟲慢慢來,不要一蹴而就。有了這個(gè)模塊就可以對url解析和構(gòu)造了。

    四、Robots 協(xié)議

    雖然我在教大家爬蟲,但是我還是要聲明一下不要什么都去爬,所以我們來看下哪些可以爬,哪些不可以爬,這就要根據(jù)robots協(xié)議了。(當(dāng)然我們可能不會(huì)完全遵守他的協(xié)議,不然爬蟲也沒啥意思了,自己把握分寸)

    首先我們來學(xué)會(huì)一下如何查看協(xié)議,比如我們要訪問CSDM網(wǎng)址:

    https://www.csdn.net/

    查看協(xié)議就是:在網(wǎng)址后面加上robots.txt

    https://www.csdn.net/robots.txt

    輸入回車:

    看看這個(gè)協(xié)議的含義:
    user-agent:后面是蜘蛛的名稱,表示一種代理的意思;
    disallowed: 表示禁止,后面的內(nèi)容蜘蛛禁止抓取;
    allowed :表示允許蜘蛛抓取后面文件的內(nèi)容;

    好家伙,CSDN全部不允許爬,哈哈哈,沒事,適當(dāng)爬可以的。

    五.萬能視頻下載?

    一下代碼只能在pycharm里運(yùn)行!!!

    首先介紹一下you-get庫,非常的強(qiáng)大!hhhhhhh

    安裝方法:

    pip install you_get

    下載代碼:

    import sys from you_get import common as you_get# 導(dǎo)入you-get庫# 設(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()

    輸出:

    ?小彩蛋

    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)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的爬虫之祖urlib 简易教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。