网易云音乐评论是异步加载且每次请求的参数都是加密处理过,身为一个小白,借鉴网上的解密方法后还是觉得太复杂了,于是就想尝试用selenium来暴力爬取。
- 本文最后以沙漠骆驼为实例爬取
当然,相比解密的爬虫,这个方法更慢,但相对的,不容易被封。
在写方法开始前,把之前的尝试简要说一遍。一开始,我用网页cookies值,headers调用后获取了网易云的评论页面,是个json格式,然后解析后发现参数是一堆我看不懂的字符,在上百次尝试后,我发现,有时候刷出来的数据不是一样的,以及其中的id值。
于是我就想,能不能用一个集合来表示某个网页,每次出现不同开头的id值我就把它加进去,然后访问这个网页,如果不成功,就对这个网页进行重新请求,直到集合元素超过100,也就是爬100页数据,在疯狂请求后,我的ip不幸被封了。
然后查资料才知道这是加密参数。
对于密码学一窍不通的我,在深思熟虑之后选择了selenium。
使用前需要确定安装了selenium和火狐浏览器,相关设置教程请自行百度,我记得好像要把某些火狐的插进放进python库中。
网易云评论在一个frame的大标签内,这是一个用frame隔离开的内容,我们提取内容是需要
driver.switch_to.frame('g_iframe')
否则定位不到里面的内容。
然后我们需要运用
js = "var q=document.documentElement.scrollTop=1000000"
driver.execute_script(js)
来将浏览器拉到最下方,这样才能定位下一页的界面。
在翻页过程中,我用xpath定位了下一页的内容
如果你是用右键来复制xpath的话会定位不到,因为它每次打开翻页的按钮的内容都会变,因此,我们需要用一个死的xpath来定位,这里我自己写了一串xpath,是根据下一页按钮的位置来确定的
driver.find_element_by_xpath('*//div[@class="m-cmmt"]/div[3]/div/a[11]').click()
完整代码:
from selenium import webdriver
import time
js="var q=document.documentElement.scrollTop=1000000"
driver = webdriver.Firefox()
url = 'https://music.163.com/#/song?id=486814412'
driver.get(url)
time.sleep(2)
driver.switch_to.frame('g_iframe')
for i in range(1,100):
print('第'+str(i)+'页')
#html = driver.page_source
texts = driver.find_elements_by_xpath('//div[@class="cnt f-brk"]')
#print(texts)
for text in texts:
artice = text.text.split(':')
with open('骆驼.txt','a',encoding='utf8') as fb:
fb.write(artice[1]+'\n')
print(artice[1])
#time.sleep(0.5)
driver.execute_script(js)
driver.find_element_by_xpath('*//div[@class="m-cmmt"]/div[3]/div/a[11]').click()
time.sleep(0.5)
因为获取到1000页之后好像内容会重复,因为时间问题,我并没有再深入处理。
这里只爬取了前100页。
其中url是你要爬的歌曲页面,这里用沙漠骆驼为例。
最后做成词云:
最后再给两张可不可以的歌词词云:
词云代码不给出,以前的博客有。
有问题欢迎提问,有改进也可以提出。