Python爬虫的Selenium(学习于b站尚硅谷)

news2024/11/25 15:00:26

目录

  • 一、Selenium
    •   1.为什么要学习Selenium
      •   (1)什么是Selenium
      •   (2)为什么使用selenium?
      •   (3)代码演示
    •   2. selenium的基本使用
      •   (1)如何安装selenium
      •   (2)selenium的使用步骤
      •   (3)代码的演示(含初次运行时报错的解决办法、selenium获取网页源码的代码)
    •   3.selenium的元素定位
      •   (1)引
      •   (2)元素定位的定义与方法
      •   (3)代码演示
    •   4.selenium的元素信息
      •   (1)访问元素信息
      •   (2)代码演示
    •   5.selenium的交互
      •   (1)交互
      •   (2)代码演示
  • 二、Phantomjs
    •   1. Phantomjs的基本使用
      •   (1)什么是Phantomjs
      •   (2)如何使用Phantomjs
      •   (3)代码演示
  • 三、Headless
    •   1. Headless的基本使用
      •   (1)什么是Headless
      •   (2)配置
      •   (3)代码的演示

  说明:该文章是学习 尚硅谷在B站上分享的视频 Python爬虫教程小白零基础速通p51-104而记录的笔记,笔记来源于本人,关于python基础可以去CSDN上阅读本人学习黑马程序员的笔记。 若有侵权,请联系本人删除。笔记难免可能出现错误或笔误,若读者发现笔记有错误,欢迎在评论里批评指正。 请合法合理使用爬虫,不爬取任何涉密以及涉及隐私的内容,合理控制请求次数,爬取的内容未经授权请不要用于商用,保护自己,免受牢狱之灾。
在这里插入图片描述
  在学习urllib、解析的时候,我们都是模拟浏览器向服务器发送请求,这样做,数据或多或少有一些数据缺失甚至是无法获取数据,这是由于“模拟浏览器”的行为导致的,会有各种反爬手段判断收到的请求是否是爬虫程序,此时就要引入Selenium,进而驱动真实的浏览器。当然,Selenium存在速度有点慢,效率不够高的问题,当然这也是能解决的,故引入Phantomjs。
  还有一点需要说明,跟着b站视频学习到最后,发现好几个程序在使用selenium操控浏览器时,最后并没有关闭浏览器,大家在学习时可以加上下面的一句代码。

# 关闭浏览器
browser.quit()

一、Selenium

  1.为什么要学习Selenium

  (1)什么是Selenium

