selenium学习记录

1、初识selenium

概述

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

下载与参考网址

PyPI网站下载 Selenium库 Links for selenium ,也可以用 第三方管理器

Selenium 官方参考文档:Selenium with Python — Selenium Python Bindings 2 documentation

实操:本实操演示利用edge浏览器从零开始完成selenium访问百度首页并将返回的结果打印。

①、准备edge浏览器:下载 Microsoft Edge

②、下载edge驱动:Microsoft Edge WebDriver | Microsoft Edge Developer

注意:下载的驱动一定要和自己的浏览器大版本对应,下面是我的edge版本:

下面是我下载的驱动(下载的驱动是127版本,浏览器版本也是127):

将解压后的msedgedriver.exe解压到本课程的目录下(D:\mySelenium),本课程的所有实操都将在该目录中:

③、在pycharm中下载selenium:

# 终端中运行如下代码(Alt+F12)
pip install selenium

运行结果如下:

④、编辑爬虫文件exe01.py(文件名可自定义):

以下是pycharm中的文件结构供参考:

from selenium import  webdriver
from selenium.webdriver.edge.service import Service
# 设置edge的驱动程序
service = Service('./msedgedriver.exe')
# 创建一个浏览器
edge = webdriver.Edge(service=service)
# 发送请求
edge.get('http://www.baidu.com')
# 获取html
page_info = edge.page_source
# 打印获取的html
print(page_info)
# 关闭浏览器
edge. Quit()

运行结果如下:


2、selenium控制浏览器

2.1、最大窗口化

概述:调用启动的浏览器默认不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。

# 设置edge的驱动程序
service = Service('./msedgedriver.exe')
# 创建一个浏览器
edge = webdriver.Edge(service=service)
# 发送请求
edge.get('目标网址')
# 最大化窗口
edge.maximize_window()

2.2、设置窗口的宽高

概述:通过设置窗口的宽高可以更加灵活的设置窗口的显示效果。

# 设置edge的驱动程序
service = Service('./msedgedriver.exe')
# 创建一个浏览器
edge = webdriver.Edge(service=service)
# 发送请求
edge.get('目标网址')
# 将窗口大小设置为指定的宽高
edge.set_window_size(1000,700)

2.3、浏览器页面的前进与后退

概述:浏览器上有一个后退、前进按钮,可以通过这两个按钮实现页面的前进与回退。

import time
from selenium import  webdriver
from selenium.webdriver.edge.service import Service
# 设置edge的驱动程序
service = Service('./msedgedriver.exe')
# 创建一个浏览器
edge = webdriver.Edge(service=service)
# 发送请求
edge.get('http://www.baidu.com')
time.sleep(2)
edge.get('https://news.baidu.com/')
time.sleep(2)
# 页面回退
edge.back()
time.sleep(2)
# 页面前进
edge.forward()
time.sleep(2)
# 关闭浏览器
edge. Quit()

3、元素的定位与操作

概述:对象的定位应该是自动化的核心,要想操作一个对象,首先应该识别这个对象。 一个对象就是一个人一样,他会有各种的特征(属性),例如我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。

元素定位

webdriver提供了对象定位方法:

  • find_element(type,value)
  • find_elements(type,value)

利用 By 类来确定哪种选择方式

from selenium.webdriver.common.by import By
edge.find_element(by=By.ID,value='su')

By 类的一些属性如下

  • ID = "id"
  • NAME = "name"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"

元素操作

前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。

鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。

一般来说,webdriver中比较常用的操作对象的方法有下面几个

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象的内容,如果可以的话

实操:本实操通过定位必应的搜索框并输入内容和定位搜索按钮并点击搜索按钮的操作巩固利用selenium定位并操作元素。

import time
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
def findelement(url):# 创建浏览器驱动service = Service('./msedgedriver.exe')# 创建浏览器edge = webdriver.Edge(service=service)# 全屏显示edge.maximize_window()# 发送请求edge.get(url)# 定位搜索框并输入内容search_box = edge.find_element(by=By.ID,value='sb_form_q')search_box.send_keys('沐曦可期')time. Sleep(2)# 定位搜索按钮并点击search_bt = edge.find_element(by=By.ID,value='search_icon')search_bt.click()time.sleep(5)# 关闭浏览器edge.close()if __name__ == '__main__':url = 'https://cn.bing.com/'findelement(url)

