浏览器抓取网页(本文基本用法导入库初始化大小浏览器刷新同刷新键(组图))
优采云 发布时间: 2022-02-22 11:08浏览器抓取网页(本文基本用法导入库初始化大小浏览器刷新同刷新键(组图))
本文是爬虫工具selenium的介绍,包括安装和常用的使用方法,后面会整理出来以备不时之需。
文章目录
1. 硒安装
Selenium 是一种常用的爬虫工具。相比普通爬虫库,它直接模拟调用浏览器直接运行,可以避免很多反爬机制。在某种程度上,它类似于按钮向导。但它更强大。,更可定制。
首先我们需要在 python 环境中安装 selenium 库。
pip install selenium
# 或
conda install selenium
除了基本的python依赖库外,我们还需要安装浏览器驱动。由于我经常使用chrome,所以这里选择chomedriver,其他浏览器需要找到对应的驱动。
首先打开chrome浏览器,在地址栏输入Chrome://version,查看浏览器对应的版本号,比如我当前的版本是:98.0.4758.82(正式版)(64位)。然后在chromedriver官网找到对应的版本下载并解压。(这是官网,有墙)最后把chromedriver.exe放到python环境的Scripts文件夹下,或者项目文件夹下,或者放到自己喜欢的文件夹下(不是)。
好,那我们就开始我们的学习之旅吧!
2. 基本用法
导入库
from selenium import webdriver
初始化浏览器
如果已经放在 Scripts 文件夹中,会直接调用。
# 初始化选择chrome浏览器
browser = webdriver.Chrome()
否则需要手动选择浏览器的路径,可以是相对路径,也可以是绝对路径。
# 初始化选择chrome浏览器
browser = webdriver.Chrome(path)
这时候你会发现自动弹出一个chrome浏览器。如果我们想让程序安静地运行,我们可以设置一个无界面,也称为无头浏览器。
# 参数设置
option = webdriver.ChromeOptions()
option.add_argument("headless")
browser = webdriver.Chrome(options=option)
访问网址
# 访问百度
browser.get(r'https://www.baidu.com/')
关闭浏览器
# 关闭浏览器
browser.close()
3. 浏览器设置
浏览器大小
# 全屏
browser.maximize_window()
# 分辨率 600*800
browser.set_window_size(600,800)
浏览器刷新
用刷新键,最好写个异常检测
try:
# 刷新页面
browser.refresh()
print('刷新页面')
except Exception as e:
print('刷新失败')
向前向后
# 后退
browser.back()
# 前进
browser.forward()
4. 网页基本信息
当前网页的标题等信息。
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
也可以直接获取网页源代码,可以直接使用正则表达式、Bs4、xpath等工具解析。
print(browser.page_source)
5. 定位页面元素
定位页面元素,即直接在浏览器中查找渲染的元素,而不是源码。以下面的搜索框标签为例
按 id/name/class 定位
# 在百度搜索框中输入python
browser.find_element_by_id('kw').send_keys('python')
browser.find_element_by_name('wd').send_keys('python')
browser.find_element_by_class_name('s_ipt').send_keys('python')
按标签定位
但实际上,一个页面上可能有很多相同的标签,这会使标签指向不明确,从而导致错误。
# 在百度搜索框中输入python
browser.find_element_by_tag_name('input').send_keys('python')
链接位置
定位链接名称,例如定位在百度左上角的链接示例中。
新闻
hao123
地图
...
直接通过链接名称定位。
# 点击新闻链接
browser.find_element_by_link_text('新闻').click()
但是有时候链接名很长,可以使用模糊定位偏,当然链接指向的只是一.
# 点击含有闻的链接
browser.find_element_by_partial_link_text('闻').click()
xpath定位
上述方法必须保证元素是唯一的。当元素不唯一时,需要使用xpath进行唯一定位,比如使用xpath查找搜索框的位置。
# 在百度搜索框中输入python
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python')
css定位
这种方法比xpath更简洁更快
# 在百度搜索框中输入python
browser.find_element_by_css_selector('#kw').send_keys('python')
定位多个元素
当然,有时我们只需要多个元素,所以我们只需要使用复数s即可。
# element s
browser.find_elements_by_class_name(name)
browser.find_elements_by_id(id_)
browser.find_elements_by_name(name)
6. 获取元素信息
通常在上一步定位元素后,对元素进行一些操作。
获取元素属性
比如要获取百度logo的信息,先定位图片元素,再获取信息
# 先使用上述方法获取百度logo元素
logo = browser.find_element_by_class_name('index-logo-src')
# 然后使用get_attribute来获取想要的属性信息
logo = browser.find_element_by_class_name('index-logo-src')
logo_url = logo.get_attribute('src')
获取元素文本
首先,使用类直接查找热列表元素,但是有多个元素,所以使用复数来获取,并使用for循环打印。使用文本获取文本
# 获取热榜
hots = browser.find_elements_by_class_name('title-content-title')
for h in hots:
print(h.text)
获取其他属性
获取例如 id 或 tag
logo = browser.find_element_by_class_name('index-logo-src')
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)
7. 页面交互
除了直接获取页面的元素外,有时还需要对页面进行一些操作。
输入/明文
比如在百度搜索框输入“冬奥会”,然后清除
# 首先获取搜索框元素, 然后使用send_keys输入内容
search_bar = browser.find_element_by_id('kw')
search_bar.send_keys('冬奥会')
# 稍微等两秒, 不然就看不见了
time.sleep(2)
search_bar.clear()
提交(输入)
输入以上内容后,需要点击回车提交,才能得到想要的搜索信息。
2022年2月5日写这篇博文的时候,百度已经发现了selenium,所以需要补充一些伪装的方法,文末。.
search_bar.send_keys('冬奥会')
search_bar.submit()
点击
当我们需要点击时,使用click。比如之前的提交,你也可以找到百度,点击这个按钮,然后点击!
# 点击热榜第一条
hots = browser.find_elements_by_class_name('title-content-title')
hots[0].click()
单选和多选也是一样,定位到对应的元素,然后点击。
并且偶尔会用到右键,这需要一个新的依赖库。
from selenium.webdriver.common.action_chains import ActionChains
hots = browser.find_elements_by_class_name('title-content-title')
# 鼠标右击
ActionChains(browser).context_click(hots[0]).perform()
# 双击
# ActionChains(browser).double_click(hots[0]).perform()
双击就是double_click,找不到合适的例子就不提了。
这里是可以深挖的ActionChains,就是定义了一系列操作一起执行,当然,一些常用的操作其实就足够了。
徘徊
我不能让它进去。
ActionChains(browser).move_to_element(move).perform()
下拉选择
需要导入相关库,访问MySQL官网选择下载对应的操作系统为例。
from selenium.webdriver.support.select import Select
# 访问mysql下载官网
browser.get(r'https://dev.mysql.com/downloads/mysql/')
select_os = browser.find_element_by_id('os-ga')
# 使用索引选择第三个
Select(select_os).select_by_index(3)
time.sleep(2)
# 使用value选择value="3"的
Select(select_os).select_by_value("3")
time.sleep(2)
# 使用文本值选择macOS
Select(select_os).select_by_visible_text("macOS")
拖
多用于验证码之类的,参考菜鸟示例
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
time.sleep(2)
browser.switch_to.frame('iframeResult')
# 开始位置
source = browser.find_element_by_css_selector("#draggable")
# 结束位置
target = browser.find_element_by_css_selector("#droppable")
# 执行元素的拖放操作
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
# 拖拽
time.sleep(15)
# 关闭浏览器
browser.close()
8. 键盘操作
键盘的大部分操作都有对应的命令,需要导入Keys类
from selenium.webdriver.common.keys import Keys
# 常见键盘操作
send_keys(Keys.BACK_SPACE) # 删除键
send_keys(Keys.SPACE) # 空格键
send_keys(Keys.TAB) # 制表键
send_keys(Keys.ESCAPE) # 回退键
send_keys(Keys.ENTER) # 回车键
send_keys(Keys.CONTRL,'a') # 全选(Ctrl+A)
send_keys(Keys.CONTRL,'c') # 复制(Ctrl+C)
send_keys(Keys.CONTRL,'x') # 剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v') # 粘贴(Ctrl+V)
send_keys(Keys.F1) # 键盘F1
send_keys(Keys.F12) # 键盘F12
9. 其他
延迟等待
可以发现,在上面的程序中,有些效果需要等待延迟才会出现。在实践中,它也需要一定的延迟。一方面认为是爬虫,以免被访问太频繁,另一方面也是网络资源的原因。加载需要一定的时间等待。
# 简单的就可以直接使用
time.sleep(2) # 睡眠2秒
# 还有一些 隐式等待 implicitly_wait 和显示等待 WebDriverWait等操作, 另寻
截屏
可以保存为base64/png/file 三
browser.get_screenshot_as_file('截图.png')
窗户开关
我们的程序是针对当前窗口工作的,但是有时候程序需要切换窗口,所以需要切换当前工作窗口。
# 访问网址:百度
browser.get(r'https://www.baidu.com/')
hots = browser.find_elements_by_class_name('title-content-title')
hots[0].click() # 点击第一个热榜
time.sleep(2)
# 回到第 i 个窗口(按顺序)
browser.switch_to_window(browser.window_handles[0])
time.sleep(2)
hots[1].click() # 点击第一个热榜
当然,如果页面中有iframe元素,需要切换到iframe元素,可以根据它的id进行切换,类似如下
# 切换到子框架
browser.switch_to.frame('iframeResult')
下拉进度条
有些网页的内容是随着进度条的滑动出现的,所以需要把进度条往下拉。这个操作是使用js代码实现的,所以我们需要让浏览器执行js代码,其他js代码类似。
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
10. 防爬
比如上面百度找到,我们需要更好的伪装我们的浏览器浏览器。
browser = webdriver.Chrome()
browser.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{"source": """Object.defineProperty(
navigator,
'webdriver',
{get: () => undefined})"""
}
)
网站检测硒的原理是:
Selenium在打开后给浏览器添加了一些变量值,如:window.navigator.webdriver等。和window.navigator.webdriver一样,在普通谷歌浏览器中是undefined,在selenium打开的谷歌浏览器中为true。网站只需发送js代码,检查这个变量的值给网站,网站判断这个值,如果为真则爬虫程序被拦截或者需要验证码。
当然还有其他的手段,后面会补充。
参考2万字带你了解Selenium全攻略!selenium webdriver打开网页失败,发现是爬虫。解决方案是个人利益
这一次,我回顾了硒的使用。仔细研究的话,操作很详细,模仿真实浏览器的操作是没有问题的。登录和访问非常简单,也可以作为浏览器上的按钮向导使用。
和直接获取资源的爬虫相比,肯定是慢了一点,但是比强大的要好,还是可以提高钓鱼效率的。