在这里插入图片描述

  (2)为什么使用selenium?

  模拟浏览器功能,自动执行网页中的js代码,实现动态加载。

  (3)代码演示

  本次将要演示urllib获取京东(“https://www.jd.com/”)的网页源码,从而说明使用的urllib获取京东的网页源码会缺失秒杀的一些数据,进而引入下一节将要使用的selenium。
在这里插入图片描述
  在PyCharm中创建文件夹“爬虫的Selenium”,创建文件“076_为什么要学习selenium.py”。
在这里插入图片描述
  使用的urllib获取京东的网页源码,搜索秒杀中的数据,发现确实是少了秒杀的内容。因此,下一节将学习并说明selenium能驱动真实浏览器去获取数据,不会缺少内容。

"""
为什么要学习selenium
- 使用urllib爬取爬取京东的网页源码
- 发现京东能检测到该请求是否来源于真实的浏览器
"""
import urllib.request

# 请求地址
url = 'https://www.jd.com/'
# 请求头
headers = {
    'User-Agent': 'ozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Tri-dent/4.0; Hot Lingo 2.0)'
}
# 请求对象定制
request = urllib.request.Request(url=url, headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 读取网页源码
content = response.read().decode('UTF-8')
# 打印
print(content)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  2. selenium的基本使用

  (1)如何安装selenium

在这里插入图片描述
  安装具体步骤如下:①准备需要的浏览器驱动,本人使用的是Edge浏览器,故需要准备和浏览器相同版本的驱动,具体为:先查看浏览器的版本号,再去“https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/”中下载一个版本号相同的浏览器驱动。然后对下载的文件进行解压,再将其中的exe文件复制到文件夹“爬虫的Selenium”中。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  ②安装第三方包selenium,具体为:打开命令提示符,将当前目录切换到文件夹Scripts中,使用安装指令“pip install selenium==3.141.0 -i https://pypi.mirrors.ustc.edu.cn/simple/”后等待一会儿即可安装完成(注意:此处下载selenium时请指定老版本,即3.141.0,不然后续操作可能会出现问题)。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  (2)selenium的使用步骤

在这里插入图片描述

  (3)代码的演示(含初次运行时报错的解决办法、selenium获取网页源码的代码)

  尴尬,之前创的文件“076_为什么要学习selenium.py”的编号写错了,应在PyCharm中选中该文件后,使用重命名快捷键Shift+F6,然后改为“077_为什么要学习selenium.py”。
在这里插入图片描述
  创建文件“078_selenium的基本使用.py”。
在这里插入图片描述
  如下编写代码,运行后报错。查询半天后(“https://blog.csdn.net/weixin_60535956/article/details/131660133”),发现这是由于selenium版本和urllib3版本不兼容导致的。

"""
selenium的基本使用
"""
# (1)导入selenium
from selenium import webdriver

# (2)创建浏览器操作对象
path = "msedgedriver.exe"  # 驱动文件的路径 
browser = webdriver.Edge(path)  # 创建浏览器
# (3)访问网站
# 访问地址
url = 'https://www.baidu.com'
# 浏览器打开网址
browser.get(url)

在这里插入图片描述
  然后,如下图,去修改urllib3的版本为1.26.2,再次运行就好使了。
在这里插入图片描述在这里插入图片描述
  等待一会,安装完成。
在这里插入图片描述
  之后,就可以正常运行程序了。
在这里插入图片描述
  如下继续编写代码,发现selenium获取的京东的网页源码就有秒杀的数据。可见,由于selenium是直接驱动真实浏览器的,不会导致数据的损失。(注:如果还没有获取到秒杀数据,需要加点延时,即代码中的“time.sleep(3)”,然后在网页打开时且在延时时间内滑动浏览器将京东的秒杀数据加载出来)

"""
selenium的基本使用
"""
# (1)导入selenium
from selenium import webdriver
import time

# (2)创建浏览器操作对象
path = "msedgedriver.exe"  # 驱动文件的路径 
browser = webdriver.Edge(path)  # 创建浏览器
# (3)访问网站
# # 访问地址
# url = 'https://www.baidu.com'
# # 浏览器打开网址
# browser.get(url)

# 将网址改成京东
url = 'https://www.jd.com/'
# 浏览器打开网址
browser.get(url)
# 延时加载一会儿网页,以便获取完整的网页源码
time.sleep(3)

# (4)获取网页源码     browser.page_source
content = browser.page_source
# 打印
print(content)

在这里插入图片描述

  3.selenium的元素定位

  (1)引

  如下图所示,如果我们需要使用程序在百度(“https://www.baidu.com/”)中输入“周杰伦”,然后点击“百度一下”,会跳到一个新的页面。其中,使用程序找到“百度一下”的过程称为元素定位。
在这里插入图片描述

  (2)元素定位的定义与方法

在这里插入图片描述
  其实,上面的方法可以改成只记方法find_element/find_elements,这两个方法的语法相同,只是是寻找一个元素还是所有元素的差别,具体使用方法如下:

# 元素定位
# 根据id找到"百度一下"
button = browser.find_element(by='id', value='su')
print(button)

# 根据name找到搜索框
button = browser.find_element(by='name', value='wd')
print(button)

# 根据xpath路径寻找“百度一下”
button = browser.find_element(by='xpath', val-ue='/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input')
print(button)

# 根据标签名字获取对象
button = browser.find_elements(by='tag name', value='input')
print(button)

# 使用bs4的语法来获取对象
button = browser.find_elements(by="css selector", value='#su')
print(button)

# 寻找链接文本(对应html的a标签)
button = browser.find_element(by='link text', value='地图')
print(button)

  (3)代码演示

  创建文件“079_selenium的元素定位.py”。
在这里插入图片描述
  如下编程,熟悉使用元素定位的方法,具体根据id、name等属性、xpath路径、bs4路径、标签名字、链接名字来寻找元素对象。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

"""
selenium的元素定位的演示
"""
from selenium import webdriver

# 浏览器驱动的路径
path = 'msedgedriver.exe'
# 创建浏览器对象
browser = webdriver.Edge(path)
# 百度的地址
url = 'https://www.baidu.com/'
# 访问地址
browser.get(url)

# 元素定位
# 根据id找到"百度一下"
button = browser.find_element(by='id', value='su')
print(button)

# 根据name找到搜索框
button = browser.find_element(by='name', value='wd')
print(button)

# 根据xpath路径寻找“百度一下”
button = browser.find_element(by='xpath', val-ue='/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input')
print(button)

# 根据标签名字获取对象
button = browser.find_elements(by='tag name', value='input')
print(button)

# 使用bs4的语法来获取对象
button = browser.find_elements(by="css selector", value='#su')
print(button)

# 寻找链接文本(对应html的a标签)
button = browser.find_element(by='link text', value='地图')
print(button)

在这里插入图片描述

  4.selenium的元素信息

  (1)访问元素信息

获取元素属性
  .get_attribute(‘class’)
获取元素文本
  text
获取标签名
  tag_name

  (2)代码演示

  如下图所示,本次想要获取元素“百度一下”对应的属性class的值、标签名、和“新闻”的元素文本。
在这里插入图片描述在这里插入图片描述
  创建文件“080_selenium的元素信息.py”。
在这里插入图片描述
  如下编程,熟悉元素信息的语法。

"""
selenium的元素信息
"""
from selenium import webdriver

path = 'msedgedriver.exe'  # 浏览器驱动的路径
browser = webdriver.Edge(path)  # 创建浏览器驱动
url = 'https://www.baidu.com/'  # 访问地址
browser.get(url)  # 浏览器驱动打开地址

# 根据id找到“百度一下”
input = browser.find_element(by='id', value='su')

# 获取标签的属性
result = input.get_attribute('class')
print(result)
# 获取标签的名字
result = input.tag_name
print(result)

# 根据元素文本获取相应的链接
input = browser.find_element(by='link text', value='新闻')
# 获取元素文本
result = input.text
print(result)

在这里插入图片描述

  5.selenium的交互

  (1)交互

点击:click()
输入:send_keys()
后退操作:browser.back()
前进操作:browser.forword()
模拟JS滚动:
  js=‘document.documentElement.scrollTop=100000’
  browser.execute_script(js) 执行js代a码
获取网页代码:page_source
退出:browser.quit()

  (2)代码演示

  如下图,本次需要通过程序使浏览器使用百度搜索“周杰伦”,然后点到第2页,再使用一下后退、前进操作,然后再滚动到页末。
在这里插入图片描述
  创建文件“081_selenium的交互.py”。
在这里插入图片描述
  在编程时,需要知道百度搜索框的id为“kw”,“百度一下”的id为“su”,搜索后元素“下一页”含有class=“n”,当然,其他标签可能具有相同class的属性值,故可以打开xpath插件进行验证,然后在PyCharm中使用xpath路径定位到该元素。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  如下完成编程并运行。

"""
selenium的交互
"""
import time

from selenium import webdriver

# 创建浏览器对象
path = 'msedgedriver.exe'
browser = webdriver.Edge(path)

# 访问地址
url = 'https://www.baidu.com/'
# 打开地址
browser.get(url)
# 睡眠2s
time.sleep(2)

# 获取文本框对象
input = browser.find_element(by='id', value='kw')
# 在文本框中输入“周杰伦”
input.send_keys('周杰伦')
# 睡眠2s
time.sleep(2)

# 获取“百度一下”的按钮
button = browser.find_element(by='id', value='su')
# 点击“百度一下”的按钮
button.click()
# 睡眠2s
time.sleep(2)

# 滑倒底部
js_bottom = 'document.documentElement.scrollTop=100000'  # 距离顶部的距离为100,000
browser.execute_script(js_bottom)  # 执行操作
# 睡眠2s
time.sleep(2)

# 获取下一页的按钮
next = browser.find_element(by='xpath', value='//a[@class="n"]')
# 点击下一页
next.click()
# 睡眠2s
time.sleep(2)

# 回退到上一页
browser.back()
# 睡眠2s
time.sleep(2)

# 前进
browser.forward()
# 睡眠2s
time.sleep(2)

# 退出浏览器
browser.quit()

在这里插入图片描述

二、Phantomjs

  1. Phantomjs的基本使用

  在前面的学习中,发现Selenium,每次执行过程中都需打开浏览器、关闭浏览器、中间还有一堆操作,这是因为它有页面,而页面里面会有js、css等等很多文件,因此打开页面会导致代码的性能很慢。因此提出Phantomjs、Chrome handless,目前Phantomjs已逐渐淘汰。

  (1)什么是Phantomjs

(1)是一个无界面的浏览器
(2)支持页面元素查找,js的执行等
(3)由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多

  (2)如何使用Phantomjs

(1)获取Phantomjs.exe文件路径path
(2)browser= webdriver.PhantomJs(path)
(3)browser.get(url)
扩展:保存屏幕快照:browser.save_screenshot(‘baidu.png’)

  具体步骤:①到网站中“https://phantomjs.org/download.html”下载文件“phantomjs.exe”。然后将该文件进行解压,再复制其中的文件“phantomjs.exe”,到文件夹“爬虫的Selenium”中进行粘贴。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
  ②然后就可以到PyCharm中去编写使用Phantomjs的代码了。

  (3)代码演示

  创建文件“082_phantomjs的基本使用.py”。
在这里插入图片描述
  创建文件夹“082_phantomjs的基本使用”。
在这里插入图片描述
  如下编程并运行。只是有红字警告,告诉我们Phantomjs已经停更。

"""
phantomjs的基本使用
"""
from selenium import webdriver
import time

path = 'phantomjs.exe'
browser = webdriver.PhantomJS(path)
url = 'https://www.baidu.com'
browser.get(url)

# 拍张快照
browser.save_screenshot('./082_phantomjs的基本使用/baidu.png')
# 睡眠2s
time.sleep(1)

input = browser.find_element(by='id', value='kw')
input.send_keys('昆凌')

time.sleep(1)
browser.save_screenshot('./082_phantomjs的基本使用/kunling.png')

在这里插入图片描述

三、Headless

  1. Headless的基本使用

  (1)什么是Headless

  如下图,Edge也有 Headless,且与Chrome类似。
在这里插入图片描述
  经过半天的尝试与搜索,终于发现Edge的无头浏览器的正确使用方法(“https://huaweicloud.csdn.net/63808b3ddacf622b8df8a37e.html”)。首先,需要如下图所示,将selenium的版本更新到4.3.0及以上(本人安装的4.3.0),3开头的版本是不支持无头的Edge浏览器的。它的配置与Chrome也不一样。需要说明的是,本节关于Chrome的截图使用的selenium版本为3.141.0。
在这里插入图片描述
在这里插入图片描述

  (2)配置

  下图是无头的Chrome浏览器的配置,在使用时,将它复制到程序中,然后根据实际安装的Chrome浏览器的位置填写路径。之后再根据selenium的语法完成相应的功能。
在这里插入图片描述
  Edge的配置与Chrome不一样,具体如下(不过使用方法相同):

from selenium import webdriver  # 导入selenium库
from selenium.webdriver.edge.options import Options  # 导入浏览器设置相关的类

# 无可视化界面设置
edge_options = Options()
# 使用无头模式
edge_options.add_argument('--headless')
# 禁用GPU,防止无头模式出现莫名的BUG
edge_options.add_argument('--disable-gpu')
# 将参数传给浏览器
browser = webdriver.Edge(options=edge_options)

  (3)代码的演示

  创建文件“083_无头浏览器的使用.py”。
在这里插入图片描述
  如下编写代码,学会无头浏览器的使用。

"""
无头浏览器的使用
"""
from selenium import webdriver  # 导入selenium库
from selenium.webdriver.edge.options import Options  # 导入浏览器设置相关的类


# 封装的headless
def share_browser():
    # 无可视化界面设置
    edge_options = Options()
    # 使用无头模式
    edge_options.add_argument('--headless')
    # 禁用GPU,防止无头模式出现莫名的BUG
    edge_options.add_argument('--disable-gpu')
    # 将参数传给浏览器
    browser = webdriver.Edge(options=edge_options)
    return browser


browser = share_browser()
# 启动浏览器
url = "https://baidu.com"
browser.get(url)
browser.save_screenshot('baidu.png')

# 关闭浏览器
browser.quit()

在这里插入图片描述
  好了,本章的笔记到此结束,谢谢大家阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter如何压测和存储

一、存储过程准备: 1、建立一个空表: 1 CREATE TABLE test_data ( id NUMBER, name VARCHAR2(50), age NUMBER ); 2、建立一个存储过程: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE insert_test_data (n IN NUMBER) AS BEGIN --E…

【工程优化问题】基于多种智能优化算法的压力容器设计问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux内核应该怎么去学习?

通过阅读源码来学习操作系统要注意区分共性与平台特性。 1. 中断响应是共性,8259 中断控制器和 IDT 是 x86 的特性。 2. 虚拟内存管理是共性,x86 的 GDT 和 LDT 是特性,而且现在的系统也只是走个过场而已。 3. 任务调度与上下文切换是共性&am…

44.实现爱尔兰B公式计算并输出表格(matlab程序)

1.简述 1.话务量定义 话务量指在一特定时间内呼叫次数与每次呼叫平均占用时间的乘积。 话务量反映了电话负荷的大小,与呼叫强度和呼叫保持时间有关。呼叫强度是单位时间内发生的呼叫次数,呼叫保持时间也就是占用时间。 话务量计算方法 话务量公式为…

智安网络|恶意软件在网络安全中的危害与应对策略

恶意软件是指一类具有恶意目的的软件程序,恶意软件是网络安全领域中的一个严重威胁,给个人用户、企业和整个网络生态带来巨大的危害。通过潜伏于合法软件、邮件附件、下载链接等途径传播,破坏用户计算机系统、窃取敏感信息、进行勒索等不法行…

C语言经典小游戏之扫雷(超详解释+源码)

“少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现! 扫雷小游戏 1.游戏介绍2.游戏准备3.游戏实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2打印棋盘3.3布置雷…

Linux root用户执行修改密码命令,提示 Permission denied

问题 linux系统中(ubuntu20),root用户下执行passwd命令,提示 passwd: Permission denied ,如下图: 排查 1.执行 ll /usr/bin/passwd ,查看文件权限是否正确,正常情况是 -rwsr-xr…

VAE、 EM、KL散度

文章目录 VAEVAE额外的损失函数 EMKL散度 VAE 左图相当于变量x,右图相当于z 假如在AE中,一张满月的图片作为输入,模型得到的输出是一张满月的图片;一张弦月的图片作为输入,模型得到的是一张弦月的图片。当从满月的code…

SpringBoot复习:(22)ConfigurationProperties和@PropertySource配合使用及JSR303校验

一、配置类 package cn.edu.tju.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component;Component ConfigurationPropertie…

C++初阶——函数重载

前言:C中除了可以在不同的命名空间中使用同名函数,还有一种支持在同一个作用域中同名函数的方式——函数重载。 函数重载 一.什么是函数重载?二.函数重载的3种规则三.特殊情况 一.什么是函数重载? C允许同样同一作用域中声明几个功…

IPWorks OFX Delphi Edition Crack

IPWorks OFX Delphi Edition Crack IPWorks OFX由可以访问电子交易信息的组件组成,并包括银行转账和付款提交等功能。这些组件使应用程序开发人员能够构建包含更快、更准确的交易对账、发送即时交易通知以及完全关闭支付和会计之间循环的解决方案。 IPWorks OFX功能…

请求接口时报异常:org.springframework.web.multipart.MultipartException

请求接口时报异常:org.springframework.web.multipart.MultipartException: Current request is not a multipart request 检查后发现自己忘记传文件参数 添加参数后请求正常。

软件测试的生命周期

目录 软件测试&软件开发生命周期 如何描述一个bug? 如何定义bug的级别 bug的生命周期 测试的执行和BUG管理 产生争执怎么办(处理人际关系) 软件测试&软件开发生命周期 需求阶段 --测试人员需要了解需求, 对需求进行分解得出测试需求 计…

python的virtualenv虚拟环境无法激活activate

目录 问题描述: 解决办法: 解决结果: 问题描述: PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…

全网最牛,在Linux系统上安装Git详细步骤,看这一篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 yum安装 1、在Li…

学习笔记-JVM-对象结构及生命周期

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 对象的创建流程 常量池检查:检查new指令是否能在常…

代码随想录—力扣算法题:209长度最小的子数组.Java版(示例代码与导图详解)

版本说明 当前版本号[20230808]。 版本修改说明20230808初版 目录 文章目录 版本说明目录209.长度最小的子数组思路暴力解法滑动窗口 两种方法的区别总结 209.长度最小的子数组 力扣题目链接 更多内容可点击此处跳转到代码随想录,看原版文件 给定一个含有 n 个…

k8sday01

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物…

FreeRTOS(系统配置)

一、FreeRTOSConfig.h文件 FreeRTOS的系统配置文件为FreeRTOSConfig.h,在此配置文件中可完成FreeRTOS的裁剪与配置。 FreeRTOSConfig.h 根据正在构建的应用程序定制 FreeRTOS 内核。因此,它特定于应用程序,而不是 FreeRTOS,并且应…

The Sandbox 与 D.OASIS 联手打造 D.OASIS 城市

我们非常高兴地宣布与 D.OASIS 建立合作伙伴关系,共同打造无与伦比的娱乐体验:The Sandbox 中的 D.OASIS 城市! 作为合作的一部分,The Sandbox 和D.OASIS将共同打造 D.OASIS 城市,一座充满无限可能的大都市&#xff0…