在实际的网络数据抓取过程中,经常会发现一些网页内容在网页源代码中查找不到的情况,因为这些内容都是通过JavaScript动态生成的,此时,使用普通的requests库无法直接获取相关内容。这时候就需要借助于Selenium模拟人操作浏览器,从而获取动态生成的内容。Selenium是一个用于Web应用程序测试的工具,Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。Selenium支持大多数常用浏览器,例如IE、Mozilla Firefox、Safari、Google Chrome等等。下面我们以谷歌浏览器为例,给大家简单介绍Python中如何使用Selenium访问和抓取网页内容。
1、工具下载与测试
首先,在Python中并没有内置selenium库,因此需要自己主动下载安装,过程非常简单,只需通过 pip install selenium即可。
其次,需要安装相应的浏览器驱动,对于谷歌浏览器而言,需要安装ChromeDriver。需要注意的是:Chromedriver的版本一定要与本地电脑上的Chrome版本一致,否则不起作用。如何查看本地浏览器的版本呢?可通过在浏览器中输入chrome://version/ 查看,效果如下。此时,浏览器的版本为75.0.3770.142。
接着去下载对应版本的Chromedriver。通常从以下两个网址下载。
打开网址,找到对应的版本,如果没有完全一样的版本,相近的版本也可以。进入文件夹,下载与本地电脑系统相同的安装文件,在此选择windows,然后将其下载到本地。
准备好相关工具后,接下来就可以进行测了。首先导入相关模块,然后创建浏览器对象,指定驱动所在路径,接着打开任意网址,让浏览器停留一段时间。代码如下:
from selenium import webdriver
import time
driver_path = r"D:\chromedriver.exe" # 驱动所在路径
browser = webdriver.Chrome(executable_path=driver_path) # 打开浏览器,指定驱动路径
browser.get('https://www.baidu.com') # 打开百度首页
time.sleep(100) # 停留一段时间
运行上方代码,将会得到下图所示效果,浏览器显示百度首页,并有提示消息:Chrome正受到自动测试软件的控制。说明一切准备工作就绪。
2、核心对象及其方法介绍
通过browser = webdriver.Chrome()方法获取浏览器对象brower后,即可调用浏览器对象的方法实现网页跳转、网页源码获取、网页节点查找、浏览器关闭等等。
浏览器对象brower的主要方法及其含义如下:
- get(url):打开url对应的网页资源;
- page_source:属性,用于获取网页源代码;
- close():关闭当前页面窗口;
- quit():退出浏览器,关闭所有窗口;
- save_screenshot(filename):对浏览器进行截图并保存;
- find_element_by_id(id):根据id找到节点;
- find_element_by_name(name):根据标签名找到节点;
- find_element_by_class_name(class_name):根据样式名找到节点;
- find_element_by_xpath(xpath):根据xpath匹配找到节点;
- find_element_by_link_text(link_text):根据链接文本找到节点;
- find_elements_by_id(id):根据id找到节点,结果为节点列表;
- find_elements_by_name(name):根据标签名找到节点,结果为节点列表;
- find_elements_by_class_name(class_name):根据样式名找到节点,结果为节点列表;
- find_elements_by_xpath(xpath):根据xpath匹配找到节点,结果为节点列表;
- find_elements_by_link_text(link_text):根据链接文本找到节点,结果为节点列表。
- back():根据访问历史后退一页;
- forward():根据访问历史前进一页;
- refresh():刷新当前页面;
- minimize_window():最小化窗口;
- maximize_window():最大化窗口;
- fullscreen_window():全屏显示;
- add_cookie(cookie_dict):添加cookie,cookie以键值对保存在字典中;
- delete_cookie(name):删除指定cookie;
- get_cookie(name):获取指定cookie;
节点对象WebElement的主要方法及其含义如下:
- click():单击某个节点;
- submit():提交表单;
- get_attribute(name):获取属性值;
- text:获取节点内容;
- is_selected():节点是否被选中;
- send_keys():模拟文本框输入内容;
- screenshot(filename):对节点内容进行截图并保存;
- find_element_by_id(id):根据id找到节点;
- find_element_by_name(name):根据标签名找到节点;
- find_element_by_class_name(class_name):根据样式名找到节点;
- find_element_by_xpath(xpath):根据xpath匹配找到节点;
- find_element_by_css_selector(css_selector):根据样式选择器找到节点;
- find_element_by_link_text(link_text):根据链接文本找到节点;
- find_elements_by_id(id):根据id找到节点,结果为节点列表;
- find_elements_by_name(name):根据标签名找到节点,结果为节点列表;
- find_elements_by_class_name(class_name):根据样式名找到节点,结果为节点列表;
- find_elements_by_xpath(xpath):根据xpath匹配找到节点,结果为节点列表;
- find_elements_by_css_selector(css_selector):根据样式选择器找到节点,结果为节点列表;
- find_elements_by_link_text(link_text):根据链接文本找到节点,结果为节点列表;
3、简单应用案例-抓取博主的博客列表
下面通过一个简单的例子,演示使用Selenium抓取网页数据的流程,这个例子是获取CSDN中某位博主的文章标题及其链接,该博主的文章列表页面为:https://blog.csdn.net/Dream_Gao1989?spm=1001.2101.3001.5343,关键代码如下:
程序执行后,控制台打印结果如下(这里只截取了部分):
获取到博客的链接后,可以进一步去访问该链接,抓取博客内容,主要流程都类似,在此就不再进行下去了,感兴趣的读者可以自己去尝试,有什么问题可以在评论里交流。
相关工具和源代码,可关注微信公众号:Python资源分享,回复 CSDN 即可获取。