自主学习:01爬取网易云评论
爬取网易云评论
我们用pycharm来完成这个代码,因为我不太熟悉,用Jupiter写的话经常报错,我受不了看到我编译了十几次还报错。
实现过程:
1、下载selenium包
这次的程序涉及到一个selenium包,这是一个Web自动化工具。
下载selenium包
- 如果用jupyter写的话,打开cmd,输入命令conda install selenium
- 如果用pycharm写的话,用cmd打开Python36\Scripts,输入命令pip install selenium
验证下载:
打开cmd,在python的环境下输入from selenium import webdriver,没有报错的话就是完成啦!
2、下载Chromedriver
我用的是谷歌浏览器,要下载对应的Chromedriver。
下载方法:
1)在谷歌浏览器中输入chrome://version/ 找到对应的版本,我的是97.0.4692.71 (正式版本) (64 位)。
2)在网址:http://chromedriver.storage.googleapis.com/index.html ,中找到自己对应的版本下载,不知道为什么没有Win64位的,所以我下载了32位的。
3)把下载下来的chromedriver.exe文件,放到python的根目录里(就是/python下) + 放到谷歌浏览器图标所在的目录里。
4)配置路径,复制谷歌根目录的路径,放到Windows系统环境变量中:
打开开始菜单->我的电脑→属性→高级系统设置→环境变量→系统变量→Path→编辑→新建
层层确定返回。
然后我们写代码验证一下,这里是框架:
from selenium import webdriver
# 1、创建一个浏览器对象
driver = webdriver.Chrome()
# 2、请求页面
driver.get('https://www.baidu.com/')
input('程序阻塞')
# 3、退出浏览器
driver.quit()
输出结果:
就完成啦!!!
3、获取数据
我要爬取的是网易云音乐成都,我们把网址复制过来。
运行,打开,没有问题,这里多加了隐式等待和最大化窗口。
# 隐式等待,浏览器渲染页面,智能化的等待
driver.implicitly_wait(10)
# 最大化浏览器
driver.maximize_window()
1)找到标签
网页所选用的方式是嵌套,我们要找到嵌套网页。
在网页上找到评论所对应的标签,通过检查发现是第一个iframe。
早iframe中找到评论对应的div,div的类是“.itm”,就用这个查找
对应的代码:
driver.switch_to.frame(0)
divs = driver.find_elements_by_css_selector('.itm')
2)下拉页面
让网页实现跟鼠标一样,可以向下拉动的效果
这里需要用到js语言来实现,js是一门可以直接运行在浏览器之间的语言
实现代码:
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
driver.execute_script(js)
3)数据获取
我选取的数据是,用户名,评论内容,时间。
分别获取。
其中发现,用户名和评论是在一起的,这里用了一个正则运算来把他们区分开。
有的评论会涉及到换行,这里把换行符改成句号,来取消换行。
实现代码:
cnt = div.find_element_by_css_selector('.cnt.f-brk').text
times = div.find_element_by_css_selector('.time.s-fc4').text
cnt = cnt.replace('\n', '。') # 替换换行符
comment = re.findall(':(.*)', cnt)[0]
name = re.findall('(.*):', cnt)[0]
4、翻页和保存
1)点击翻页
像上面这样,我们可以实现,获取这一页上的评论。
要想让获得每一页上的评论,我们需要让浏览器进行翻页。
找到页面中“下一页”的标签,找到他所有的类是“.znxt”,用click功能来实现翻页。
这里用了一个time模块来控制时间,每隔一秒点击,在程序运行的时候可以看到效果。
用一个循环实现,我们需要点击10次。
实现代码:
for click in range(10):
.............
driver.find_element_by_css_selector('.znxt').click()
time.sleep(1)
2)数据保存
最后把获取的数据写到文件中。
实现代码:
with open('chengdu.txt', mode='a', encoding='utf-8') as f:
f.write(name+';'+comment+';'+times+'\n')
完整代码
# 正则表达式模块,内置模块
import re
import time
from selenium import webdriver
# 1、创建一个浏览器对象
driver = webdriver.Chrome()
# 2、请求页面
driver.get('https://music.163.com/#/song?id=436514312')
# 隐式等待,浏览器渲染页面,智能化的等待
driver.implicitly_wait(10)
driver.maximize_window() # 最大化浏览器
# 网页嵌套,进入嵌套网页
driver.switch_to.frame(0)
# 下拉页面 js是一门可以直接运行在浏览器之间的语言
# document.documentElement.scrollTop 指定页面的高度
# document.documentElement.scrollHeight 获取页面的高度
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
driver.execute_script(js)
for click in range(10):
# 找到这个页面上的对应的部分
divs = driver.find_elements_by_css_selector('.itm')
# print(divs)
# print(len(divs))
for div in divs:
cnt = div.find_element_by_css_selector('.cnt.f-brk').text
times = div.find_element_by_css_selector('.time.s-fc4').text
cnt = cnt.replace('\n', '。') # 替换换行符
comment = re.findall(':(.*)', cnt)[0]
name = re.findall('(.*):', cnt)[0]
# print(name)
# print(comment)
# print(times)
with open('chengdu.txt', mode='a', encoding='utf-8') as f:
f.write(name+';'+comment+';'+times+'\n')
# 找到下一页标签进行点击
driver.find_element_by_css_selector('.znxt').click()
time.sleep(1)
input('已经爬完啦')
# 3、退出浏览器
driver.quit()
最后的结果,可以看到谷歌浏览器打开了歌曲页面,然后放大,然后下拉到最下面,然后1s,1s,的自己翻页。
会生成一个chengdu.txt文件,里面放了每一页上爬下来的信息。
最后的思考
我在实现过程中涉及到的一些程序问题:
如果没有下载对应的谷歌的Chromedriver,会报错:
Message: 'chromedriver' executable needs to be in PATH
涉及到语句:cnt = div.find_element_by_css_selector('.cnt f-brk').text时,报错:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".cnt f-brk"}
(Session info: chrome=97.0.4692.71)
解决办法:把括号里面的空格间隔符替换成英文的“.”
感觉好疲惫,从天亮写到了天黑,涉及到一堆问题。
先是Jupiter里的selenium包有问题,又是浏览器的问题,最后用朋友charm写,发现我的pycharm也过期了重新破解了一下。
因为学习的视频比较古老,有些代码看不清,还有一些版本的问题。
麻了麻了。