区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎。直接用浏览器在显示网页时解析 HTML、应用 CSS 样式并执行 JavaScript 的语句。

这个方法在爬虫过程中会打开一个浏览器加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来。用一句简单而通俗的话说,就是使用浏览器渲染方法将爬取动态网页变成爬取静态网页。

我们可以用 Python 的 Selenium 库模拟浏览器完成抓取。Selenium 是一个用于Web 应用程序测试的工具。Selenium 测试直接运行在浏览器中,浏览器自动按照脚本代码做出单击、输入、打开、验证等操作,就像真正的用户在操作一样。

通过Selenium模拟浏览器抓取。最常用 的是 Firefox,因此下面的讲解也以 Firefox 为例,在运行之前需要安装 Firefox 浏 览器。

在运行下列代码时,一定要留意自己网络是否畅通,如果网络不好造成浏览器不能正常打开网页及其评论数据,就可能造成爬取失败。

1)找到评论的HTML代码标签。使用Chrome打开该文章页面,右键点击页面,打开“检查”选项。定位到评论数据。此处定位到的评论数据即是浏览器渲染后的数据位置,如图:

2)尝试获取一条评论数据。在原来打开页面的代码数据上,我们可以使用以下代码,获取第一条评论数据。在下面代码中,driver.find_element_by_css_selector是用CSS选择器查找元素,找到class为’reply-content’的div元素;find_element_by_tag_name则是通过元素的tag去寻找,意思是找到comment中的p元素。最后,再输出p元素中的text文本。

相关代码1:

from selenium importwebdriverfrom selenium.webdriver.firefox.firefox_binary importFirefoxBinary

caps=webdriver.DesiredCapabilities().FIREFOX

caps["marionette"]=True

binary=FirefoxBinary(r'E:\软件安装目录\装机必备软件\Mozilla Firefox\firefox.exe') #把上述地址改成你电脑中Firefox程序的地址

driver=webdriver.Firefox(firefox_binary=binary,capabilities=caps)

driver.get("http://www.santostang.com/2017/03/02/hello-world/")#page=driver.find_element_by_xpath(".//html")

driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))

comment=driver.find_element_by_css_selector('div.reply-content-wrapper')#此处参数字段也可以是'div.reply-content',具体字段视具体网页div包含关系而定

content=comment.find_element_by_tag_name('p')print(content.text)#driver.page_source

输出:

在JS 里面也找不到https://api.gentie.163.com/products/ 哪位大神帮忙解答下。谢谢。

代码解析:

1)caps=webdriver.DesiredCapabilities().FIREFOX

由此可知,将上文代码中的caps["marionette"]=True注释掉,代码依旧可以正常运行。

2)binary=FirefoxBinary(r'E:\软件安装目录\装机必备软件\Mozilla Firefox\firefox.exe')

3)driver=webdriver.Firefox(firefox_binary=binary,capabilities=caps)

构建webdriver类。

还可以构建别的类型的webdriver类。

4)driver.get("http://www.santostang.com/2017/03/02/hello-world/")

5)driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))

6)comment=driver.find_element_by_css_selector('div.reply-content-wrapper')

7)content=comment.find_element_by_tag_name('p')

8)关于driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))中的框架定位及title内容。

可在代码中加入driver.page_source,并且注释掉driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))。可在输出内容中找到(若输出杂乱,不好找出相关内容,可将其复制黏贴到文本文件中,使用Notepad++打开,该软件有前后标签对应显示功能):

(此处只截取了相关内容的末尾部分)

若使用了driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']")),而再使用driver.page_source进行相关输出,则发现没有上面的iframe标签,证明我们已经将该框架解析完毕,可以进行相关定位获取元素了。

上面我们只是获取了一条评论,如果要获取所有评论,使用循环获取所有评论。

相关代码2:

from selenium importwebdriverfrom selenium.webdriver.firefox.firefox_binary importFirefoxBinary

caps=webdriver.DesiredCapabilities().FIREFOX

caps["marionette"]=True

binary=FirefoxBinary(r'E:\软件安装目录\装机必备软件\Mozilla Firefox\firefox.exe')

driver=webdriver.Firefox(firefox_binary=binary,capabilities=caps)

driver.get("http://www.santostang.com/2017/03/02/hello-world/")#page=driver.find_element_by_xpath(".//html")

driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))

comments=driver.find_elements_by_css_selector('div.reply-content')for eachcomment incomments:

content=eachcomment.find_element_by_tag_name('p')print(content.text)#driver.page_source

