Python爬蟲獲取斗魚主播信息

感謝參考原文-http://bjbsair.com/2020-03-27/tech-info/7150.html
下面我們進入正題 首先 我們進入斗魚的官網(wǎng)

Python爬蟲實現(xiàn)獲取斗魚主播信息

我發(fā)現(xiàn)首頁是一些推薦的主播,并不全面,不能全部爬取,所以我這里選擇了分類頁

分類頁地址:https://www.douyu.com/directory

這里是斗魚所以的直播分類,我們可以看到所有的分類全部都在這一頁,所以我們只需要把每個分類的地址拿到。

在瀏覽器中按F12,我們看到

Python爬蟲實現(xiàn)獲取斗魚主播信息
Python爬蟲實現(xiàn)獲取斗魚主播信息

每個分類都是由

標簽寫的標簽的class為unit,并且含有鏈接和文本

Python爬蟲實現(xiàn)獲取斗魚主播信息

所有我們只需要

  • def main_wj():
  • r = requests.get("https://www.douyu.com/directory") #從分類目錄讀取所有分類的名字和鏈接地址
  • r.encoding = 'utf-8'
  • soup = BeautifulSoup(r.text, 'html.parser') #美麗湯,用于html更加簡便
  • urls = []
  • names = []
  • for link in soup.select('.unit '): #分類鏈接和名字的 class 是unit
  • urls.append(link.select('a')[0]['href']) #添加鏈接到urls列表
  • names.append(link.select('a')[0].text.strip().replace(":", "")) #添加分類名到names列表,
  • 且替換掉名字中的:,避免后面創(chuàng)建文件夾失敗

就能夠把所有分類(分類名+分類地址)獲取到了

下面我們隨便進入一個分類中

https://www.douyu.com/directory/game/jdqscjzc 我們拉到最下面,發(fā)現(xiàn)是有分頁的

如果是一般的分頁都是 直接在鏈接中改 id ,但是我們點擊第二頁后發(fā)現(xiàn),網(wǎng)頁的地址沒有改變,說明很可能是用JavaScript實現(xiàn)的分頁功能,這怎么辦呢,如果按照之前的方法只能獲取到第一頁。下面我們按F12,選中network-XHR,然后點擊第二頁。

Python爬蟲實現(xiàn)獲取斗魚主播信息

我們看到一個2的文件,點擊進去

Python爬蟲實現(xiàn)獲取斗魚主播信息

我們發(fā)現(xiàn)是這個api給剛剛分類頁面提供的數(shù)據(jù)

Python爬蟲實現(xiàn)獲取斗魚主播信息

所有我們只需要從這個api,就能夠獲取所有的,信息了

https://www.douyu.com/gapi/rkc/directory/2_350/2

我們發(fā)現(xiàn)這個鏈接,就兩個參數(shù),2_350,2,很明顯可能看出,后面的2是第2頁,不信的可以,點擊3驗證一下,那么2_350就是表示分類了,那么還有一個問題需要確定,就是一共有多少頁,現(xiàn)在我們回到第一頁,看源碼,有一個JavaScript標簽

Python爬蟲實現(xiàn)獲取斗魚主播信息

rk_=”2_350”,就是分類 count = “5”,是總頁數(shù),

