第十六天-爬虫selenium库

news2024/12/22 22:24:48

目录

1.介绍

2.使用 selenium

1.安装

2.使用

1.测试打开网页,抓取雷速体育日职乙信息

2.通过xpath查找

3.输入文本框内容 send_keys

4.点击事件 click

5.获取网页源码:

6.获取cookies

7.seleniumt提供元素定位方式:8种

8.控制浏览器前进、后退、刷新

9.控制鼠标

10. 设置等待

11设置后台运行

12.后台终止

3.实战


1.介绍

1. selenium是一个用于web应用程序自动化测试工具,Selenium测试直接运行在浏览器中;

2.像真正的用户在操作一样2,驱动浏览执行特定的动作,如点击、下来等操作;

3.selenium支持浏览器

4.支持的语言

5.selenium在爬虫的应用

2.使用 selenium

1.安装

 pip3 install selenium

2.使用

1.测试打开网页,抓取雷速体育日职乙信息

# coding:utf-8

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 打开浏览器
webdriver_chrome = webdriver.Chrome()
# 浏览器窗口最大化:
webdriver_chrome.maximize_window()
# 爬取日职乙联赛信息
webdriver_chrome.get("https://www.leisu.com/data/zuqiu/comp-568/season-11286")
# 默认页面是升级附加赛:提取主队信息
for home in webdriver_chrome.find_elements(By.XPATH, "//td[@class='home']/a"):
    print("升级附加赛:主队信息:", home.text)
# 点击联赛
webdriver_chrome.find_element(By., "//div[@class='stage_name']").click()
# 获取联赛信息
for home in webdriver_chrome.find_elements(By.XPATH, "//td[@class='home']/a"):
    print("联赛:主队信息:", home.text)

# 获取标题
print("标题:", webdriver_chrome.title)
print("获取cookie", webdriver_chrome.get_cookies())
print("获取页面源码", webdriver_chrome.page_source())

# 打开5秒关闭
time.sleep(5)

# 关闭浏览器
webdriver_chrome.quit()

2.通过xpath查找

 webdriver_chrome.find_elements(By.XPATH, "//td[@class='home']/a")

3.输入文本框内容 send_keys

 webdriver_chrome.find_element(By.XPATH,"//input[@id='']").send_keys("内容")

4.点击事件 click

webdriver_chrome.find_element(By.XPATH,"//input[@id='']").click()

5.获取网页源码:

webdriver_chrome.page_source()

6.获取cookies

webdriver_chrome.get_cookies()

7.seleniumt提供元素定位方式:8种

老版本使用

新版使用

find_elements(By.XPATH, "原始值")

find_elements(By.ID, "原始值")

find_elements(By.CLASS_NAME, "原始值")

等等

8.控制浏览器前进、后退、刷新

9.控制鼠标

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By


# 打开浏览器
webdriver_chrome = webdriver.Chrome()
# 浏览器窗口最大化:
webdriver_chrome.maximize_window()
# 打开百度
webdriver_chrome.get("https://www.baidu.com/")
#鼠标移动到设置上
#定位设置
set_element_above=webdriver_chrome.find_element(By.ID,"s-usersetting-top")
print(set_element_above.text)
#移动鼠标到设置上
ActionChains(webdriver_chrome).move_to_element(set_element_above).perform()


time.sleep(5)
webdriver_chrome.quit()

10. 设置等待

1. 使用场景:有时候需要等某些元素加载后进行操作,或者网络原因需要加载;

2.等待分为2种方式,分为显式等待和隐式等待