输出:

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

@先生姓张 原来要按照这里的操作才行。。。

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

@先生姓张 这是网易云上面的一个连接地址,那个服务器都关闭了

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

测试

为什么我用代码打开的文章只有两条评论,本来是有46条的,有大神知道怎么回事吗?

菜鸟一只,求学习群

lalala1

我来试一试

我来试一试

应该点JS,然后看里面的Preview或者Response,里面响应的是Ajax的内容,然后如果去爬网站的评论的话,点开js那个请求后点Headers-->在General里面拷贝 RequestURL 就可以了

注意代码2中将代码1中的comment=driver.find_element_by_css_selector('div.reply-content-wrapper') 改成了comments=driver.find_elements_by_css_selector('div.reply-content')

elements加了s

以上获取的全部评论数据均属于正常进入该网页,等该网页渲染完获取的全部评论,并未进行点击“查看更多”来加载目前还未渲染的评论。

下面介绍一种能够爬取到所有评论,包括点击完“查看更多”加载的目前还未渲染的评论。

相关代码:

from selenium importwebdriverfrom selenium.webdriver.firefox.firefox_binary importFirefoxBinaryimporttime

caps=webdriver.DesiredCapabilities().FIREFOX

caps["marionette"]=True

binary=FirefoxBinary(r'E:\软件安装目录\装机必备软件\Mozilla Firefox\firefox.exe')

driver=webdriver.Firefox(firefox_binary=binary,capabilities=caps)

driver.get("http://www.santostang.com/2017/03/02/hello-world/")

driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))

time.sleep(60)for i in range(0,10):try:

load_more=driver.find_element_by_css_selector('div.more-wrapper')

load_more.click()except:passtime.sleep(5)

comments=driver.find_elements_by_css_selector('div.reply-content')for eachcomment incomments:

content=eachcomment.find_element_by_tag_name('p')print(content.text)

代码解析:

1)time.sleep(60)

延时60秒执行以下代码。

2)load_more=driver.find_element_by_css_selector('div.more-wrapper')中的参数字符串

打开目标网页,等目标网页整体渲染完之后,右键评论区的“查看更多”。

3)load_more.click()

模拟点击“查看更多”按钮,进行完整显示所有评论。

4)之所以在代码中两次使用延时函数,是因为不同网络状况和不同机器环境下可能在打开网页以及点击“查看更多”按钮后不能马上显示评论,所以代码需要等一等,等到页面完全渲染后,再进行评论区数据的收集工作。

因此各延时函数的延时时间长短可视具体情况灵活设置。

输出结果:

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

@先生姓张 原来要按照这里的操作才行。。。

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

@先生姓张 这是网易云上面的一个连接地址,那个服务器都关闭了

在JS 里面也找不到https://api.gentie.163.com/products/哪位大神帮忙解答下。谢谢。

测试

为什么我用代码打开的文章只有两条评论,本来是有46条的,有大神知道怎么回事吗?

菜鸟一只,求学习群

lalala1

我来试一试

我来试一试

应该点JS,然后看里面的Preview或者Response,里面响应的是Ajax的内容,然后如果去爬网站的评论的话,点开js那个请求后点Headers-->在General里面拷贝 RequestURL 就可以了

现在死在了4.2节上,页面评论是有的,但是XHR里没有东西啊,这是什么情况?有解决的大神吗?

@骨犬 JS

为何静态网页抓取不了?

奇怪了,我按照书上的方法来操作,XHR也是空的啊

@易君召 我的也是空的

你解决问题了吗

@思い亦深 看JS不是XHR

XHR没有显示任何东西啊。奇怪。

找到原因了

caps["marionette"] =True

作者可以解释一下这句话是干什么的吗

@A cat named GitHub 改成 caps["marionette"] =False 可以运行。 目前还没吃透代码,先用着试试

我用的是 pycham IDE,按照作者的写法写的,怎么不行

@A cat named GitHub 找到原因了

caps["marionette"] =True

作者可以解释一下这句话是干什么的吗

对火狐版本有要求吗

@花晨 我的也是提示火狐版本不匹配,你解决了吗

@A cat named GitHub 重装了geckodriver

改成caps["marionette"] = "Windows"总之就好了4.3.1打开Hello World,代码用的作者的,火狐地址我也设置了,为啥运行没反应from selenium importwebdriverfrom selenium.webdriver.firefox.firefox_binary importFirefoxBinary

caps=webdriver.DesiredCapabilities().FIREFOX

caps["marionette"] =False