运行结果如下:


4、定位下拉菜单

概述:本小节没有新增的知识点,是对第3节中所学知识在特定场景的使用练习。

实操:本实操通过点击下拉菜单中指定按钮的实操巩固元素的定位与操作。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
def menu_element():# 创建浏览器edge = webdriver.Edge(service=Service('msedgedriver.exe'))# 向目标地址发送请求edge.get('https://www.bootstrap.cn/doc/book/3')edge.maximize_window()sleep(2)# 定位下拉菜单并点击(定位父级元素)edge.find_element(by=By.ID,value='btn21').click()sleep(2)# 定位菜单中的特定项并点击(定位子级元素)element = edge.find_element(by=By.LINK_TEXT,value='1.4 Bootstrap5中文手册要点导航').click()sleep(2)# 关闭浏览器edge.close()if __name__ == '__main__':menu_element()

运行结果如下:

为了达到反爬的效果,下面为上述代码添加一个滑动光标的操作(上面的代码是立即定位到指定元素并点击,会被部分网站反爬,因此下面尝试添加一个滑动光标的动作)

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
def menu_element():# 创建浏览器edge = webdriver.Edge(service=Service('msedgedriver.exe'))# 向目标地址发送请求edge.get('https://www.bootstrap.cn/doc/book/3')edge.maximize_window()sleep(2)# 定位下拉菜单并点击(定位父级元素)edge.find_element(by=By.ID,value='btn21').click()sleep(2)# 获取子级元素的位置element = edge.find_element(by=By.LINK_TEXT,value='1.4 Bootstrap5中文手册要点导航')# 做一个移动光标的操作(为浏览器定义一个动作,移动到指定元素,最后执行该动作)# 下面通过pause()指定了拖动光标移动花费了2秒webdriver.ActionChains(edge).move_to_element(element).pause(2).perform()sleep(5)# 点击目标子元素element.click()# 关闭浏览器edge.close()if __name__ == '__main__':menu_element()

实现效果与上面的代码一样。


5、层级定位

概述

对于一个现代的web应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame中,seelnium webdriver 提供了一个switch_to_frame方法,可以很轻松的来解决这个问题

多层框架或窗口的定位:

  • edge.switch_to.frame()

实操前准备:在python文件的同级目录创建如下两个html文件一遍测试:

inner.html

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><title>inner</title>
</head>
<body><div class="row-fluid"><div class="span6 well"><h3>inner</h3><iframe id="f2" src="https://www.hao123.com/" width="1400" height="600"></iframe></div></div>
</body>
</html>

frame.html

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><title>frame</title><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script><link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"rel="stylesheet"/>
</head><body><div class="row-fluid"><div class="span10 well"><h3>frame</h3><iframe id="f1" src="inner.html" width="1500" , height="700"></iframe></div></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/@bootcss/v3.bootcss.com@1.0.8/dist/js/bootstrap.min.js"></script>
</html>

实操:尝试利用selenium访问frame.html文件,并在frame.html文件中包含的inner.html文件的搜索框内搜索沐曦可期。

按照前面学习的经验,我写了如下代码:

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import osdef frame():# 创建浏览器和驱动edge = webdriver.Edge(service=Service('msedgedriver.exe'))# 设置为全屏显示edge.maximize_window()# 发送请求edge.get(os.path.abspath('./frame.html'))sleep(2)# 定位搜索框edge.find_element(by=By.CLASS_NAME,value='textInput input-hook').send_keys('沐曦可期')sleep(2)# 定位搜索按钮edge.find_element(by=By.CLASS_NAME,value='g-cp submitInput button-hook s_btn').click()sleep(2)# 关闭连接edge.quit()if __name__ == '__main__':frame()

运行结果如下:该错误说明根本就没有定位到对应的元素。

分析:产生这个结果的原因其实就是html代码分为两个层级,我们一直在frame.html文件中定位,但内容却在inner.html文件中,如果想要定位到inner.html文件中的内容就需要切换到inner.html文件所在的层级。

下图是frame文件中的代码,由高亮处的代码可知inner.html文件所在的层级id为f1:

