Python爬取B站動漫番劇更新資訊,附程式碼和講解過程
阿新 • • 發佈:2020-10-08
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。
目標:爬取b站番劇最近更新
輸出格式:名字+播放量+簡介
那麼開始擼吧~
用到的類庫:
requests:網路請求
pyquery:解析xml文件,像使用jquery一樣簡單哦~
1.分析頁面佈局,找到需要爬取的內容
目標url:
https://bangumi.bilibili.com/22/
設計video類:
import requests from pyquery import PyQuery as pq class Video(object): def __init__(self,name,see,intro): self.name=name self.see=see self.intro=intro def __str__(self): return "{}--{}--{}".format(self.name,self.see,self.intro)
分析完頁面,設取爬去類:
class bilibili(object): host="https://bangumi.bilibili.com" def __init__(self): self.dom=pq(requests.get('https://bangumi.bilibili.com/22/').text) def get_recent(self): '''最近更新''' items=self.dom('#list_bangumi_new .c-list .new .c-item') videos=[] for i in items: name=i.find('.r-i .t').attr('title') link=self.host+i.find('.r-i .t').attr('href') d=pq(requests.get(url=link).text) see=d(".info-count .info-count-item").eq(1).find('em').text() intro=d('.info-row').eq(3).find('.info-desc').text() videos.append(Video(name=name,see=see,intro=intro)) return videos
哎呀,怎麼回事,居然返回為空
這種情況下不要慌,如果程式碼沒有錯誤,那麼一般是由兩種情況造成
沒有選擇到目標,頁面是js動態載入的
我們先試下第一種情況,開啟瀏覽器,f12,將選擇字串複製到console中執行下,我們這就是
$('#list_bangumi_new .c-list .new .c-item')
可以選擇到我們想要的目標,那看來是頁面js動態載入了,那就方便我們了,我們就只要找到它的介面就好了,開啟瀏覽器,f12,在network裡面尋找一下就好了,
url:https://bangumi.bilibili.com/api/timeline_v2_global
這是一個item的資訊,裡面有我們想要的名字資訊,那接下來就是去詳情頁尋找播放量和簡介了,但是詳情頁連結在哪那,剛剛那個接口裡並沒有,我們f12,審查一下元素。
這裡的連結是/anime/6439,剛剛的接口裡並沒有這個資訊啊,那這個資訊應該就是拼接出來的了,關鍵就是6439這個數字了,去剛剛那個介面資訊裡尋找一下,果然找到了一個season_id欄位符合,那麼詳情頁連結就構造如下:
detail_url = "https://bangumi.bilibili.com/anime/{season_id}"
那麼接下來就是去分析詳情頁,爬去我們想要播放量和簡介資訊了,構造爬去程式碼如下:
see = d(".info-count .info-count-item").eq(1).find('em').text() intro = d('.info-desc-wrp').find('.info-desc').text()
那麼最終爬取類關鍵程式碼如下:
class bilibili(object): recent_url = "https://bangumi.bilibili.com/api/timeline_v2_global" # 最近更新 detail_url = "https://bangumi.bilibili.com/anime/{season_id}" def __init__(self): self.dom=pq(requests.get('https://bangumi.bilibili.com/22/').text) def get_recent(self): '''最近更新''' items=json.loads(requests.get(self.recent_url).text)['result'] videos=[] for i in items: name=i['title'] link=self.detail_url.format(season_id=i['season_id']) d=pq(requests.get(url=link).text) see = d(".info-count .info-count-item").eq(1).find('em').text() intro = d('.info-desc-wrp').find('.info-desc').text() videos.append(Video(name=name,see=see,intro=intro)) return videos
執行一下:
很ok,那接下來把它做成命令列~
2.製作命令列版
用到的類庫:
argparse:解析命令列引數
主要程式碼如下:
if __name__ == '__main__': parser=argparse.ArgumentParser() parser.add_argument('--recent',help="get the recent info",action="store_true") parser.add_argument('--num',help="The number of results returned,default show all",type=int,default=0) parser.add_argument('-v','--version',help="show version",action="store_true") args=parser.parse_args() if args.version: print("bilibili 1.0") elif args.recent: b = bilibili() b.get_recent(args.num)
看下效果:
ok,大功告成,接下來大家就自由發揮新增更多的功能吧~:)