栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python入门(四)动态网页分析及抓取

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python入门(四)动态网页分析及抓取

什么是动态网页 动态网页 就是网页中包含通过异步ajax加载出来的内容
我们在打开某个网页时 点击右键“查看网页源代码” 会发现有一部分网页上显示的内容 源代码里面没有 而这部分就是通过ajax异步加载出来的 这就是动态网页

就拿csdn博客来举例 Python入门 一 环境搭建

点开这篇文章 下方有一条评论


按F12检查元素

然后选中这条评论内容

此时 就可以确定评论区域所在位置 div class comment-list-box ... /div

其实 这也就是所谓的网页分析 通过检查元素 确定你想提取的内容的区域位置 后面就可以通过标签id name class或其它属性提取内容

继续往下看

这里面包含了一个列表 而那条评论就在其中 此时我们可以在网页中 右键查看网页源代码 然后Ctrl F 输入“comment-list-box”找到这部分

我们会发现 源代码里什么也没有 到这里 是不是就明白了呢

而如果我们要提取这部分动态内容 仅通过上一篇的方法是无法办到的 除非能分析出来加载动态网页的url 那如何才能简单高效的抓取动态网页内容呢 这里就需要用到动态网页抓取神器 Selenium

Selenium实则是一个web自动化测试工具 可以模拟用户滑动 点击 打开 验证等等一系列网页操作行为 就像一个真实用户在操作一样 这样就可以使用浏览器渲染方法将爬取动态网页 变成爬取静态网页

安装Selenium pip install selenium

安装成功后 简单测试

from selenium import webdriver
# 用selenium打开网页
driver webdriver.Chrome()
driver.get( https://www.baidu.com )

报错

WebDriverException( selenium.common.exceptions.WebDriverException: Message: chromedriver executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

这其实是缺少了谷歌浏览器驱动 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的提取的是列表 不带s的提取的则是单个数据 很好理解 详细使用方法 可以查看官方文档

仍以csdn博客为例 Python入门 一 环境搭建 爬取这篇文章的评论 上面我们已经分析到评论所在区域 div class comment-list-box ... /div

那么我们就可以直接通过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的用法区别

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267693.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号