如果只切换一次还不够,下图是inner.html文件的代码,由高亮代码可知,该界面里还包含了一个外站的界面,而且我们要定位的元素就在这个外站界面中,因此切换到inner.html文件中后,还要再切换到外站链接中。

修改代码如下:

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import osdef frame():# 创建浏览器和驱动edge = webdriver.Edge(service=Service('msedgedriver.exe'))# 设置为全屏显示edge.maximize_window()# 发送请求edge.get(os.path.abspath('./frame.html'))sleep(2)# 切换到inner.html文件所在的层级edge.switch_to.frame('f1')# 切换到外站链接界面www.hao123.comedge.switch_to.frame('f2')# 定位搜索框edge.find_element(by=By.CLASS_NAME,value='textInput').send_keys('沐曦可期')sleep(2)# 定位搜索按钮edge.find_element(by=By.CLASS_NAME,value='s_btn').click()sleep(5)# 关闭连接edge.quit()if __name__ == '__main__':frame()

运行结果如下:


6、定位选择框

概述:在爬取数据时,有时数据太多不方便精准选择,此时就可以考虑使用具有筛选功能的xpath进行筛选,只需要定位元素,然后点击即可。

实操前准备:提取在python同级目录创建一个html文件,内容如下(我取名为meniu.html):

<!DOCTYPE html>
<html>
<body>
<select id="ShippingMethod1" onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod"><option value="12.51">UPS Next Day Air ==> $12.51</option><option value="11.61">UPS Next Day Air Saver ==> $11.61</option><option value="10.69">UPS 3 Day Select ==> $10.69</option><option value="9.03">UPS 2nd Day Air ==> $9.03</option><option value="8.34">UPS Ground ==> $8.34</option><option value="9.25">USPS Priority Mail Insured ==> $9.25</option><option value="7.45">USPS Priority Mail ==> $7.45</option><option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
<select id="ShippingMethod2" onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod"><option value="13.51">UPS Next Day Air ==> $13.51</option><option value="14.61">UPS Next Day Air Saver ==> $14.61</option><option value="15.69">UPS 3 Day Select ==> $15.69</option><option value="19.03">UPS 2nd Day Air ==> $19.03</option><option value="18.34">UPS Ground ==> $18.34</option><option value="19.25">USPS Priority Mail Insured ==> $19.25</option><option value="17.45">USPS Priority Mail ==> $17.45</option><option value="13.20" selected="">USPS First Class ==> $13.20</option>
</select>
</body>
</html>

实操:通过xpath定位meniu.html文件中的两个选择框,第一个选择框选择9.25,第二个选择框选择19.03。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import os# 创建浏览器和驱动
edge = webdriver.Edge(service=Service('./msedgedriver.exe'))
# 发送请求
edge.get(os.path.abspath('./meniu.html'))
# 设置全屏
edge.maximize_window()
sleep(2)
# 定位第一个选择框并选择
edge.find_element(by=By.XPATH,value='//select[@id="ShippingMethod1"]/option[@value=9.03]').click()
sleep(2)
# 定位第二个选择框并选择
edge.find_element(by=By.XPATH,value='//select[@id="ShippingMethod2"]/option[@value=19.03]').click()
sleep(5)
# 关闭连接
edge.quit()

运行结果如下:


7、处理弹出窗

概述:有时页面可能会弹窗口。只需要去定位弹窗上的“确定”按钮即可。

  • switch_to

    焦点集中到页面上的一个警告(提示)

  • accept()

    接受警告提示

切换至弹窗:

chrome.switch_to.alert.accept() # 推荐
chrome.switch_to_alert().accept() # 过期

实操前准备:在python文件的同级目录创建close_window.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>This is a page</title>
</head>
<body><div id = "container"><div style="font: size 30px;">Hello,Python Spider</div></div>
</body>
<script>alert('测试弹窗')
</script>
</html>

实操:关闭close_window.html文件中的弹窗。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import osdef close_window():# 创建浏览器和驱动edge = webdriver.Edge(service=Service('./msedgedriver.exe'))# 发送请求edge.get(os.path.abspath('./close_window.html'))sleep(2)# 定位弹窗并点击edge.switch_to.alert.accept()sleep(5)# 关闭连接edge.quit()if __name__ == '__main__':close_window()

