自主学习: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,没有报错的话就是完成啦!

image



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→编辑→新建

层层确定返回。

image


然后我们写代码验证一下,这里是框架:

from selenium import webdriver

# 1、创建一个浏览器对象
driver = webdriver.Chrome()

# 2、请求页面
driver.get('https://www.baidu.com/')

input('程序阻塞')

# 3、退出浏览器
driver.quit()

输出结果:

image

就完成啦!!!



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文件,里面放了每一页上爬下来的信息。

image



最后的思考

我在实现过程中涉及到的一些程序问题:

如果没有下载对应的谷歌的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也过期了重新破解了一下。

因为学习的视频比较古老,有些代码看不清,还有一些版本的问题。

麻了麻了。

posted @ 2022-01-14 14:04  奶酥  阅读(207)  评论(0编辑  收藏  举报