《爬蟲(chóng)100例實(shí)戰(zhàn)案例》又來(lái)了瞒津,昨天兄弟萌看直播了嗎蝉衣,一句話EDG牛掰就完事了括尸。
四強(qiáng)的時(shí)候
T1:我是三冠王
GENG:我是雙冠王
DK:我是去年世界冠軍
EDG:本來(lái)想以第一次進(jìn)四強(qiáng)的身份和你們相處,沒(méi)想到得到的卻是疏遠(yuǎn)病毡。不裝了濒翻!攤牌了!我是今年世界冠軍啦膜!
爬取數(shù)據(jù)目標(biāo)
網(wǎng)站:bilibili
效果展示
工具使用
開(kāi)發(fā)工具:pycharm 開(kāi)發(fā)環(huán)境:python3.7有送, Windows10 使用工具包:requests,threading僧家, csv
重點(diǎn)學(xué)習(xí)內(nèi)容
常見(jiàn)請(qǐng)求頭的反爬
json數(shù)據(jù)的處理
csv文件處理
項(xiàng)目思路解析
找到你需要采集的視頻地址(EDG牛逼H刚!0斯啊U笤)
網(wǎng)址:【S11全球總決賽】決賽 11月6日 EDG vs DK_嗶哩嗶哩bilibili_英雄聯(lián)盟
爬蟲(chóng)采集數(shù)據(jù)首先要找到對(duì)應(yīng)的數(shù)據(jù)目標(biāo)地址,可以明顯看出當(dāng)前的網(wǎng)頁(yè)的評(píng)論數(shù)據(jù)是在不斷變化的肌稻,需要找到對(duì)應(yīng)的評(píng)論接口清蚀,習(xí)慣性的去找動(dòng)態(tài)數(shù)據(jù)。
數(shù)據(jù)并沒(méi)有在動(dòng)態(tài)數(shù)據(jù)里爹谭,清空數(shù)據(jù)加載新的評(píng)論數(shù)據(jù)枷邪,觸發(fā)加載條件。
加載的數(shù)據(jù)在all里诺凡,明確數(shù)據(jù)之后就好處理了东揣,獲取到對(duì)應(yīng)的網(wǎng)頁(yè)接口,通過(guò)requests發(fā)送網(wǎng)絡(luò)請(qǐng)求腹泌。
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=891511588&mode=3&plat=1&_=1636272184444'.format(i)
response = requests.get(url)
print(response.text)
數(shù)據(jù)請(qǐng)求失敗請(qǐng)求頭沒(méi)有做反爬策略 添加對(duì)應(yīng)的ua嘶卧,以及refere 主要是防盜鏈的請(qǐng)求頭措施,在瀏覽器請(qǐng)求也是得不到數(shù)據(jù)的真屯,獲取到準(zhǔn)確的數(shù)據(jù)脸候,提取自己想要的數(shù)據(jù)信息。
評(píng)論的內(nèi)容
評(píng)論的時(shí)間
評(píng)論的作者
作者的性別
作者的個(gè)性簽名
(各位大佬可以根據(jù)自己的需求進(jìn)行自動(dòng)的采集數(shù)據(jù))
處理json數(shù)據(jù)時(shí)要注意绑蔫, json數(shù)據(jù)前有jQuery1720892078778784086_1627994582044 可以通過(guò)正則的方式進(jìn)行匹配提取 這里我選擇修改url的參數(shù) 講網(wǎng)址的jQuery1720892078778784086_1627994582044進(jìn)行刪除 最終的網(wǎng)址是:
<pre>https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=891511588&mode=3&plat=1&_=1636272184444</pre>
獲取到數(shù)據(jù)后進(jìn)行數(shù)據(jù)保存运沦,數(shù)據(jù)保存在csv文件。
def save_data(item):
with open('小破站1.csv', "a", newline='', encoding="utf-8")as f:
filename = ['content', 'ctime', 'sex', 'uname', 'sign']
csv_data = csv.DictWriter(f, fieldnames=filename)
csv_data.writerow(item)
簡(jiǎn)易源碼分享
import requests
import csv
def save_data(item):
with open('EDG牛逼!.csv', 'a', newline='', encoding='utf-8')as f:
filename = ['content', 'uname', 'sign', 'sex']
csv_data = csv.DictWriter(f, fieldnames=filename)
# csv_data.writeheader()
csv_data.writerow(item)
def get_data(url):
headers = {
'referer': 'https://www.bilibili.com/bangumi/play/ss5852/?from=search&seid=6248919601957945511',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
response = requests.get(url, headers=headers).json()
item = {}
for data in response['data']['replies']:
item['content'] = data['content']['message'].strip()
# print(content)
item['uname'] = data['member']['uname']
item['sign'] = data['member']['sign']
item['sex'] = data['member']['sex']
# print(item)
save_data(item)
if __name__ == '__main__':
for i in range(1, 3):
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=891511588&mode=3&plat=1&_=1636272184444'.format(i)
html = get_data(url)
2012配深,一個(gè)卡牌携添,一個(gè)雷恩加爾,一群紅衣少年的歡聲笑語(yǔ)篓叶。
2013烈掠,一個(gè)杰斯羞秤,一個(gè)扎克,一場(chǎng)支離破碎的夢(mèng)境左敌。
2014瘾蛋,一個(gè)螳螂,一個(gè)蘭博矫限,一座搖搖欲墜的基地哺哼。
2015,一個(gè)寡婦叼风,一個(gè)妖姬取董,一本永遠(yuǎn)疊不上去的梅賈竊魂卷。
2016无宿,一個(gè)盲僧茵汰,一個(gè)奧拉夫,一串恥辱的數(shù)字孽鸡。
2017蹂午,一個(gè)克格莫,一個(gè)青鋼影梭灿,一個(gè)賽區(qū)絕境中最后的救贖画侣。
2018,一個(gè)刀妹堡妒,一個(gè)劍魔配乱,一個(gè)至高無(wú)上的尊嚴(yán)。
2019皮迟,一個(gè)泰坦搬泥,一個(gè)盲僧,一個(gè)浴火重生的鳳凰伏尼。
2020忿檩,一個(gè)船長(zhǎng),一個(gè)劍姬爆阶,一個(gè)殺戮無(wú)法彌補(bǔ)的遺憾燥透。
2021,一個(gè)皇子辨图,一個(gè)佐伊班套,一個(gè)挽大廈于將傾的騎士。