如果链接简单,爬虫可以通过链接用requests库提取页面信息,如爬取豆瓣top250影片信息,链接简单易懂。参考:爬取豆瓣top250影片信息
但如果遇到一些搜索之类的,基于js动态加载的网页,以上就不适合,如爬虫b站,搜索“爬虫”页面,第一页链接如下,第二页又是很长没规律的链接。很难用requests库提取页面。
针对以上情况,我们可以通过浏览器直接访问每个页面,然后提取页面。当然是让爬虫自己打开浏览器,输入内容访问,然后提取页面元素。这个过程就要用到 selenium 库。
selenium其实它就是一个自动化测试工具,支持各种主流的浏览器。遇到python,selenium 就变成了爬虫利器。
1、安装
下载浏览器驱动,我用的是 Chrome 浏览器,所以下载Chrome驱动即可,当然你可以下载其他浏览器驱动。下载链接:ChromeDriver,找到和自己浏览器版本一致或者最接近的。
2、配置环境变量
下载解压后,配置环境变量。
解压,然后创建一个存放浏览器驱动的目录,如: D:PythonDriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下,我这里是chromedriver。
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“D:PythonDriver”目录添加到Path的值中。比如:Path字段;D:PythonDriver
关于环境变量不生效的问题:
1:尝试将浏览器驱动,直接放在python安装目录试试
2:配置环境变量后,重启电脑生效(我就是重启才生效)
1、浏览器自动访问
代码,打开浏览器,并访问。
以上,执行代码自动打开浏览器
2、输入关键字并搜索
分析代码,可以看到,搜索框和按钮键的class元素值为 nav-search-input 和 nav-search-btn
找到元素后,用find_element方法定位找到此元素,定位有多种方式。
以上也可以用 的方式,对应值。
我这里用class值定位即可。
注:以上如果报错提示没有By这个类型,需要导入包from selenium.webdriver.common.by import By
执行效果:
以上基本的搜索动作就完成了。
有网页了,可以用以前学的BeautifulSoup库提取页面代码元素了。
1、切换窗口
由于搜索页面是重新打开了一个页面,所以还需要在代码种切换,否则默认的都是第一个页面。
window_handles:获取页面句柄,返回值的为列表list。
switch_to.window:切换页面。
以上得到的print(windows)句柄值,值为:
2、获取页面源代码提取元素
切换页面后,用 获取页面源代码。
获取源代码后,就可以提取元素了,分别找到对应的class值即可。这里提取值有,视频名称,up主,播放量,时长,链接,日期。
最后代码为:
执行结果为:
这样单个页面的所有视频信息提取完成了。
以上代码种,切换页面后,有一个等待5秒的代码。
如果不加这行,有时候获取不到完整的信息而报错,因为代码元素没有加载完成,代码就执行完了,从而获取不到元素值而报错,所以必须加一个等待时间。报错如下:
time.sleep(5),如果临时调试,也可以用,但是在实际环境,尽量少用,因为实际环境网络差异,可能5秒也加载不出,而报错。所以需要灵活点的方式,有三种等待方法。
1、强制等待
sleep(x) x单位为s,sleep等待的是元素 。
不管你浏览器是否加载完了,程序都得等待,时间一到,继续执行下面的代码,作为调试很有用。
隐性等待和显性等待可以同时用。
注意:等待的最长时间取两者之中的大者
2、隐性等待
隐性等待的是页面,implicitly_wait(x) x单位为s。
一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。
如果超出了设置时间的则抛出异常。
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度
3、显性等待
需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块
- driver:浏览器驱动
- timeout:最长超时时间,默认以秒为单位
- poll_frequency:检测的间隔步长,默认为0.5s
- ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
配合该类的until()和until_not()方法
程序每隔poll_frequency秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
WebDriverWait与expected_conditions结合使用,示例:
expected_conditions类提供的预期条件判断的方法:
4、更改代码等待方式
3个地方等待,输入关键词,点击按钮,还有切换页面。
输入搜索框,并确定。
调整页面等待,By.CLASS_NAME定位一个class值,并不能很准确,所以这里用By.CSS_SELECTOR定位。
对CSS_SELECTOR规则不熟的,直接查看源代码复制即可,当然也不一定非要最底层的元素值,我这里到div.video.i_wrapper.search-all-list即可。
最终代码为:
如果长时间运行,不可能一直打开浏览器,这时候就需要用无UI的浏览器,或者隐藏浏览器无界面运行。
方法一:PhantomJS浏览器
PhantomJS一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。
注:最新版selenium(4.x.x)已经放弃PhantomJS,会报错AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘
如需要用这种浏览器,需要卸载最新的selenium,安装3.8.0版本或以下的。
phantomjs下载地址:https://phantomjs.org/download.html,和安装chrome驱动一致,解压,配置环境变量即可。
安装完成后,在代码种将webdriver.Chrome()改成webdriver.PhantomJS()即可。
方法二:配置options无头模式
通过配置options的headless属性。无头模式有可能被检测,容易被发现。
headless属性来配置ChromeDriver以使用Selenium在无头模式下启动google-chrome浏览器。然后将参数传入webdriver.Chrome即可。
方法三:在虚拟显示器上工作
推荐使用这种在服务器上执行,这种方式,推荐是在Linux服务器中进行。因为windows容易报错,而且windows不支持某些包。
如报错:ModuleNotFoundError: No module named ‘fcntl’,原因是fcntl包并不支持在window上面运行。
1:Linux安装chrome和下载chromedriver驱动
Linux安装chrome
安装完成后,查看chrome版本
Linux下载chromedriver驱动,根据chrome版本下载在官网相应驱动版本。
2:虚拟显示器执行
使用虚拟桌面前,服务器需要安装xvfb支持虚拟桌面
安装包pyvirtualdisplay
倒入包名,开启虚拟显示器。
或者用另一个包xvfbwrapper,也可以使用虚拟桌面。
安装包
倒入
以上就是本篇文章【python爬虫之selenium库,浏览器访问搜索页面并提取信息,及隐藏浏览器运行】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/2246.html 资讯 企业新闻 行情 企业黄页 同类资讯 首页 网站地图 返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多