3.显式等待代码:打开百度,输入内容

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 打开浏览器
webdriver_chrome = webdriver.Chrome()
# 浏览器窗口最大化:
webdriver_chrome.maximize_window()
# 打开百度
webdriver_chrome.get("https://www.baidu.com/")
# WebDriverWait:显示等待
# 参数:1.webdriver_chrome打开浏览器对象,2.timeout,3.轮训参数
# until:EC场景判断,通过id找到输入框
element = WebDriverWait(webdriver_chrome, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
# 找到元素输入查找内容
element.send_keys("Python")

time.sleep(5)
webdriver_chrome.quit()

4.隐式等待代码:打开百度,输入内容

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import  NoSuchElementException

# 打开浏览器
webdriver_chrome = webdriver.Chrome()
# 浏览器窗口最大化:
webdriver_chrome.maximize_window()
#隐式等待
webdriver_chrome.implicitly_wait(5)
# 打开百度
webdriver_chrome.get("https://www.baidu.com/")

try:
    webdriver_chrome.find_element(By.ID,"kw1").send_keys("python")
except NoSuchElementException as e:
    print("超时没有找到元素:",e)

time.sleep(5)
webdriver_chrome.quit()

11设置后台运行

from selenium.webdriver.chrome.options import Options
options = {
    "headless": "--headless",
    "no_sandbox": "--no-sandbox",
    "gpu": "--disable-gpu"
}
chrome_options = Options()
driver = webdriver.Chrome(options=chrome_options)

12.后台终止

1.如运行异常可使用任务管理器,找到进程“chromediver.exe”结束进程

3.实战

1. 自动爬取比赛信息:彩票500

2.自动翻页

3.导出到excel中

# coding:utf-8
import xlsxwriter
import time
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class caipao500_project():

    def __init__(self, chrome_options):
        self.driver = webdriver.Chrome(options=chrome_options)
        # 设置浏览器最大化
        self.driver.maximize_window()

    def open_page(self, url):
        """
        打开页面方法
        :param self:
        :param url:  页面地址
        :return:
        """
        print("打开页面:{}".format(url))
        self.driver.get(url)
        # 判断是否打开
        if WebDriverWait(self.driver, 5, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT, "联赛赛程"))):
            print("打开页面成功")
            # 创建excel
            self.create_excel()
            # 解析数据,返回当前轮次
            round_num = self.parse_html(self.driver.page_source)

            while True:
                round_num = round_num - 1
                if round_num == 0:
                    break

                round_num_btn = self.driver.find_element(By.XPATH,
                                                         "//div[@class='lsaiguo_round_list_wrap_in']/ul/li/a[@data-group={}]".format(
                                                             round_num)).text
                # 点击上一个轮次
                if not round_num_btn:
                    # 点击翻页
                    self.driver.find_element(By.XPATH, "//a[@class='itm_arrow itm_arrow_up']").click()
                    # 等待5秒
                    time.sleep(5)

                if WebDriverWait(self.driver, 5, 0.5).until(EC.presence_of_element_located(((By.XPATH,
                                                                                             "//div[@class='lsaiguo_round_list_wrap_in']/ul/li/a[@data-group={}]".format(
                                                                                                 round_num))))):
                    # 点击轮次
                    self.driver.find_element(By.XPATH,
                                             "//div[@class='lsaiguo_round_list_wrap_in']/ul/li/a[@data-group={}]".format(
                                                 round_num)).click()
                round_num = self.parse_html(self.driver.page_source)
            self.book.close()
            return True
        else:
            print("打开页面失败")
            return False

    def create_excel(self):
        """
        创建Excel
        :return:
        """
        # 创建存放excel文件夹
        self.book = xlsxwriter.Workbook(time.strftime("%Y%m%d%H%M%S", time.gmtime()) + "文件.xlsx")
        self.sheet = self.book.add_worksheet("sheet1")
        # 记录添加到第几行
        self.curr_row = 1
        title_data = ("轮次", "时间", "主队", "全场比分", "全场总分", "半场比分", "半场总分", "客队")
        # 添加表头
        for index, title_datum in enumerate(title_data):
            self.sheet.write(0, index, title_datum)

    def parse_html(self, content):
        """
        解析网页数据
        :param content: 网页源码
        :return:
        """
        html = etree.HTML(content)
        table_trs = html.xpath("//table[@class='lsaiguo_list ltable jTrHover']/tbody/tr")
        row_content = {}
        for tr in table_trs:
            # 轮次
            round_num = tr.xpath("./td[1]/text()")[0]
            # 时间
            time = "".join(tr.xpath("./td[2]/text()"))
            # 主队
            home = tr.xpath("./td[3]/a/text()")[0]
            # 比分:全场
            whole_score_array = tr.xpath("./td[4]/span/text()")
            whole_score = ":".join(whole_score_array)
            # 全场总分
            whole_score_total = int(whole_score_array[0]) + int(whole_score_array[1])
            # 半场
            half_score_str = "".join(tr.xpath("./td[4]/text()"))
            half_score = half_score_str[half_score_str.find("(") + 1:half_score_str.find(")")]
            # 总分
            half_score_array = half_score.split(":")
            half_score_total = int(half_score_array[0]) + int(half_score_array[1])
            # 客队
            away = tr.xpath("./td[5]/a/text()")[0]

            row_content = {
                "round_num": round_num,
                "time": time,
                "home": home,
                "whole_score": whole_score,
                "whole_score_total": whole_score_total,
                "half_score": half_score,
                "half_score_total": half_score_total,
                "away": away
            }
            print("row:", row_content)
            for index, e in enumerate(row_content):
                self.sheet.write(self.curr_row, index, row_content.get(e))
            self.curr_row += 1
        return int(round_num)


if __name__ == '__main__':
    options = {
        #"headless": "--headless",
        #"no_sandbox": "--no-sandbox",
        #"gpu": "--disable-gpu",
        "proxy-server": "--proxy-server=https://121.37.201.60:8118"
    }
    chrome_options = Options()
    for k, v in options.items():
        print("设置浏览器参数:{}:{}".format(k, v))
        chrome_options.add_argument(v)
    leisu = caipao500_project(chrome_options=chrome_options)

    leisu.open_page("https://liansai.500.com/zuqiu-6779/jifen-19426/")

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

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

相关文章

第一弹:Flutter安装和配置

