企业为什么做网站素材,3d建模教程,wordpress 音频播放,重庆是哪个省份的城市文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言
上一关#xff0c;我们认识了cookies和session。 分别学习了它们的用法#xff0c;以及区别。 还做了一个项目#xff1a;带着小… 文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言
上一关我们认识了cookies和session。 分别学习了它们的用法以及区别。 还做了一个项目带着小饼干登录然后在博客中发表评论。
除了上一关所讲的登录问题在爬虫过程中我们还可能会遇到各种各样棘手的问题——
有的网站登录很复杂验证码难以破解比如大名鼎鼎的12306。 有的网站页面交互复杂所使用的技术难以被爬取比如腾讯文档。 还有的网站对URL的加密逻辑很复杂比如第4关爬过的QQ音乐歌曲评论URL的参数变量找起来挺费劲的。
以上这些情况想要攻破这些网站的反爬虫技术会有一些难度。
不过你也不用担心在本关我将为你传授一个终极武器——selenium通过它可以解决以上所有问题。
selenium是什么
selenium是什么呢它是一个强大的Python库。
它可以做什么呢它可以用几行代码控制浏览器做出自动打开、输入、点击等操作就像是有一个真正的用户在操作一样。
来看一小段录屏吧文字在视频面前会显得苍白。 这就是我用selenium写的脚本让浏览器自动打开网页然后输入文字点击提交按钮。这里用到的代码我都会在后面讲到。
这里要表扬一个我之前教过的用户他们公司内网的登录和操作很繁琐登录之后的操作又机械重复他学会了selenium之后就去写了一个Python程序。
他每天上班的第一件事就是打开电脑运行自己写的脚本让浏览器自动打开公司内网完成登录那些重复的工作也紧跟着一起完成。而他自己则是坐在那里悠闲地喝茶。
selenium能控制浏览器这对解决我们刚刚提出的那几个问题有什么帮助呢
首先当你遇到验证码很复杂的网站时selenium允许让人去手动输入验证码然后把剩下的操作交给机器。
而对于那些交互复杂、加密复杂的网站selenium问题简化爬动态网页如爬静态网页一样简单。
什么是动态网页什么又是静态网页呢其实两种网页你都已经接触过了。
第2关教你用html写出的网页就是静态网页。我们使用BeautifulSoup爬取这类型网页因为网页源代码中就包含着网页的所有信息因此网页地址栏的URL就是网页源代码的URL。 后来你开始接触更复杂的网页比如QQ音乐要爬取的数据不在HTML源代码中而是在json中你就不能直接使用网址栏的URL了而需要找到json数据的真实URL。这就是一种动态网页。 不论数据存在哪里浏览器总是在向服务器发起各式各样的请求当这些请求完成后它们会一起组成开发者工具的Elements中所展示的渲染完成的网页源代码。 在遇到页面交互复杂或是URL加密逻辑复杂的情况时selenium就派上了用场它可以真实地打开一个浏览器等待所有数据都加载到Elements中之后再把这个网页当做静态网页爬取就好了。
说了这么多优点使用selenium时当然也有美中不足之处。
由于要真实地运行本地浏览器打开浏览器以及等待网渲染完成需要一些时间selenium的工作不可避免地牺牲了速度和更多资源不过至少不会比人慢。
知道了它的优缺点我们就开始学习如何使用selenium吧。
怎么用
首先和其它所有Python库一样selenium需要安装方法也很简单 使用pip安装。
pip install selenium # Windows电脑安装selenium
pip3 install selenium # Mac电脑安装seleniumselenium的脚本可以控制所有常见浏览器的操作在使用之前需要安装浏览器的驱动。
我推荐的是Chrome浏览器打开下面的链接就可以下载Chrome的安装包了Windows和Mac都有。
https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html
我强烈建议你现在立刻马上就下载它并且在自己的电脑中安装好浏览器驱动因为这个关卡比较特别需要你边学习边在本地环境中运行代码。
这是因为我只能用一些动图为你展示它的运行效果。
由此造成的影响是在学习本关的内容时如果你想更直观地看到浏览器的操作过程就要在本地电脑中运行脚本。
在正式开始知识的讲解之前我想首先让你体验一下selenium脚本程序在你的本地终端运行的效果。因为在学习selenium之初如果能亲自看到浏览器自动弹出后的操作效果对你后续的学习会有很大帮助。
下面的代码就是本节课开头动图的代码。你现在不需要去理解具体的意思等会儿就会学到每一行的用法。
现在只需要把这段代码复制到本地的代码编辑器中运行体验一下你的浏览器为你自动工作的效果。当然前提是你已经安装好了selenium库以及Chrome浏览器驱动。
# 本地Chrome浏览器设置方法
from selenium import webdriver
import timedriver webdriver.Chrome()
driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/)
time.sleep(4)teacher driver.find_element_by_id(teacher)
teacher.send_keys(必须是吴枫呀)
assistant driver.find_element_by_name(assistant)
assistant.send_keys(都喜欢)
time.sleep(1)
button driver.find_element_by_class_name(sub)
time.sleep(1)
button.click()
time.sleep(1)
driver.close()除了看程序运行不如手动打开这个网站看看做一遍和程序中一样的操作URL给你
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
首先引入眼帘的是【你好蜘蛛侠】几个大字一秒之后它会自动跳转到一个新的页面请你输入最喜欢的老师和助教你点击提交之后它又会跳转到Python之禅的中英对照页面。
仔细看你会发现在这个过程中网页URL一直没有变化可见【你好蜘蛛侠】是个动态网页。
体验了selenium之后我们接下来正式开始代码的讲解。
设置浏览器引擎
和以前一样使用一个新的Python库首先要调用它。selenium有点不同除了调用还需要设置浏览器引擎。
# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver webdriver.Chrome() # 设置引擎为Chrome真实地打开一个Chrome浏览器以上就是浏览器的设置方式把Chrome浏览器设置为引擎然后赋值给变量driver。driver是实例化的浏览器在后面你会总是能看到它的影子这也可以理解因为我们要控制这个实例化的浏览器为我们做一些事情。
配置好了浏览器就可以开始让它帮我们干活啦
接下来我们学习selenium的具体用法这个部分的知识讲解都会以你已经见到好几次的【你好蜘蛛侠】这个网站为例
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
我们还是按照爬虫四步来讲解selenium的用法看看selenium如何获取、解析与提取数据。由于本关中提取出的数据都不太复杂直接在终端打印就好不会涉及到储存数据这一步。 获取数据
首先看一下获取数据的代码怎么写吧。
import time# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver webdriver.Chrome() # 设置引擎为Chrome真实地打开一个Chrome浏览器driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 打开网页
time.sleep(1)
driver.close() # 关闭浏览器前面三行代码都是你学过的调用模块并且设置浏览器只有后两行代码是新的。
get(URL)是webdriver的一个方法它的使命是为你打开指定URL的网页。
刚才说过driver在这里是一个实例化的浏览器因此就是通过这个浏览器打开网页。
当一个网页被打开网页中的数据就加载到了浏览器中也就是说数据被我们获取到了。
driver.close()是关闭浏览器驱动每次调用了webdriver之后都要在用完它之后加上一行driver.close()用来关闭它。
就像是每次打开冰箱门把东西放进去之后都要记得关上门使用selenium调用了浏览器之后也要记得关闭浏览器。
把上面的代码复制粘贴在你的本地电脑中运行你可以看到一个浏览器自动启动并为你打开一个网页停留一秒之后浏览器关闭。 下一步我们要让浏览器解析并提取数据然后打印出来让我们看到返回的运行结果。
解析与提取数据
我们在前面花两个关卡学习了使用BeautifulSoup解析网页源代码然后提取其中的数据。
selenium库同样也具备解析数据、提取数据的能力。它和BeautifulSoup的底层原理一致但在一些细节和语法上有所出入。
首先明显的一个不同即是selenium所解析提取的是Elements中的所有数据而BeautifulSoup所解析的则只是Network中第0个请求的响应。
本关开头我说过用selenium把网页打开所有信息就都加载到了Elements那里之后就可以把动态网页用静态网页的方法爬取了。
selenium是如何解析与提取数据的呢我们现在来试试提取【你好蜘蛛侠】网页中label元素的内容吧。 代码我写好了你可以运行看看吧提示如果出现参考代码运行报错请复制后自己修改运行
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timechrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(2) # 等待2秒
label driver.find_element_by_tag_name(label) # 解析网页并提取第一个label标签
print(label.text) # 打印label的文本
driver.close() # 关闭浏览器输出结果
提示吴枫从运行结果中可以看到我们提取出了label提示吴枫/label中的文本提示吴枫。
上面这段代码只有最后几行代码是新增的第11行等待2秒第12行然后解析网页并提取网页中第一个label标签第13行打印label的文本内容。
用time.sleep(3)等待三秒是由于浏览器缓冲加载网页需要耗费一些时间以及我在这个网页中设置了一秒之后才从首页跳转到输入页面所以等待三秒再去解析和提取比较稳妥。
这样来看解析与提取数据在这里其实只用了一行代码
label driver.find_element_by_tag_name(label) # 解析网页并提取第一个label标签中的文字你能否看出是哪部分在做解析哪部分在做提取
先回想下使用BeautifulSoup解析提取数据时首先要把Response对象解析为BeautifulSoup对象然后再从中提取数据。
而在selenium中获取到的网页存在了driver中而后解析与提取是同时做的都是由driver这个实例化的浏览器完成。
所以上个问题的答案是解析数据是由driver自动完成的提取数据是driver的一个方法。
清楚了解析与提取的本质我们接下来详细讲解析数据的方法。
selenium当然不光能通过标签来提取数据还有很多查找和提取元素的方法都是非常直截了当的方法。 你可以看出提取数据的方法都是英文直译的意思。举例给你看看它们的用法请仔细阅读下面代码的注释
# 以下方法都可以从网页中提取出你好蜘蛛侠这段文字find_element_by_tag_name通过元素的名称选择
# 如h1你好蜘蛛侠/h1
# 可以使用find_element_by_tag_name(h1)find_element_by_class_name通过元素的class属性选择
# 如h1 classtitle你好蜘蛛侠/h1
# 可以使用find_element_by_class_name(title)find_element_by_id通过元素的id选择
# 如h1 idtitle你好蜘蛛侠/h1
# 可以使用find_element_by_id(title)find_element_by_name通过元素的name属性选择
# 如h1 namehello你好蜘蛛侠/h1
# 可以使用find_element_by_name(hello)#以下两个方法可以提取出超链接find_element_by_link_text通过链接文本获取超链接
# 如a hrefspidermen.html你好蜘蛛侠/a
# 可以使用find_element_by_link_text(你好蜘蛛侠)find_element_by_partial_link_text通过链接的部分文本获取超链接
# 如a hrefhttps://localprod.pandateacher.com/python-manuscript/hello-spiderman/你好蜘蛛侠/a
# 可以使用find_element_by_partial_link_text(你好)以上就是提取单个元素的方法了。
那么我们提取出的元素是什么类呢这种对象有什么属性和方法呢我们现在就来看看。请阅读下面的代码然后点击运行
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(2) # 等待2秒
label driver.find_element_by_tag_name(label) # 解析网页并提取第一个label标签中的文字
print(type(label)) # 打印label的数据类型
print(label.text) # 打印label的文本
print(label) # 打印label
driver.close() # 关闭浏览器运行结果
class selenium.webdriver.remote.webelement.WebElement
提示吴枫
selenium.webdriver.remote.webelement.WebElement (session6d400c6ad6f0aa4f5a241b4332ea0c4c, element0.9387651316030954-1)运行结果有3行 可见提取出的数据属于WebElement类对象如果直接打印它返回的是一串对它的描述。
而它与BeautifulSoup中的Tag对象类似也有一个属性.text可以把提取出的元素用字符串格式显示。
还想补充的是WebElement类对象与Tag对象类似它也有一个方法可以通过属性名提取属性的值这个方法是.get_attribute()。 我们来举个例子 我们试试通过classteacher定位到上图中标亮的元素然后提取出type这个属性的值text。
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(2) # 等待2秒
label driver.find_element_by_class_name(teacher) # 根据类名找到元素
print(type(label)) # 打印label的数据类型
print(label.get_attribute(type)) # 获取type这个属性的值
driver.close() # 关闭浏览器运行结果
class selenium.webdriver.remote.webelement.WebElement
text因此我们可以总结出selenium解析与提取数据的过程中我们操作的对象转换 刚才我们做的都是提取出网页中的第一个符合要求的数据接下来我们就看看提取多个元素的方法吧。
find_element_by_与BeautifulSoup中的find类似可以提取出网页中第一个符合要求的元素既然BeautifulSoup有提取所有元素的方法find_allselenium也同样有方法。
方法也一样很简单把刚才的element换成复数elements就好了。 我们来试试提取出【你好,蜘蛛侠】的所有label标签中的文字。
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(2) # 等待2秒labels driver.find_elements_by_tag_name(label) # 根据标签名提取所有元素
print(type(labels)) # 打印labels的数据类型
print(labels) # 打印labels
driver.close() # 关闭浏览器运行结果
class list
[selenium.webdriver.remote.webelement.WebElement (session87d373c4e7a09aef4dd31f5940f8cf84, element0.794826797904179-1), selenium.webdriver.remote.webelement.WebElement (session87d373c4e7a09aef4dd31f5940f8cf84, element0.794826797904179-2)]从运行结果可以看到提取出的是一个列表class ‘list’。而列表的内容就是WebElements对象这些符号是对象的描述我们刚才学过需要用.text才能返回它的文本内容。
既然得到了列表就可以和find_all返回的结果类似同样用for循环遍历列表就可以提取出列表中的每一个值了。
那么请你写一下这个代码吧
参考代码
labelsdriver.find_elements_by_tag_name(label)
for i in labels:print(i.text)以上就是selenium的解析与提取数据的方法了。
除了用selenium解析与提取数据还有一种解决方案那就是使用selenium获取网页然后交给BeautifulSoup解析和提取。
接下来我们就看看selenium与BeautifulSoup如何快乐地合作。
我们回顾一下BeautifulSoup的工作方式吧。 BeautifulSoup需要把字符串格式的网页源代码解析为BeautifulSoup对象然后再从中提取数据。
selenium刚好可以获取到渲染完整的网页源代码。
如何获取呢也是使用driver的一个方法page_source。
HTML源代码字符串 driver.page_source 我们现在就来实操一下获取【你好蜘蛛侠】的网页源代码
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(2) # 等待2秒pageSource driver.page_source # 获取完整渲染的网页源代码
print(type(pageSource)) # 打印pageSource的类型
print(pageSource) # 打印pageSource
driver.close() # 关闭浏览器我们成功获取并打印出了网页源代码O(∩_∩)O~~而且它的数据类型是class str。
你还记不记得用requests.get()获取到的是Response对象在交给BeautifulSoup解析之前需要用到.text的方法才能将Response对象的内容以字符串的形式返回。
而使用selenium获取到的网页源代码本身已经是字符串了。 获取到了字符串格式的网页源代码之后就可以用BeautifulSoup解析和提取数据了这是我留给你的一个课后作业。
到这里解析与提取数据的方法就讲解完了。
关于selenium的用法还有什么没有讲呢对就是我们在本关开头演示的功能控制浏览器自动输入文本并且点击提交。 网页URL再给你一次
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
我现在就为你解开这个谜底。
自动操作浏览器
其实要做到上面动图中显示的效果你只需要新学两个方法就好了
.send_keys() # 模拟按键输入自动填写表单
.click() # 点击元素用这两行代码再搭配刚才所讲的解析提取数据的方法就可以完成操作浏览器的效果了。
学到这里我们就可以写下全部代码了这也正是我在开头给你的让你复制到本地运行过的代码。
# 本地Chrome浏览器设置方法
from selenium import webdriver # 从selenium库中调用webdriver模块
import time # 调用time模块
driver webdriver.Chrome() # 设置引擎为Chrome真实地打开一个Chrome浏览器driver.get(https://localprod.pandateacher.com/python-manuscript/hello-spiderman/) # 访问页面
time.sleep(3) # 暂停三秒等待浏览器缓冲teacher driver.find_element_by_id(teacher) # 找到【请输入你喜欢的老师】下面的输入框位置
teacher.send_keys(必须是吴枫呀) # 输入文字
assistant driver.find_element_by_name(assistant) # 找到【请输入你喜欢的助教】下面的输入框位置
assistant.send_keys(都喜欢) # 输入文字
button driver.find_element_by_class_name(sub) # 找到【提交】按钮
button.click() # 点击【提交】按钮
time.sleep(1)
driver.close() # 关闭浏览器由于这个代码的命令都是控制浏览器做一些操作因此终端不会返回任何结果。
你在抄写的时候有没有发现最后的6行代码是两两对应的在每一次输入和点击之前都要先定位到对应的位置查找定位用的方法就是前面学过的解析与提取数据的方法。
比如在输入你喜欢的老师之前首先要在网页源代码中找到输入框的位置方法还是我们之前学过的方法点击开发者工具左上角的小箭头然后把鼠标放在网页的空格处。 从网页源代码可以看出可以根据id“teacher”或者classteacher查找定位到这里。
把提取到的位置信息赋值给teacher然后再用teacher.send_keys()的方法输入你想填到这个空里的文本。
这样就完成了一个完整的操作后面的两个操作方法都是类似的。由此整个代码也就写出来了。
还想补充一个小知识除了输入和点击的两个方法经常配合它们会用到的还有一个方法.clear()用于清除元素的内容。 假如在刚才的空格中已经输入了【蜘蛛侠】如果你想改成【吴枫】就需要先用.clear()清除掉【蜘蛛侠】这几个文字再填写新的文字。
到这里本关知识讲解的部分就全部完成了我们接下来一起做一个项目吧~
每次学到新知识都要及时通过实操练习巩固所学的知识这样才能对知识形成更深的理解和记忆。
实操运用
确认目标
我们这次试试用selenium爬取QQ音乐的歌曲评论我选的歌是《甜甜的》。
https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html
不知道你还有没有印象在第5关学json时爬过QQ音乐的歌曲最新评论我们这次来爬精彩评论两种评论的爬取方法本质是一样的。 现在带你用selenium再做一次之前做过的项目当然不是我偷懒拍脑袋的决定而是经过了深思熟虑因为同一个项目可以做两次甚至可以做很多次。
使用不同的路径到达相同的目的这种学习和训练方法会帮你把知识搞得更加透彻。
确认了目标我们就开始行动吧照旧在写代码之前要先分析思路。
分析过程
依旧按照爬虫的四个步骤来分析。
首先是获取数据
通过第5关的学习你已经知道网页源代码中没有我们想要的评论而是存在了Json中需要通过查看XHR找到每一页评论的Json数据真实URL才能获取到数据。
我们这次是用selenium就不需要花费精力去查找和破解URL了因为通过selenium打开浏览器的操作数据就被加载到elements中了。
获取更多的评论的方法也变得非常简单直接使用selenium控制浏览器点击【点击加载更多】的按钮评论数据自然就都加载到elements中了简直完美 接下来是解析与提取数据
第一种解决思路是使用selenium提取数据的方法。 第二种解决思路是先获取到完整网页源代码然后用BeautifulSoup抓取。这两种方法都能完成解析提取的工作。
最后的存储数据这一步我们跳过不做了直接在终端打印。
梳理清楚了全部过程就可以开始写代码啦
代码实现
首先调用所有需要的模块设置好Chrome浏览器引擎访问网页获取数据。
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库options webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html) # 访问页面然后用selenium的解析提取方法获取歌曲评论并打印。
需要注意的是在获取到网页之后解析与提取之前要加上time.sleep(2)因为网页的加载需要零点几秒的时间保险起见我们等待2秒。
提取数据的时候首先需要知道数据存在了网页的什么位置还是老办法【右键-检查】把鼠标放在歌曲精彩评论那里找到Elements中对应的位置 这里要注意的是这个网页源代码中评论所在的元素中class属性就有好多个而使用selenium时只能用其中一个属性来提取数据。
通过分析网页结构我们选择用class_name与tag_name来提取数据。获取这首歌曲第一页精彩评论的代码就可以写出来了
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html) # 访问页面
time.sleep(2)comments driver.find_element_by_class_name(js_hot_list).find_elements_by_class_name(js_cmt_li) # 使用class_name找到评论
print(len(comments)) # 打印获取到的评论个数
for comment in comments: # 循环sweet comment.find_element_by_tag_name(p) # 找到评论print (评论%s\n ---\n%sweet.text) # 打印评论
driver.close() # 关闭浏览器运行结果
15
评论想起那晚我在你耳边轻轻的的说爱你你一脸害羞的看着我并且点点头你此时此刻的笑像夹心饼干双手捂着嘴而你的脸庞笑的却如此可爱这或许就是恋爱最甜甜的趣事吧 Jay在录制这一首歌的时候就考虑到这歌曲风格甜美是否适合自己以往的演唱但想到这首歌能表达出Jay对学生时代那种单纯感觉的怀念于是造就了现在的经典 那一晚过后我们的每次相约你的眼中只有我望着我的样子眼神中充满满满宠溺我用拥抱给了你一切的回应 我喜欢的样子你都有---评论我想留着西瓜最中间的一勺掺杂着巧克力屑的奶油蛋糕草莓曲奇的第一口双皮奶的最上层偷喝妹妹奶粉的最后一口所有我见过最甜蜜的。却没有甜过有我所有喜欢的样子的你你眼中的只有最喜欢你的我。---评论这首一定是婚礼必备。这首歌里最喜欢的歌词是“啾”告诉我不止我一个人---评论我也超喜欢杰伦这首《甜甜的》从高中听到结婚生子依旧没有改变那种甜甜的旋律---评论第一次实在广告里面听的然后就开始找啊找找的好辛苦啊。。。。一听钟情---评论这首甜甜的 满满的都是中学时代的回忆。 那时候还很懵懂那时候还不懂什么是爱情就是喜欢某个女生 喜欢和她一起的那个时光 午后的操场 六楼的钢琴室 学校周边的街道 … 如今再也回不去了但是这首歌里满满的都是回忆。---评论听到这首歌想起了初中的时候每个人心中都住着那么一个人不是爱也不是喜欢但是每次见到哪怕是提到他的名字就会怦然心动的感觉要怪就怪当时没有提起勇气告诉他也许有些人就是用来怀念的---评论这首歌真的炒鸡炒鸡甜炒鸡甜甜到掉牙好了我要去看书了---评论刘霞你在哪里。我为你跑了很远很远。我知道你喜欢周董希望你能看到。我相信缘分---评论歌如其名如果你有心上人大概会不自主的想到ta吧嘴角一定也是上扬露出笑容因为我喜欢的样子你都有~---评论听到这首歌想起了初中的时候每个人心中都住着那么一个人不是爱是喜欢但是每次见到哪怕是提到她的名字就会怦然心动的感觉要怪就怪当时没有提起勇气告诉她也许有些人就是用来怀念的---评论早晨领份狗粮去上课那句「啾」真的萌爆了以前竟然都没注意过这也是首适合告白的歌---评论又啥都没干听了两小时周杰伦了…---评论明明很煽情却一点都没有腻的感觉这就是周董的实力吧听到广告就觉得很海森大爱---评论如果用周杰伦的歌代表我对感情的认知应该是从情窦初开的简单爱到热恋期的甜甜的俩个人的世界满满的好星晴然而异地恋开始了我们中间隔了一片珊瑚海。最后我选择了退后失去了关于你的轨迹但我承认这一切都是我的错是我搁浅了我们之间的感情。再后来我们失去了联系而一路向北也成了我的单曲循环。---这次提取出了15个评论下一步我们要获取更多评论。点击网页中的【点击加载更多】就会加载出新的15个评论的数据。 这时候写代码的方法就很明朗了首先找到【点击加载更多】在网页源代码中的位置点击它等待源代码加载完成之后就可以把全部30个评论提取出来了。 请你尝试把后面的补全吧
参考代码
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html) # 访问页面
time.sleep(2)loadmoredriver.find_element_by_class_name(comment__show_all).find_element_by_tag_name(a)
loadmore.click()
time.sleep(2)
comments driver.find_element_by_class_name(js_hot_list).find_elements_by_class_name(js_cmt_li)for i in comments:txti.find_element_by_tag_name(p)print(txt.text)成功获取到了两页的评论掌声给你~
如果你还想获取更多评论再加上一个循环和一个条件判断——能否找到点击翻页的选项就可以实现啦。代码我在这里就不写了你可以自己在课后练习练习的目的是学会方法而没有必要真的把上千条评论全部获取到。
刚才用的是第一种解析与提取的方法当然还可以使用第二种方法selenium和BeautifulSoup结合。
先用selenium获取完整的网页源代码然后使用你已经熟悉的BeautifulSoup解析和提取数据。
代码我写好了和刚才的区别就是最后几行代码
from selenium import webdriver # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import timeoptions webdriver.ChromeOptions()
options.add_argument(--headless) # 开启无头模式chrome_options webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument(--headless) # 对浏览器的设置
driver webdriver.Chrome(optionschrome_options) # 声明浏览器对象driver.get(https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html) # 访问页面
time.sleep(2)button driver.find_element_by_class_name(js_get_more_hot) # 根据类名找到【点击加载更多】
button.click() # 点击
time.sleep(2) # 等待两秒pageSource driver.page_source # 获取Elements中渲染完成的网页源代码
soup BeautifulSoup(pageSource,html.parser) # 使用bs解析网页
comments soup.find(ul,class_js_hot_list).find_all(li,class_js_cmt_li) # 使用bs提取元素
print(len(comments)) # 打印comments的数量for comment in comments: # 循环sweet comment.find(p) # 提取评论print (评论%s\n ---\n%sweet.text) # 打印评论
driver.close() # 关闭浏览器 # 关闭浏览器到这里代码就全部写完了。
我们用了与第5关不同的方法完成了相同的项目。而且在解析与提取数据的时候也采用了两种方法去实现。
学会了这么多种方法以后再遇到类似问题就可以根据实际情况来评估用哪些方法可以实现然后挑选其中一种方法去做项目了。
本关总结
感谢努力的你学完了全部知识还做了项目我们现在又到了关卡快要结束的时刻了。
在这一关我教你安装了selenium与Chrome驱动然后介绍了浏览器的设置方法
# 本地Chrome浏览器的可视模式设置
from selenium import webdriver #从selenium库中调用webdriver模块
driver webdriver.Chrome() # 设置引擎为Chrome真实地打开一个Chrome浏览器这种设置方法可以让你看到浏览器的操作过程。我想在这里补充的是在本地的操作环境中你还可以把自己电脑中的Chrome浏览器设置为静默模式也就是说让浏览器只是在后台运行并不在电脑中打开它的可视界面。
因为在做爬虫时通常不需要打开浏览器爬虫的目的是爬到数据而不是观看浏览器的操作过程在这种情况下就可以使用浏览器的静默模式
它的设置方法是这样的
# 本地Chrome浏览器的静默模式设置
from selenium import webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类chrome_options Options() # 实例化Option对象
chrome_options.add_argument(--headless) # 把Chrome浏览器设置为静默模式
driver webdriver.Chrome(options chrome_options) # 设置引擎为Chrome在后台默默运行与上面浏览器的可视设置相比3、5、6行代码是新增的首先调用了一个新的类——Options然后通过它的方法和属性给浏览器输入了一个参数——headless。第7行代码中把刚才所做的浏览器设置传给了Chrome浏览器。
浏览器的可视模式与静默模式的设置就是以上四行代码的区别。你懂的这之后所有代码都是一样的。
嘱咐好了所有要讲给你的知识那就继续每一关结尾例行的总结吧~
我们刚才学习了使用selenium获取数据的方法.get(‘URL’)。 解析与提取数据的方法 以及在这个过程中对象的转换过程 除了上面的方法selenium还可以搭配BeautifulSoup解析提取数据前提是先获取字符串格式的网页源代码。
HTML源代码字符串 driver.page_source 以及自动操作浏览器的一些方法。 还有在用完浏览器之后要记得关闭它以免资源浪费在代码的结尾处加一行driver.close()就好。
到这里你应该能感受到Selenium是一个强大的网络数据采集工具它的优势是简单直观而它当然也有缺点。
由于是真实地模拟人操作浏览器需要等待网页缓冲的时间在爬取大量数据的时候速度会比较慢。
通常情况在爬虫项目中selenium都是用在其它方法无法解决或是很难解决的问题时才会用到。
当然除了爬虫selenium的使用场景还有很多。比如它可以控制网页中图片文件的显示、控制CSS和JavaScript的加载与执行等等。
我们的课程只是带你入门讲了一些简单常用的操作还想进一步学习的话可以通过selenium的官方文档链目前只有英文版
https://seleniumhq.github.io/selenium/docs/api/py/api.html
还可以参考这个中文文档
https://selenium-python-zh.readthedocs.io/en/latest/
下一关我们还会讲一个实用的方法定时与通知期待与你相见