binary= FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')#把上述地址改成你电脑中Firefox程序的地址

driver = webdriver.Firefox(firefox_binary=binary, capabilities=caps)

driver.get("http://www.santostang.com/2017/03/02/hello-world/")

我是番茄

为什么刷新没有XHR数据,评论明明加载出来了

为什么刷新没有XHR数据,评论明明加载出来了

@萌萌哒的小叽叽丶 书里错误很多,留个qq吧

为什么刷新没有XHR数据,评论明明加载出来了

第21条测试评论

第20条测试评论

第19条测试评论

第18条测试评论

第17条测试评论

第16条测试评论

第15条测试评论

第14条测试评论

第13条测试评论

第12条测试评论

第11条测试评论

第10条测试评论

第9条测试评论

第8条测试评论

第7条测试评论

第6条测试评论

第5条测试评论

第4条测试评论

第3条测试评论

第二条测试评论

第一条测试评论

参考书目:唐松,来自《Python 网络爬虫:从入门到实践》

python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...相关推荐

  1. python动态页面元素爬取_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  3. 网络爬虫pyppeteer、selenium模拟浏览器抓取数据

    项目场景: 1.抓取数据时,响应状态码为412,即状态码412含义为:Precondition Failed,服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个.这个状态码允许客户端 ...

  4. python 模拟浏览器selenium 微信_Spider-Python爬虫之使用Selenium模拟浏览器行为

    分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...

  5. python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  6. python 模拟浏览器selenium_从零开始写Python爬虫 --- 3.1 Selenium模拟浏览器

    本来说好要写Mechanize模拟浏览器的,结果一看居然只支持2.x版本的Python,而且已经长久没有更新维护了,本着学新不学旧的原则,我决定跳过他,直接开学Selenium(其实就是我懒,逃 Se ...

  7. python 模拟用户点击浏览器_python爬虫之selenium模拟浏览器

    1.前言 之前在异步加载(AJAX)网页爬虫的时候提到过,爬取这种ajax技术的网页有两种办法:一种就是通过浏览器审查元素找到包含所需信息网页的真实地址,另一种就是通过selenium模拟浏览器的方法 ...

  8. 『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据

    文章目录 0x01:引子 首先介绍一下网络爬虫是什么,可以用来做什么? 这里简单探讨一下网络爬虫的合法性 正式进入爬虫实战前,需要我们了解下网页结构 HTML CSS JScript 写一个简单的 H ...

  9. 【爬虫+数据可视化】Python爬取CSDN博客访问量数据并绘制成柱状图

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业及非法用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/ ...

最新文章

  1. java接口匿名内部类_JAVA技术分享:接口,内部类,匿名内部类
  2. Redis学习-String
  3. python 基础学习 正则表达式1(规则)
  4. 工业机器人几个自由度_取件冲压上下料机械手和六自由度工业机器人805A
  5. Net Core下使用RabbitMQ比较完备两种方案(虽然代码有点惨淡,不过我会完善)
  6. Arcgis自下而上从左到右进行编号
  7. ajax传值 实体类_ajax传参到实体类对应字段
  8. mysql show table column_mysql show columns 等show的用法
  9. 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段...
  10. 苹果手机与安坐手机input输入框ios 会有灰色背景解决方法
  11. php中ignore_user_abort函数的用法(定时)
  12. SSM项目实战之十:用户信息查询
  13. JUCE小白求教VS2019-C1083无法打开包括文件
  14. IBM SPSS Statistics如何快速有效地录入数据
  15. 中国船舶制造行业市场运行动态及发展前景分析报告2022-2028年
  16. Unity3D场景对象无法显示
  17. 张驰咨询:关于企业选择六西格玛绿带培训人员,你需要知道这些
  18. 对接熊迈SDK工作记录之实时视频和云录像功能集成
  19. android程序怎样远程控制手机,如何用手机远程控制手机(安卓),看这就够了,怎样使用手机远程控制它人手机...
  20. 搭建mysql注入_常见的sql注入环境搭建

热门文章

  1. Frame与Panel
  2. OC和Clover黑苹果USB定制和注入
  3. tecplot——Fluent重叠网格解决方案
  4. c语言习题集-----收藏归纳版
  5. 微信支付0.2%费率特约商户号,一起了解一下。
  6. Silverlight开发历程—(绘制放射渐变图形)
  7. PS橡皮擦魔棒设置图片的背景为透明
  8. /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵
  9. 服务端返回中文乱码的分析和解决办法
  10. Windows部分软件乱码教你快速解决