目标: 1)配置Flutter开发环境 2)创建第一个Flutter Demo项目 Flutter中文开发者网站: https://flutter.cn/ 一、配置Flutter开发环境 Flutter开发环境已经提供集成IDE开发环境,因此需要配置开发环境的时候&#xf…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…

Git分支补充

我们在合并分支时并不总是一帆风顺,有些时候也会遇到“合并冲突”的问题。 下面我们来还原一下: 创建分支dev $ git checkout -b dev 切换到一个新分支 dev $ git branch * devmaster我们将 text.txt 内容改为 欢迎关注CSDNkeduo并将修改的内容提交到 d…

【Oracle Database】如何远程连接服务器、创建用户、从本地dmp导入表

C:\Users\test>imp test/123456ip/orcl:1521 fileE:\db.dmp tablestable1,table2Import: Release 11.2.0.3.0 - Production on 星期一 3月 4 12:59:09 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.IMP-00058: 遇到 ORACLE 错误 1263…

EdgeX Foundry 安全模式安装部署

文章目录 一、安装准备1.官方文档2. 克隆服务器3.安装 Docker4.安装 docker-compose 二、安装部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs…

CUDA学习笔记02:测试程序hello world

参考资料 Win10下在VS2019中配置使用CUDA进行加速的C项目 (配置.h文件,.dll以及.lib文件等)_vs2019 cuda-CSDN博客 配置流程 1. 新建一个一般的项目 2. 项目建好后,在项目里添加.cu测试文件 测试的.cu文件命名为cuda_utils.cu&…

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务,参考:微调BERT模型实现相似性判断 - 知乎 参考他上面代码,他使用的是 BertForNextSentencePrediction 模型,Bert…

在idea中用模板骨架初始创建maven管理的web项目时没有src有关的目录的解决方案

一.问题如下 二.解决方法 首先关闭当前项目,接着修改全局设置,重新创建项目 在VM Options中添加"-DarchetypeCataloginternal",点击ok保存 点击创建,如果创建成功没报错且有src,就ok了。 当然如果出现以下…

【C++】十大排序算法之 插入排序 希尔排序

本次介绍内容参考自:十大经典排序算法(C实现) - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序…

大厂报价查询系统性能优化之道!

0 前言 机票查询系统,日均亿级流量,要求高吞吐,低延迟架构设计。提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能关键。本文介绍机票查询系统在缓存和实时计算两个领域的架构提升。 1 机票搜索服务概述 1.1 …

C++的类与对象(二)

目录 结构体内存对其规则 相关面试题 this指针 相关面试题 结构体内存对其规则 1、第一个成员在与结构体偏移量为0的地址处 2、其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处 对齐数 编译器默认对齐数与该成员大小的较小值(v…

学习记录12-单片机代码几种常见命名规则

良好的编程习惯,决定了今后代码的质量。 有很多人平时不注意自己的代码规范,函数和变量命命随心所欲,造成一个星期就不认识自己的代码,于是今天就来分享一点关于软件代码常见的几种命名规则。 匈牙利命名法 匈牙利命名法广泛应用…

RBAC实战

一、权限控制概述 1.1、访问控制目的 在实际的组织中,为了完成组织的业务工作,需要在组织内部设置不同的职位,职位既表示一种业务分工,又表示一种责任与权利。根据业务分工的需要,职位被划分给不同群体,各…

C++:Vector的模拟实现

创作不易,感谢三连 !! 一,前言 在学习string类的时候,我们可能会发现遍历的话下标访问特别香,比迭代器用的舒服,但是下标其实只能是支持连续的空间,他的使用是非常具有局限性的&am…

迷不迷糊?前后端、三层架构和MVC傻傻分不清

现在的项目都讲究前后端分离,那到底什么是前后端,前后端和以前的MVC以及三层架构啥关系呢?今天就这个问题展开一下,方面后面的学习,因为前面讲的jsp、servlet和javabean根据实例,基本上有一个框架的理解了&…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…

【如何在Docker中,修改已经挂载的卷(Volume)】

曾梦想执剑走天涯,我是程序猿【AK】 提示:添加投票!!! 目录 简述概要知识图谱 简述概要 如何在Docker中,修改已经挂载的卷(Volume) 知识图谱 在Docker中,修改已经挂载…

消息队列-kafka-消息发送流程(源码跟踪)

官方网址 源码:https://kafka.apache.org/downloads 快速开始:https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异…

安装Proxmox VE虚拟机平台

PVE是专业的虚拟机平台,可以利用它安装操作系统,如:Win、Linux、Mac、群晖等。 1. 下载镜像 访问PVE官网,下载最新的PVE镜像。 https://www.proxmox.com/en/downloads 2. 下载balenaEtcher balenaEtcher用于将镜像文件&#…

【Vue3】3-6 : 仿ElementPlus框架的el-button按钮组件实

文章目录 前言 本节内容实现需求完整代码如下: 前言 上节,我们学习了 slot插槽,组件内容的分发处理 本节内容 本小节利用前面学习的组件通信知识,来完成一个仿Element Plus框架的el-button按钮组件实现。 仿造的地址:uhttps://…