感謝參考原文-http://bjbsair.com/2020-03-27/tech-info/7150.html
下面我們進入正題 首先 我們進入斗魚的官網(wǎng)
我發(fā)現(xiàn)首頁是一些推薦的主播,并不全面,不能全部爬取,所以我這里選擇了分類頁
分類頁地址:https://www.douyu.com/directory
這里是斗魚所以的直播分類,我們可以看到所有的分類全部都在這一頁,所以我們只需要把每個分類的地址拿到。
在瀏覽器中按F12,我們看到
每個分類都是由
標簽寫的標簽的class為unit,并且含有鏈接和文本
所有我們只需要
- 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,然后點擊第二頁。
我們看到一個2的文件,點擊進去
我們發(fā)現(xiàn)是這個api給剛剛分類頁面提供的數(shù)據(jù)
所有我們只需要從這個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標簽
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)
我發(fā)現(xiàn)首頁是一些推薦的主播,并不全面,不能全部爬取,所以我這里選擇了分類頁
分類頁地址:https://www.douyu.com/directory
這里是斗魚所以的直播分類,我們可以看到所有的分類全部都在這一頁,所以我們只需要把每個分類的地址拿到。
在瀏覽器中按F12,我們看到
每個分類都是由
標簽寫的標簽的class為unit,并且含有鏈接和文本
所有我們只需要
- 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,然后點擊第二頁。
我們看到一個2的文件,點擊進去
我們發(fā)現(xiàn)是這個api給剛剛分類頁面提供的數(shù)據(jù)
所有我們只需要從這個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標簽
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()