自动化爬虫虽然方便,但希望大家能顾及网站服务器的承受能力,不要高频率访问网站。并且千万不要采集敏感数据!!否则很容易"从入门到入狱"
本系列大部分案例同时采用 selenium 与 pyppeteer 库讲解,并且有 Python 和 C# 2门语言的实现文章,详细请到公众号目录中找到。
使用 Selenium 控制浏览器进行页面跳转时,经常需要等待机制才能让爬虫继续执行,这次我们来看看等待机制的流程,如何随心所欲做出各种等待效果。
想象一下如果是一个机器人帮你从网页上查找某个信息,比较合理的流程是:
Selenium 的等待机制同样如此,而上述机制中唯一可以变化的就是"查找规则",这体现为 wait.until 的第一个参数接受一个"可调用对象"
这次案例的网页是我简单创建的,启动网站服务如下(jupyter notebook 为例子):
现在用代码对这个页面采集,看看网页内容结构。
用"开发者工具",查看元素的标签:
现在用代码控制 Selenium ,找上述的 div 标签。
首先导入包:
from selenium import webdriver
import selenium.webdriver.support.wait as WA
主要代码如下:
driver = webdriver.Chrome()
driver.get('http://localhost:8081/web_sp/')
wait = WA.WebDriverWait(driver, poll_frequency=0.5, timeout=10)
ct = wait.until(lambda w: w.find_element_by_css_selector('div.content'))
ct.text
现在执行这个代码,如下:
大概 10 秒后,代码执行结束,报了一个错误:
我们再次执行代码,这次我们在页面出来之后10秒内,点击页面上的按钮:
了解这个机制,我们可以很灵活定制属于自己的查找条件。
这次,我希望可以等新增内容到达一定次数才继续执行后续的操作。
首先,我们要知道一点,传入 wait.until 的方法是有限制的,必须只有一个参数(此参数实际为 driver)。
但是,我们希望自定义函数能够灵活一点,可以知道 css 选择器 和 条件数量,比如:
def finds_by_count(css_selector, num):
pass
我们可以利用嵌套函数实现:
def finds_by_count(css_selector, num):
def finds_by_count_(wd):
res = wd.find_elements_by_css_selector(css_selector)
if len(res) >= num:
return res
return finds_by_count_
现在,试试效果了,代码如下:
driver = webdriver.Chrome()
driver.get('http://localhost:8081/web_sp/')
wait = WA.WebDriverWait(driver, timeout=10)
cts = wait.until(finds_by_count('div.content', 3))
[c.text for c in cts]
出来页面后,如果快速点击3下按钮,就能看到结果:
用代码控制 selenium 最关键的功能就是"等待机制",我们可以用来检测各种条件,让代码无缝执行。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有