@[toc]
selenium:爬虫.py的一些小操作
2021年9月9日
23:29
硒元素:解决我的动态网页相关问题。
尝试爬了爬网站的表格,pandas的DataFrame对中文非常不友好,很多时候都是乱码。于是我就直接试着配置了个selenium环境,把数据存为把list再导出CSV格式,然后再在R里面进行数据清洗。
许多博主宣称selenium是所见即可爬,这很大程度激发了我的兴趣。争取再花一点点时间,深入了解一下。
原理和安装
客户端库到浏览器驱动,根据网上教程一步一步来,没有出现问题。
安装客户端库
使用pip命令安装
pip install selenium
安装浏览器驱动
嫌麻烦,于是就新下了个chrome。
然后下载了对应的驱动,注意到版本号要每个字都对上。再把驱动添加到环境变量,这样就可以不用再每次都指定路径了。
牛刀小试
|
|
太久没写了,网址都懒得打引号了。
|
|
小结
至此,我们完成了简单的环境搭建,并且通过代码进入了网页。
wd = webdriver.Chrome() 运行之后,屏幕上回输出日志信息。说实话这日志对咱没啥用,可以这样关掉日志:
|
|
选择元素的基本方法
了解过html和css,所有对元素一定不陌生。找到元素然后操作。
手动选择元素的方法
F12后在elements下看到web的元素,使用最左边的箭头快速选择要看的元素。
根据元素的ID属性选择元素
|
|
这个就是元素的id
|
|
|
|
根据class属性、tag名 选择元素
根据class属性 选择元素
element加不加’s'
一个class就是一类(classification),通常有多个元素具有相同的class属性,所以函数中element多了一个’s’。当然如果不加’s’将只返回第一个元素
|
|
这样<class="class_name">
的元素就被选中了。
把elements搞成text薅出来
|
|
元素属于多个类型
当元素属于多个类型时
<span class="CHINESE STUDIENT SON"></span>
可以通过他的任意一个类型选中他,但是不能这样写:
Element = wd.find_elements_by_class_name('CHINESE STUDENT')
根据 tag名 选择元素
同样使用
wd.find_elements_by_tag_name('tb')
如此便选中了tag名为tb的元素对应的webelement对象。同样使用element.text属性来获得元素对应的文本。
|
|
NoSuchElementException 异常
没有符合的元素时抛出。有可能吧是真的没有,有可能是加载失败或者还没加载出来。
通过WebElement对象选择元素
元素筛选:Webelement.find与webdriver.find的区别
不仅 WebDriver对象有 选择元素 的方法, WebElement对象 也有选择元素的方法。
WebElement对象 也可以调用 find_elements_by_xxx, find_element_by_xxx 之类的方法
WebDriver 对象 选择元素的范围是 整个 web页面, 而WebElement 对象 选择元素的范围是 该元素的内部。
|
|
如此便可以更加方便地完成内容筛选了
等待界面元素出现
在想服务器发出指令后等待个两秒钟:
|
|
当然这是简单而粗暴的操作 ,Selenium提供了一个更合理的解决方案,是这样的:
当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。
而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,
或者超出指定最大等待时长,这时才 抛出异常或者返回空值。
|
|
那么,后续所有的 find_element 或者 find_elements 之类的方法调用 都会采用上面的策略
当然,某些时候使用sleep也能够满足你的需求。