动态网页抓取( 如何使用浏览器渲染方法将爬取动态网页变成爬取静态网页)

优采云 发布时间: 2021-12-29 16:09

  动态网页抓取(

如何使用浏览器渲染方法将爬取动态网页变成爬取静态网页)

  

  此时,可以确定评论区的位置:

  ...

  其实这就是所谓的网页分析。通过检查元素,可以确定要提取的内容的位置,然后可以通过标签id,名称,类或其他属性提取内容!

  继续往下看:

  

  它收录

一个列表,注释也在其中。这时候我们可以在网页上右击查看网页源码,然后Ctrl+F,输入“comment-list-box”就可以找到这部分:

  

  我们会发现源代码里什么都没有!此时,你明白了吗?

  而如果我们要提取这部分动态内容,仅通过上一篇文章的方法是不可能做到的。除非加载动态网页的 URL 可以解析,否则我们如何简单高效地捕获动态网页内容?这里需要用到动态网页爬取神器:Selenium

  Selenium其实是一个web自动化测试工具,可以模拟用户滑动、点击、打开、验证等一系列网页操作行为,就像真实用户在操作一样!这样就可以利用浏览器渲染的方式,将动态网页抓取成静态网页抓取了!

  安装硒:pip install selenium

  安装成功后,简单测试:

  from selenium import webdriver # 用selenium打开网页 driver = webdriver.Chrome() driver.get("https://www.baidu.com") 复制代码

  错误:

  WebDriverException( mon.exceptions.WebDriverException: 消息:'chromedriver' 可执行文件需要在 PATH 中。请参阅

  这其实就是缺少谷歌浏览器的驱动:chromedriver。下载后,放在盘符下并记录位置,修改代码,再次执行:

  driver = webdriver.Chrome(executable_path=r"C:\chromedriver.exe") driver.get("https://www.baidu.com") 复制代码

  笔者这里使用的是FireFox浏览器,效果是一样的,当然要下载火狐浏览器驱动:geckodriver

  driver = webdriver.Firefox(executable_path=r"C:\geckodriver.exe") driver.get("https://www.baidu.com") 复制代码

  

  打开成功后会显示浏览器已被控制!

  我们可以在PyCharm中查看webdriver提供的方法:

  

  当提取的内容嵌套在frame中时,我们可以定位到driver.switch_to.frame。简单来说,我们可以直接使用driver.find_element_by_css_selector、find_element_by_tag_name等,s的提取是单个数据,容易理解。详细用法可以查看官方文档!

  还是以csdn博客为例:Python入门(一)环境设置,爬取这篇文章的评论,我们分析了上面评论所在的区域:

  ...

  :

  

  然后我们就可以直接通过find_element_by_css_selector获取div下的内容:

  from selenium import webdriver driver = webdriver.Firefox(executable_path=r"C:\geckodriver.exe") driver.get("https://baiyuliang.blog.csdn.net/article/details/120473414") comment_list_box = driver.find_element_by_css_selector('div.comment-list-box') comment_list = comment_list_box.find_element_by_class_name('comment-list') comment_line_box = comment_list.find_elements_by_class_name('comment-line-box') for comment in comment_line_box:     span_text = comment.find_element_by_class_name('new-comment').text     print(span_text) 复制代码

  结果:

  

  注意 find_element_by_css_selector 和 find_element_by_class_name 的用法区别!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线