所以后面我們只需要提取這兩個參數(shù)就行

  • def write_info(a1,a2,name): # a1 分類接口編號 a2 分類頁數(shù) name 分類名
  • os.mkdir("F:\yusheng\"+name) #以分類名創(chuàng)建目錄,F:盤的yusheng文件夾下
  • global num # 初始化全局變量 用于統(tǒng)計主播數(shù)量
  • num = 1
  • for x in range(int(a2[0])): # 循環(huán)寫入每一頁的信息
  • getUrl_wj("/gapi/rkc/directory/" + str(a1[0]) + "/" + str(x + 1), name)
  • print("當前完成分類:"+name)

下面是在每個api分類中提取數(shù)據(jù)就簡單了,只需要用個正則表達式就行了

  • def getUrl_wj(url,name): #接口url ,分類名
  • res = requests.get("https://www.douyu.com"+url)
  • res.encoding = 'utf-8'
  • ze = '"rid":(.?),"rn":".?","uid":.?,"nn":"(.?)"' #rid = 房間號 nn = 主播名
  • s = re.findall(ze, res.text) #獲得主播的房間號 和 名字
  • global num
  • f = open("F:\\yusheng\\"+name+"\\zhubo.txt","a") #以追加的模式打開文件txt文件
  • for x in s:
  • t = list(x)
  • try:
  • f.write(str(t[0])+"\t\t"+str(t[1])+"\t\t"+str(num)+"\n") #寫入信息,防止編碼異常的問題,這里try一下
  • num+=1
  • except UnicodeEncodeError:
  • continue
  • f.close() #關(guān)閉文件

以上就是全部的過程了,仔細的朋友可能會發(fā)現(xiàn)一點不足,這只能獲取在線的。第一次爬取,有不足之處,望見諒,也歡迎大家的批評指正,下面是完整代碼:

from bs4 import BeautifulSoup   #美麗湯 ,可以很好的讀取html標簽,本來想練練這個的,可是后來發(fā)現(xiàn)用到不到,情況特殊  
import requests  
import re  
import os  
def getUrl_wj(url,name):   #接口url ,分類名  
    res = requests.get("https://www.douyu.com"+url)  
    res.encoding = 'utf-8'  
    ze = '"rid":(.*?),"rn":".*?","uid":.*?,"nn":"(.*?)"'    #rid = 房間號   nn = 主播名  
    s = re.findall(ze, res.text)                            #獲得主播的房間號 和 名字  
    global num  
    f = open("F:\\\\yusheng\\\\"+name+"\\\\zhubo.txt","a")  #以追加的模式打開文件txt文件  
    for x in s:  
        t = list(x)  
        try:  
            f.write(str(t[0])+"\t\t"+str(t[1])+"\t\t"+str(num)+"\n")  #寫入信息,防止編碼異常的問題,這里try一下  
            num+=1  
        except UnicodeEncodeError:  
            continue  
    f.close()                                                       #關(guān)閉文件  
def getUrl(url):  
    res = requests.get("https://www.douyu.com" + url)  #向指定某分類頁發(fā)送請求  
    # 通過接收到的數(shù)據(jù),是通過js動態(tài)實現(xiàn)多頁數(shù)據(jù)顯示的  
    # 后來通過查看js文件發(fā)現(xiàn)他調(diào)用了API的接口  
    # /gapi/rkc/directory/"(分類編號)/(分類頁數(shù))  
    # 所以后面只需要分析接口的數(shù)據(jù)就行  
    res.encoding='utf-8'  
    ze = 'PAGE.rk= "(.*?)";'  #指定某個分類的接口編號  
    ze2 = 'count: "(.*?)",'   #指定某個分類的頁數(shù)  
    s = re.findall(ze,res.text)   #通過正則表達式過濾出信息  
    s2 =re.findall(ze2,res.text)  
    return s,s2                 #返回 分類接口編號  和  分類頁數(shù)  
def write_info(a1,a2,name):     # a1 分類接口編號  a2  分類頁數(shù)   name 分類名  
    os.mkdir("F:\\yusheng\\"+name)  #  以分類名創(chuàng)建目錄  
    global num                           #  初始化全局變量 用于統(tǒng)計主播數(shù)量  
    num = 1  
    for x in range(int(a2[0])):          #  循環(huán)寫入每一頁的信息  
        getUrl_wj("/gapi/rkc/directory/" + str(a1[0]) + "/" + str(x + 1), name)  
    print("當前完成分類:"+name)  
def main_wj():  
    r = requests.get("https://www.douyu.com/directory")   #從分類目錄讀取所有分類的名字和鏈接地址  
    r.encoding = 'utf-8'  
    soup = BeautifulSoup(r.text, 'html.parser')           #美麗湯,用于html更加簡便  
    urls = []  
    names = []  
    for link in soup.select('.unit '):                    #分類鏈接和名字的 class 是unit  
        urls.append(link.select('a')[0]['href'])          #添加鏈接到urls列表  
        names.append(link.select('a')[0].text.strip().replace(":", ""))   #添加分類名到names列表,  
        # 且替換掉名字中的:,避免后面創(chuàng)建文件夾失敗  
    for url, name in zip(urls, names):          #循環(huán)遍歷列表 urls 和 names  
        a1, a2 = getUrl(url)  
        write_info(a1, a2, name)  
num = 1           
main_wj()

感謝參考原文-http://bjbsair.com/2020-03-27/tech-info/7150/
下面我們進入正題 首先 我們進入斗魚的官網(wǎng)

Python爬蟲實現(xiàn)獲取斗魚主播信息

我發(fā)現(xiàn)首頁是一些推薦的主播,并不全面,不能全部爬取,所以我這里選擇了分類頁

分類頁地址:https://www.douyu.com/directory

這里是斗魚所以的直播分類,我們可以看到所有的分類全部都在這一頁,所以我們只需要把每個分類的地址拿到。

在瀏覽器中按F12,我們看到

Python爬蟲實現(xiàn)獲取斗魚主播信息
Python爬蟲實現(xiàn)獲取斗魚主播信息

每個分類都是由

標簽寫的標簽的class為unit,并且含有鏈接和文本

Python爬蟲實現(xiàn)獲取斗魚主播信息

所有我們只需要

  • def main_wj():
  • r = requests.get("https://www.douyu.com/directory") #從分類目錄讀取所有分類的名字和鏈接地址
  • r.encoding = 'utf-8'
  • soup = BeautifulSoup(r.text, 'html.parser') #美麗湯,用于html更加簡便
  • urls = []
  • names = []
  • for link in soup.select('.unit '): #分類鏈接和名字的 class 是unit
  • urls.append(link.select('a')[0]['href']) #添加鏈接到urls列表
  • names.append(link.select('a')[0].text.strip().replace(":", "")) #添加分類名到names列表,
  • 且替換掉名字中的:,避免后面創(chuàng)建文件夾失敗

就能夠把所有分類(分類名+分類地址)獲取到了

下面我們隨便進入一個分類中

https://www.douyu.com/directory/game/jdqscjzc 我們拉到最下面,發(fā)現(xiàn)是有分頁的

如果是一般的分頁都是 直接在鏈接中改 id ,但是我們點擊第二頁后發(fā)現(xiàn),網(wǎng)頁的地址沒有改變,說明很可能是用JavaScript實現(xiàn)的分頁功能,這怎么辦呢,如果按照之前的方法只能獲取到第一頁。下面我們按F12,選中network-XHR,然后點擊第二頁。

Python爬蟲實現(xiàn)獲取斗魚主播信息

我們看到一個2的文件,點擊進去

Python爬蟲實現(xiàn)獲取斗魚主播信息

我們發(fā)現(xiàn)是這個api給剛剛分類頁面提供的數(shù)據(jù)

Python爬蟲實現(xiàn)獲取斗魚主播信息

所有我們只需要從這個api,就能夠獲取所有的,信息了

https://www.douyu.com/gapi/rkc/directory/2_350/2

我們發(fā)現(xiàn)這個鏈接,就兩個參數(shù),2_350,2,很明顯可能看出,后面的2是第2頁,不信的可以,點擊3驗證一下,那么2_350就是表示分類了,那么還有一個問題需要確定,就是一共有多少頁,現(xiàn)在我們回到第一頁,看源碼,有一個JavaScript標簽

Python爬蟲實現(xiàn)獲取斗魚主播信息

rk_=”2_350”,就是分類 count = “5”,是總頁數(shù),

所以后面我們只需要提取這兩個參數(shù)就行

  • def write_info(a1,a2,name): # a1 分類接口編號 a2 分類頁數(shù) name 分類名
  • os.mkdir("F:\yusheng\"+name) #以分類名創(chuàng)建目錄,F:盤的yusheng文件夾下
  • global num # 初始化全局變量 用于統(tǒng)計主播數(shù)量
  • num = 1
  • for x in range(int(a2[0])): # 循環(huán)寫入每一頁的信息
  • getUrl_wj("/gapi/rkc/directory/" + str(a1[0]) + "/" + str(x + 1), name)
  • print("當前完成分類:"+name)

下面是在每個api分類中提取數(shù)據(jù)就簡單了,只需要用個正則表達式就行了

  • def getUrl_wj(url,name): #接口url ,分類名
  • res = requests.get("https://www.douyu.com"+url)
  • res.encoding = 'utf-8'
  • ze = '"rid":(.?),"rn":".?","uid":.?,"nn":"(.?)"' #rid = 房間號 nn = 主播名
  • s = re.findall(ze, res.text) #獲得主播的房間號 和 名字
  • global num
  • f = open("F:\\yusheng\\"+name+"\\zhubo.txt","a") #以追加的模式打開文件txt文件
  • for x in s:
  • t = list(x)
  • try:
  • f.write(str(t[0])+"\t\t"+str(t[1])+"\t\t"+str(num)+"\n") #寫入信息,防止編碼異常的問題,這里try一下
  • num+=1
  • except UnicodeEncodeError:
  • continue
  • f.close() #關(guān)閉文件

以上就是全部的過程了,仔細的朋友可能會發(fā)現(xiàn)一點不足,這只能獲取在線的。第一次爬取,有不足之處,望見諒,也歡迎大家的批評指正,下面是完整代碼:

from bs4 import BeautifulSoup   #美麗湯 ,可以很好的讀取html標簽,本來想練練這個的,可是后來發(fā)現(xiàn)用到不到,情況特殊  
import requests  
import re  
import os  
def getUrl_wj(url,name):   #接口url ,分類名  
    res = requests.get("https://www.douyu.com"+url)  
    res.encoding = 'utf-8'  
    ze = '"rid":(.*?),"rn":".*?","uid":.*?,"nn":"(.*?)"'    #rid = 房間號   nn = 主播名  
    s = re.findall(ze, res.text)                            #獲得主播的房間號 和 名字  
    global num  
    f = open("F:\\\\yusheng\\\\"+name+"\\\\zhubo.txt","a")  #以追加的模式打開文件txt文件  
    for x in s:  
        t = list(x)  
        try:  
            f.write(str(t[0])+"\t\t"+str(t[1])+"\t\t"+str(num)+"\n")  #寫入信息,防止編碼異常的問題,這里try一下  
            num+=1  
        except UnicodeEncodeError:  
            continue  
    f.close()                                                       #關(guān)閉文件  
def getUrl(url):  
    res = requests.get("https://www.douyu.com" + url)  #向指定某分類頁發(fā)送請求  
    # 通過接收到的數(shù)據(jù),是通過js動態(tài)實現(xiàn)多頁數(shù)據(jù)顯示的  
    # 后來通過查看js文件發(fā)現(xiàn)他調(diào)用了API的接口  
    # /gapi/rkc/directory/"(分類編號)/(分類頁數(shù))  
    # 所以后面只需要分析接口的數(shù)據(jù)就行  
    res.encoding='utf-8'  
    ze = 'PAGE.rk= "(.*?)";'  #指定某個分類的接口編號  
    ze2 = 'count: "(.*?)",'   #指定某個分類的頁數(shù)  
    s = re.findall(ze,res.text)   #通過正則表達式過濾出信息  
    s2 =re.findall(ze2,res.text)  
    return s,s2                 #返回 分類接口編號  和  分類頁數(shù)  
def write_info(a1,a2,name):     # a1 分類接口編號  a2  分類頁數(shù)   name 分類名  
    os.mkdir("F:\\yusheng\\"+name)  #  以分類名創(chuàng)建目錄  
    global num                           #  初始化全局變量 用于統(tǒng)計主播數(shù)量  
    num = 1  
    for x in range(int(a2[0])):          #  循環(huán)寫入每一頁的信息  
        getUrl_wj("/gapi/rkc/directory/" + str(a1[0]) + "/" + str(x + 1), name)  
    print("當前完成分類:"+name)  
def main_wj():  
    r = requests.get("https://www.douyu.com/directory")   #從分類目錄讀取所有分類的名字和鏈接地址  
    r.encoding = 'utf-8'  
    soup = BeautifulSoup(r.text, 'html.parser')           #美麗湯,用于html更加簡便  
    urls = []  
    names = []  
    for link in soup.select('.unit '):                    #分類鏈接和名字的 class 是unit  
        urls.append(link.select('a')[0]['href'])          #添加鏈接到urls列表  
        names.append(link.select('a')[0].text.strip().replace(":", ""))   #添加分類名到names列表,  
        # 且替換掉名字中的:,避免后面創(chuàng)建文件夾失敗  
    for url, name in zip(urls, names):          #循環(huán)遍歷列表 urls 和 names  
        a1, a2 = getUrl(url)  
        write_info(a1, a2, name)  
num = 1           
main_wj()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容