年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了~
思路梳理
进入歌手页可以看到展示了该歌手的「热门50单曲」,通过BeautifulSoup获取到song_id和song_name;
image.png
Notes:
不过这里有一点需要注意,一般像平常我都会选择request或者urllib获取到页面代码,然后通过BeautifulSoup提取我们需要的数据,但去尝试了之后发现歌曲id等都是动态加载的,而像request请求操作都是瞬间完成,并不会等待页面完成加载了再获取页面代码,所以后面便使用了最安全的selenium+BeautifulSoup来获取song_id和song_name。
def get_song_id(url): driver=webdriver.PhantomJS() driver.get(url) time.sleep(2) driver.switch_to_frame('g_iframe') time.sleep(5) web_data = driver.page_source soup=BeautifulSoup(web_data,'lxml') top_50_song=soup.find_all('tr', class_='even ') driver.quit() return top_50_song
有了song_id之后就好做了,之前的文章中已经说过了,每个歌曲的评论是通过一个包含song_id的地址传递的,然后加入多线程分别保存50首歌曲,然后等着被封或者完成就好了
def save_comment(song_id,song_name): url_comment = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_'+str(song_id)+'?csrf_token=' page = get_page(url_comment,song_name) if page == 0: print 'IP地址被封,请稍后再试!!!' else: for i in range(page): try: params = get_params(i); encSecKey = get_encSecKey(); json_text = get_json(url_comment, params, encSecKey) json_dict = json.loads(str(json_text))['comments'] for t in list(range(len(json_dict))): if t == 0: rdata=pd.DataFrame(pd.Series(data=json_dict[t])).T else: rdata=pd.concat([rdata,pd.DataFrame(pd.Series(data=json_dict[t])).T]) if i == 0: commentdata=rdata else: commentdata=pd.concat([commentdata,rdata]) print '***正在保存>>%s<<第%d页***'%(song_name.encode('utf-8'),i+1) time.sleep(random.uniform(0.2,0.5)) path = song_name.encode('utf-8')+'.xlsx' except Exception, e: print 'IP地址被封,%s未保存完全!!!'%song_name.encode('utf-8') commentdata.to_excel(path)
其他部分在上篇文章已经说过了,包括加密部分,可移步 Peace~
作者:Awesome_Tang
链接:https://www.jianshu.com/p/867c5df661cc
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