运行结果如下:


8、拖拽元素

概述:要完成元素的拖拽,首先需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现,ActionChains用于定制动作。通过ActionChains对象中的perform()执行动作。

实操前准备:在python文件同级目录创建一个名为drag.html的文件,内容如下:

<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>jQuery UI Draggable - Auto-scroll</title><link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"><style>#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }body {font-family: Arial, Helvetica, sans-serif;}table {font-size: 1em;}.ui-draggable, .ui-droppable {background-position: top;}</style><script src="https://code.jquery.com/jquery-1.12.4.js"></script><script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script><script>$( function() {$( "#draggable" ).draggable({ scroll: true });$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });} );</script>
</head>
<body>
<div id="draggable" class="ui-widget-content"><p>Scroll set to true, default settings</p>
</div><div id="draggable2" class="ui-widget-content"><p>scrollSensitivity set to 100</p>
</div><div id="draggable3" class="ui-widget-content"><p>scrollSpeed set to 100</p>
</div>
<div style="height: 5000px; width: 1px;"></div>
</body>
</html>

实操:通过本实操了解selenium拖拽元素的方法。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
import os
def drag_and_drop():# 创建浏览器和驱动edge = webdriver.Edge(service=Service('./msedgedriver.exe'))# 发送请求edge.get(os.path.abspath('./drag.html'))# 设置全屏edge.maximize_window()sleep(2)# 定位元素div1 = edge.find_element(by=By.ID,value='draggable')div2 = edge.find_element(by=By.ID,value='draggable2')div3 = edge.find_element(by=By.ID,value='draggable3')# 设置拖拽事件# 将div1拖拽到div2的位置webdriver.ActionChains(edge).drag_and_drop(div1,div2).perform()sleep(2)# div3每次向右移动20像素,向下移动15像素,共移动10次for i in range(10):webdriver.ActionChains(edge).drag_and_drop_by_offset(div3,20,15).perform()sleep(0.5)sleep(6)# 关闭连接edge.quit()if __name__ == '__main__':drag_and_drop()

运行结果如下:


9、调用JS

概述:有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。

一般用到操作滚动条的会两个场景:

  1. 要操作的页面元素不在当前页面范围,无法进行操作,需要拖动滚动条
  2. 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方

调用js的方法

execute_script(script, *args)

滚动条回到顶部

js="document.getElementById('id').scrollTop=0"
driver.execute_script(js)

滚动条拉到底部

js="document.documentElement.scrollTop=10000"
driver.execute_script(js)

提示:可以修改scrollTop 的值,来定位右侧滚动条的位置,0是最上面,10000是最底部

以上方法在Firefox和IE浏览器(Edge)上是可以的,但是在Chrome浏览器中是不管用的。解决办法:

js = "document.body.scrollTop=0"
driver.execute_script(js) 

移动横向滚动条

js = "window.scrollTo(100,400)"
driver.execute_script(js)

实操:在前面的学习中我们了解到某扑的官网是一个动态页面,通过下拉页面获取数据,这里利用该网站验证我们下拉滚动条的作用。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from time import sleep
from lxml import etree
def scroll_bar():# 创建浏览器和驱动edge = webdriver.Edge(service=Service('./msedgedriver.exe'))# 发送请求edge.get('https://www.hupu.com/')# 设置全屏显示edge.maximize_window()# 打印获取的所有标题sleep(2)e = etree.HTML(edge.page_source)title = e.xpath('//div[@class="item-title-conent"]/text()')print("第一次获取所有的标题:",[t for t in title])print('第一次获取的数据条数:',len(title))sleep(2)# 滑动滚动条js = 'document.documentElement.scrollTop=10000'edge.execute_script(js)sleep(3)# 创建一个etree对象解析数据e = etree.HTML(edge.page_source)title = e.xpath('//div[@class="item-title-conent"]/text()')# 再次打印获取的所有标题print('滑动滚动条后获取的数据:',[t for t in title])print('第二次获取的数据条数:',len(title))sleep(5)edge.quit()if __name__ == '__main__':scroll_bar()

运行结果如下:


10、等待元素

需要等待元素的场景

  • 网速慢
  • AJAX请求数据
  • 调试

