浏览器抓取网页(1.selenium安装selenium库的介绍及安装和常见的使用方法)
优采云 发布时间: 2022-02-07 16:18浏览器抓取网页(1.selenium安装selenium库的介绍及安装和常见的使用方法)
本文是爬虫工具selenium的介绍,包括安装和常用的使用方法,后面会整理出来以备不时之需。
1. 硒安装
Selenium 是一种常用的爬虫工具。相比普通爬虫库,它直接模拟调用浏览器直接运行,可以避免很多反爬机制。在某种程度上,它类似于按钮向导。但它更强大。,更可定制。
首先我们需要在 python 环境中安装 selenium 库。
1
2
3
pip install selenium
# 或
conda install selenium
除了基本的python依赖库外,我们还需要安装浏览器驱动。由于我经常使用chrome,所以这里选择chomedriver,其他浏览器需要找到对应的驱动。
首先打开chrome浏览器,在地址栏输入Chrome://version,查看浏览器对应的版本号,比如我当前的版本是:98.0.4758.82(正式版)(64位)。然后在chromedriver官网找到对应的版本下载并解压。(这是官网,有墙)最后把chromedriver.exe放到python环境的Scripts文件夹下,或者项目文件夹下,或者放到自己喜欢的文件夹下(不是)。
好,那我们就开始我们的学习之旅吧!
2. 基本用法
导入库
1
from selenium import webdriver
如果初始浏览器已经放在 Scripts 文件夹中,会直接调用。
1
2
# 初始化选择chrome浏览器
browser = webdriver.Chrome()
否则需要手动选择浏览器的路径,可以是相对路径,也可以是绝对路径。
1
2
# 初始化选择chrome浏览器
browser = webdriver.Chrome(path)
这时候你会发现自动弹出一个chrome浏览器。如果我们想让程序安静地运行,我们可以设置一个无界面,也称为无头浏览器。
1
2
3
4
5
# 参数设置
option = webdriver.ChromeOptions()
option.add_argument("headless")
browser = webdriver.Chrome(options=option)
访问网址
1
2
# 访问百度
browser.get(r'https://www.baidu.com/')
关闭浏览器
1
2
# 关闭浏览器
browser.close()
3. 浏览器设置
浏览器大小
1
2
3
4
5
# 全屏
browser.maximize_window()
# 分辨率 600*800
browser.set_window_size(600,800)
浏览器刷新和刷新键一样,最好写个异常检测
1
2
3
4
5
6
try:
# 刷新页面
browser.refresh()
print('刷新页面')
except Exception as e:
print('刷新失败')
向前向后
1
2
3
4
# 后退
browser.back()
# 前进
browser.forward()
4. 网页基本信息
当前网页的标题等信息。
1
2
3
4
5
6
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
也可以直接获取网页源代码,可以直接使用正则表达式、Bs4、xpath等工具解析。
1
print(browser.page_source)
5. 定位页面元素
定位页面元素,即直接在浏览器中查找渲染的元素,而不是源码。以下面的搜索框标签为例
1
2
按 id/name/class 定位
1
2
3
4
# 在百度搜索框中输入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')
根据标签定位,但实际上,一个页面上可能有很多相同的标签,这会使标签点模糊,从而导致错误。
1
2
# 在百度搜索框中输入python
browser.find_element_by_tag_name('input').send_keys('python')
link定位,定位连接名,例如定位在百度左上角链接的例子中。
1
2
3
4
5
6
新闻
hao123
地图
...
直接通过链接名称定位。
1
2
# 点击新闻链接
browser.find_element_by_link_text('新闻').click()
但是有时候链接名很长,可以使用模糊定位偏,当然链接指向的只是一.
1
2
# 点击含有闻的链接
browser.find_element_by_partial_link_text('闻').click()
上述xpath定位的方法必须保证元素是唯一的。当元素不唯一时,需要使用xpath进行唯一定位,比如使用xpath查找搜索框的位置。
1
2
# 在百度搜索框中输入python
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python')
CSS定位这个方法比xpath更简洁更快
1
2
# 在百度搜索框中输入python
browser.find_element_by_css_selector('#kw').send_keys('python')
定位多个元素当然,有时候我们只需要多个元素,所以只需要使用复数即可。
1
2
3
4
# element s
browser.find_elements_by_class_name(name)
browser.find_elements_by_id(id_)
browser.find_elements_by_name(name)
6. 获取元素信息
通常在上一步定位元素后,对元素进行一些操作。
获取元素属性比如要获取百度logo的信息,先定位图片元素,再获取信息
1
2
3
4
5
# 先使用上述方法获取百度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循环打印。获取文本时,使用文本获取
1
2
3
4
# 获取热榜
hots = browser.find_elements_by_class_name('title-content-title')
for h in hots:
print(h.text)
获取其他属性以获取例如 id 或 tag
1
2
3
4
5
logo = browser.find_element_by_class_name('index-logo-src')
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)
7. 页面交互
除了直接获取页面的元素外,有时还需要对页面进行一些操作。
在百度搜索框输入/清除“冬奥会”等文字,然后清除
1
2
3
4
5
6
# 首先获取搜索框元素, 然后使用send_keys输入内容
search_bar = browser.find_element_by_id('kw')
search_bar.send_keys('冬奥会')
# 稍微等两秒, 不然就看不见了
time.sleep(2)
search_bar.clear()
提交(Enter) 输入以上内容后,需要点击回车提交,即可得到想要的搜索信息。
2022年2月5日写这篇博文的时候,百度已经发现了selenium,所以需要添加一些伪装的方法。在本文的最后。:point_right:。
1
2
search_bar.send_keys('冬奥会')
search_bar.submit()
单击 当我们需要单击时,使用单击。比如之前的提交,你也可以找到百度,点击这个按钮,然后点击!
1
2
3
# 点击热榜第一条
hots = browser.find_elements_by_class_name('title-content-title')
hots[0].click()
单选和多选也是一样,定位到对应的元素,然后点击。
并且偶尔会用到右键,这需要一个新的依赖库。
1
2
3
4
5
6
7
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,可以深入挖掘,定义一系列操作一起执行。当然,一些常用的操作其实就足够了。
悬停,我无法将其放入。
1
ActionChains(browser).move_to_element(move).perform()
从下拉框中选择需要导入的相关库,访问MySQL官网选择下载对应的操作系统为例。
1
2
3
4
5
6
7
8
9
10
11
12
13
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")
拖拽多用于验证码之类的,参考菜鸟示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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. 其他
延迟等待可以发现,在上面的程序中,有些效果需要延迟等待才能出现。在实践中,它也需要一定的延迟。一方面为了不访问太频繁被认为是爬虫,另一方面也是爬虫。由于网络资源的加载,需要一定的时间等待。
1
2
3
# 简单的就可以直接使用
time.sleep(2) # 睡眠2秒
# 还有一些 隐式等待 implicitly_wait 和显示等待 WebDriverWait等操作, 另寻
截图可以保存为base64/png/file
1
browser.get_screenshot_as_file('截图.png')
窗口切换 我们的程序是针对当前窗口工作的,但是有时候程序需要切换窗口,所以需要切换当前工作窗口。
1
2
3
4
5
6
7
8
9
# 访问网址:百度
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进行切换,类似如下
1
2
# 切换到子框架
browser.switch_to.frame('iframeResult')
下拉进度条 有些网页的内容是随着进度条的滑动出现的,所以需要下拉进度条的操作。这个操作是使用js代码实现的,所以我们需要让浏览器执行js代码,其他js代码类似。
1
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
10. 防爬
比如上面百度找到,我们需要更好的伪装我们的浏览器浏览器。
1
2
3
4
5
6
7
8
9
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打开网页失败,发现是爬虫。解决方案是个人利益
这一次,我回顾了硒的使用。如果仔细观察,操作非常详细。模仿真实的浏览器操作是没有问题的。登录和访问非常简单,也可以作为浏览器上的按钮向导:joy:。
和直接获取资源的爬虫相比,肯定是慢了一些,但是比强大的要好,而且还是可以提高钓鱼效率:+1:。