浏览器抓取网页(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:。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线