10.1、强制等待

概述:使用 time.sleep()指定等待时间;

作用:当代码运行到强制等待这一行的时候,无论出于什么原因,都强制等待指定的时间,需要通过time模块实现;

优点:简单;

缺点:无法做有效的判断,会浪费时间。


10.2、隐式等待

概述:到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行;

edge.implicitly_wait(time_num)

优点: 设置一次即可;

缺点:必须等待加载完成才能到后续的操作,或者等待超时才能进入后续的操作。

示例

from selenium import webdriverurl = 'https://www.baidu.com/'
edge = webdriver.Edge()
edge.get(url)
edge.implicitly_wait(10)
print(edge.find_element_by_class_name('next'))
print(edge.page_source)

10.3、显式等待

概述:指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回;

from selenium.webdriver.support.wait import WebDriverWait

优点:专门用于对指定一个元素等待,加载完即可运行后续代码;

缺点:多个元素都需要要单独设置等待。

示例

from selenium.webdriver.support.wait import WebDriverWaiturl = 'https://www.guazi.com/nj/buy/'
edge = webdriver.Edge()
edge.get(url)
# 共等待10秒,每0.5秒检测一次
wait = WebDriverWait(edge,10,0.5)
# until用于指定等待的元素
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'next')))
print(edge.page_source)

11、参数的使用

11.1、设置无头浏览器

概述:无头浏览器就是在程序运行过程中不再显示浏览器。

实操:将浏览器设置为无头浏览器访问百度,并打印响应结果。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver import EdgeOptionsdef headerless():# 通过参数将浏览器设置成无头浏览器(如果是chrome浏览器就需要将参数修改为--headless)# 创建 EdgeOptions 对象并设置为无头模式# 注意:以下两条语句要分开写,写成一条语句就不会生效options = EdgeOptions()options.add_argument('headless')# 启动一个Edge浏览器并创建驱动edge = webdriver.Edge(service=Service('./msedgedriver.exe'),options=options)# 访问目标地址edge.get('https://www.baidu.com')# 打印响应信息print(edge.page_source)# 关闭浏览器edge.quit()if __name__ == '__main__':headerless()

运行结果如下:


11.2、设置代理

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver import EdgeOptionsdef proxy():# 创建 EdgeOptions 对象并设置代理# 注意:以下两条语句要分开写,写成一条语句就不会生效options = EdgeOptions()# 标准格式:options.add_argument('--proxy-server=http://ip:port')options.add_argument('--proxy-server=http://123.103.51.22:3128')# 启动一个Edge浏览器并创建驱动edge = webdriver.Edge(service=Service('./msedgedriver.exe'),options=options)# 访问目标地址edge.get('https://httpbin.org/get')# 打印响应信息print(edge.page_source)# 关闭浏览器edge.quit()if __name__ == '__main__':proxy()

运行结果如下:


11.3、防检测设置

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver import EdgeOptionsdef detection_proof():option = EdgeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])edge = webdriver.Edge(service=Service('./msedgedriver.exe'), options=option)edge.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => false})"""})edge.get('https://www.httpbin.org/get')print(edge.page_source)edge.quit()if __name__ == '__main__':detection_proof()

12、实战

要求:利用selenium获取某牙的直播间的标题,主播名和直播间热度。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from lxml import etree
from time import sleepdef get_data():# 创建驱动并启动浏览器edge = webdriver.Edge(service=Service('./msedgedriver.exe'))# 发送请求edge.get('https://www.huya.com/g/862')while True:sleep(6)# 提取数据e = etree.HTML(edge.page_source)names = e.xpath('//i[@class="nick"]/text()')heats = e.xpath('//i[@class="js-num"]/text()')titles = e.xpath('//a[@class="title"]/text()')sleep(2)# 打印数据for name,heat,title in zip(names,heats,titles):print(f"主播名:{name},热度:{heat},直播标题:{title}")try:# 定位下一页的按钮并点击edge.find_element(by=By.CLASS_NAME,value='laypage_next').click()sleep(2)except:break# 关闭浏览器edge.quit()if __name__ == '__main__':get_data()

运行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TXT文件转换pdf格式的java方法

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version> </dependency>接下来&#xff0c;编写一个方法来执行文件转换&#xff1a; import com.itextpdf.text.Document…

计算机网络-物理层

物理层 基本概念 物理层考虑怎样才能在连接各种计算机的传输媒体上传输数据比特流 物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本层的协议和服务&#xff0c;而不必考虑网络具体的传输媒体是什么 物理层协议主要任务 机械特性&am…

小兔鲜首页制作css

一、项目目录 项目名-客户端 xtx-pc 1.images&#xff1a;存放固定使用的图片&#xff0c;例如&#xff1a;logo、样式修饰图 2.uploads:存放非固定图片&#xff0c;例如&#xff1a;商品图、宣传图等需要上传的图片 3.iconfont:字体图标素材 4.css文件&#xff1a; 4.1base.cs…

C语言 | Leetcode C语言题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; int getSum(int a, int b){ int c; while(b) {c(unsigned int)(a&b)<<1;a^b;bc; }return a; }

资产架构端口应用CDNWAF站库分离负载均衡

知识点&#xff1a; 1、资产架构-端口&目录&插件接口&多站点&多应用 2、番外安全-域名&服务器本身&服务厂商&管理人员 3、考虑阻碍-站库分离&CDN&WAF&负载均衡&主机防护 详细点&#xff1a; 1、前置条件-购买使用-云服务器&a…

第135天:内网安全-横向移动非约束委派约束委派数据库攻防

案例一: 横向移动-原理利用-非约束委派 该案例建立了解即可&#xff0c;真实环境应该不可能有人这样配置 非约束委派的原理和利用场景 原理&#xff1a; 机器 A &#xff08;域控&#xff09;访问具有非约束委派权限的机器 B 的服务&#xff0c;会把当前认证用户&#x…

Admin.NET源码学习(4:基于Furion的后台服务启动方式浅析)

Admin.NET为前后端分离架构&#xff0c;后台服务的入口项目为Admin.NET.Web.Entry&#xff0c;其与其它项目的依赖关系如下图所示。   由于项目采用Furion框架&#xff0c;后台服务启动方式、注册方式、配置方式等方面与常规的asp.net core项目差异明显&#xff0c;初步接触…

初识C语言指针(5)

目录 1. 回调函数 2. qsort函数 2.1 qsort函数的基本参数 2.2 qsort函数的使用 2.3 qsort排序结构体类型数据 结语 1. 回调函数 什么是回调函数呢&#xff1f;回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文…

《黑神话:悟空》中的实景三维建模

这几天&#xff0c;国产游戏《黑神话:悟空》终于面世&#xff0c;迅速引爆了全球游戏市场。作为一款以《西游记》为背景的3A级动作角色扮演游戏&#xff0c;《黑神话:悟空》不仅在文化表达上极具吸引力&#xff0c;其背后的技术实力更是令人瞩目。本文将深入探讨&#xff0c;3A…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口&#xff1a; RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中&#xff0c;寻找main函数在逆向分析中是非常重要的&#xff0c;它是程序的核心执行点&#xff0c;从这里开始&#xff0c;程序的主要逻辑开始展开&#xff1b;在这边我们需要明确两个概念&#xff1a;用户入口&#xff08;User Entry Point&#xff09; 和 …

【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;三&#xff09; 前言 今天整理蓝牙Demo代码&#xff0c;查看官网时发现自己帐号没有登录&#xff0c;竟然也可以访问最新的API文档&#xff0c;真是喜大奔普。看来华为已经开始对外开放最新的API文档&#xff0c;不再有白名单…

《机器学习》—— 使用过采样方法实现逻辑回归分类问题

文章目录 一、什么是过采样方法&#xff1f;二、使用过采样方法实现逻辑回归分类问题三、过采样的优缺点 本篇内容是 基于Python的scikit-learn库中sklearn.linear_model 类中的 LogisticRegression&#xff08;&#xff09;逻辑回归方法实现的&#xff0c;其内容中只是在处理…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日&#xff0c;时间过得很快&#xff0c;2024…

芯片后端之 PT 使用 report_timing 产生报告 之 -include_hierarchical_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路…

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

VSCode插件 live Server

普通打开 安装live Server 包含端口 说明内置了服务器

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…