小白爬虫——selenium入门超详细教程

目录

一、selenium简介

二、环境安装

2.1、安装Selenium

2.2、浏览器驱动安装

三、基本操作

3.1、对页面进行操作

3.1.1、初始化webdriver

3.1.2、打开网页

3.1.3、页面操作

3.1.4、页面数据提取

3.1.5、关闭页面

?3.1.6、综合小案例

3.2、对页面元素进行操作

3.2.1、获取页面链接元素

3.2.2、模拟鼠标的基本操作

3.2.3、页面加载策略和延时等待

3.2.4、切换窗口

3.2.5、切换表单

3.2.6、动作链

四、高级操作

4.1、反检测

4.1.1、使用stealth.min.js文件

4.1.2、使用debugging模式

4.1.3、使用undetected_edgedriver

4.2、图片验证码

五、结语


一、selenium简介

Selenium是一个用于自动化测试的工具,它可以模拟用户在浏览器中的各种操作。除了用于爬虫,Selenium还可以用于测试,尤其是在处理动态加载页面时非常有用。本文将提供一个超级详细的Selenium教程,以帮助您快速入门并了解其各种功能和用法。

二、环境安装

2.1、安装Selenium

在终端通过pip安装:

1|pip install selenium

2.2、浏览器驱动安装

针对不同的浏览器,安装不同的驱动:(本文以Edge浏览器为例)

2.2.1、查看浏览器的版本

2.2.2、下载对应版本的驱动程序

下载网址链接:Microsoft Edge WebDriver |Microsoft Edge 开发人员

2.2.3、解压获取exe文件地址

三、基本操作

3.1、对页面进行操作

3.1.1、初始化webdriver

在使用Selenium之前,我们需要初始化WebDriver。WebDriver是一个控制浏览器的工具,它可以模拟用户在浏览器中的各种操作。Selenium支持多种浏览器,如Chrome、Firefox、Safari等。下面是一些示例代码,展示如何初始化Edge、Chrome和Firefox浏览器的WebDriver:

from selenium import webdriver

# 初始化Edge浏览器
driver = webdriver.Edge()
# 初始化Chrome浏览器
driver = webdriver.Chrome()
# 初始化Firefox浏览器
driver = webdriver.Firefox()
3.1.2、打开网页

一旦我们初始化好了WebDriver,接下来我们就可以使用它来打开网页。下面是一些示例代码,展示如何使用WebDriver打开网页:

from selenium import webdriver

# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.get("https://www.jd.com/")
3.1.3、页面操作

一旦我们打开了网页,我们就可以使用WebDriver来模拟各种用户操作,如设置窗口最大化、设置窗口位置、设置窗口大小等。下面是一些示例代码,展示如何在网页中进行一些常见的操作:

import time

from selenium import webdriver

# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()
# 设置浏览器的窗口位置
driver.set_window_position(1100, 20)
# 设置浏览器的窗口大小
driver.set_window_size(900, 900)
time.sleep(5)
3.1.4、页面数据提取

除了操作页面,Selenium还可以用于提取页面的源代码。我们可以使用WebDriver的page_source来获取页面源代码,下面是示例代码,展示如何提取页面中的数据:

import time
from selenium import webdriver

# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()
# 设置浏览器的窗口位置
driver.set_window_position(1100, 20)
# 设置浏览器的窗口大小
driver.set_window_size(900, 900)
time.sleep(5)
# 获取页面源代码
page_content = driver.page_source
# 打印获取内容
print(page_content)
3.1.5、关闭页面

当我们完成了对网页的操作和数据提取后,最后不要忘记关闭WebDriver。关闭WebDriver将会关闭浏览器窗口,并释放相关的资源。下面是示例代码,展示如何关闭WebDriver:

import time
from selenium import webdriver

# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()
time.sleep(2)
# 获取页面数据
page_content = driver.page_source
# 打印页面数据内容
print(page_content)
# 关闭一个页面
driver.close() 
# 关闭全部页面
driver.quit()
3.1.6、综合小案例
"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :Selenium爬虫
@Time :2024/12/5 11:19
@Motto:一直努力,一直奋进,保持平常心

"""
import time

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options

url = "https://www.baidu.com/"
url1 = "https://www.jd.com/"
# Service类用于设置WebDriver服务,这里指定了Edge浏览器驱动程序的路径
service = Service(executable_path='D:ApplicationsSoftwareEdgeDriveredgedriver_win32msedgedriver.exe')
opt = Options()
opt.add_argument("--disable-blink-features=AutomationControlled")
# 使用上面定义的服务对象来创建一个Edge浏览器的WebDriver对象,这个对象可以模拟浏览器操作
browser = webdriver.Edge(service=service,options=opt)
# 调用maximize_window方法,使浏览器窗口最大化显示
browser.maximize_window()
# 设置浏览器的窗口位置
# browser.set_window_position(1100, 20)
# 设置浏览器的窗口大小
# browser.set_window_size(900, 900)
# 使用get方法通过url打开指定的网页
browser.get(url)
# time模块的sleep函数用于暂停程序执行,这里暂停5秒,以便有足够的时间观察网页加载情况
time.sleep(2)
# 通过url访问另一个网页
browser.get(url1)
time.sleep(2)
# 调用back返回上一个网页
browser.back()
time.sleep(2)
# 调用forward()函数前往下一个网页
browser.forward()
time.sleep(1)
# 刷新页面
browser.refresh()
time.sleep(1)
# 调用page_source获取网页内容
page_content = browser.page_source
print(page_content)
# 最后,调用close方法关闭浏览器窗口
browser.close()

3.2、对页面元素进行操作

3.2.1、获取页面链接元素

鼠标右键然后选择检查(或者按F12),获取页面的全部元素,然后选中元素,进行复制。

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

# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()
# 模拟点击百度页面链接进行跳转
# 获取页面元素
link = driver.find_element(by=By.XPATH,value="//*[@id='hotsearch-content-wrapper']/li[1]/a/span[2]")
# 链接跳转
link.click()

我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,Selenium提供了一系列的方法来方便我们实现以上操作。通过webdriver对象的 find_element(by=“属性名”, value=“属性值”),主要包括以下这八种:

属性

函数

CLASS

find_element(by=By.CLASS_NAME, value=‘’)

XPATH

find_element(by=By.XPATH, value=‘’)

LINK_TEXT

find_element(by=By.LINK_TEXT, value=‘’)

CSS

find_element(by=By.CSS_SELECTOR, value=‘’)

ID

find_element(by=By.ID, value=‘’)

TAG

find_element(by=By.TAG_NAME, value=‘’)

PARTIAL_LINK_TEXT

find_element(by=By.PARTIAL_LINK_TEXT, value=‘’)

3.2.2、模拟鼠标的基本操作

首先,我们需要引入Keys类。

from selenium.webdriver.common.keys import Keys

其次,模型通过百度搜索python爬虫。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()

# 模拟点击百度页面链接进行跳转
# 获取页面元素
search_element = driver.find_element(by=By.XPATH,value="//*[@id='kw']")
# 模拟向输入框中输入python爬虫并回车
search_element.send_keys('python爬虫', Keys.ENTER)
time.sleep(10)

基本操作:

具体操作

函数

删除键

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’)

复制

send_keys(Keys.CONTRL,‘c’)

剪切

send_keys(Keys.CONTRL,‘x’)

粘贴

send_keys(Keys.CONTRL,‘x’)

键盘F1

send_keys(Keys.F1)

3.2.3、页面加载策略和延时等待

页面加载策略是指在浏览器中加载网页时,Selenium WebDriver等待页面加载完成的行为。这些策略可以帮助我们控制WebDriver在页面加载时的行为,以适应不同的测试需求和性能优化。选择合适的页面加载策略可以显著影响测试的执行时间和稳定性。例如,在单页应用中,由于页面内容是动态加载的,使用eagernone策略可能更合适,因为它们可以更快地响应页面的变化。而在需要完全加载所有资源以确保页面功能正常的测试中,使用normal策略可能更合适以下是Selenium支持的页面加载策略:

页面加载策略

特点

normal

这是默认的页面加载策略。在这种策略下,WebDriver会等待整个页面包括所有子资源(如图像、CSS、JavaScript等)都加载完成,直到触发load事件后才会继续执行后续的操作。这意味着WebDriver会等待页面完全加载,包括所有的外部资源加载完成

eager

eager策略下,WebDriver会等待文档被完全加载和解析完成,但不会等待样式表、图像和iframe等子资源加载完成。这通常意味着WebDriver会等待DOMContentLoaded事件触发后继续执行,这比load事件更早

none

使用none策略时,WebDriver不会等待页面加载完成,它仅等待初始的HTML被部分下载后就会停止等待,允许脚本继续执行。这意味着WebDriver不会等待任何额外的资源加载,如CSS、JavaScript或图像

在Selenium中,设置WebDriver等待是一种重要的技术,用于确保在执行某些操作之前,页面上的元素已经加载完成或者某个条件已经满足。Selenium提供了两种主要的等待机制:显式等待(Explicit Wait)和隐式等待(Implicit Wait)。

**显式等待:**显式等待允许你等待某个条件成立,而不是盲目地等待一个固定的时间。它提供了更灵活的控制,可以等待特定的元素出现、元素变得可点击、元素的可见性等。下面包含常用的显式等待方法:

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :练习
@Time :2024/12/5 13:57
@Motto:一直努力,一直奋进,保持平常心

"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 导入显式等待库
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# 初始化Edge浏览器
driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()
# 设置显式等待,最多等待10秒
wait = WebDriverWait(driver, 10)
try:
    # 等待直到某个元素出现
    element = wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='kw']")))
except:
    print("未找到元素")
    driver.close()
    exit()
# 获取页面元素
search_element = driver.find_element(by=By.XPATH,value="//*[@id='kw']")
# 模拟向输入框中输入python爬虫并回车
search_element.send_keys('python爬虫', Keys.ENTER)
time.sleep(10)
driver.close()

**隐式等待:**隐式等待设置了一个全局等待时间,在这个时间内,WebDriver会等待某个元素出现。如果在设置的时间内找到了元素,WebDriver会继续执行;如果超时,则抛出NoSuchElementException异常。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 初始化Edge浏览器
driver = webdriver.Edge()
# 设置隐式等待5秒钟
driver.implicitly_wait(5)
driver.get("https://www.baidu.com/")
# 调用maximize_window方法,使浏览器窗口最大化显示
driver.maximize_window()

# 模拟点击百度页面链接进行跳转
# 获取页面元素
search_element = driver.find_element(by=By.XPATH,value="//*[@id='kw']")
# 模拟向输入框中输入python爬虫并回车
search_element.send_keys('python爬虫', Keys.ENTER)
time.sleep(10)
driver.close()
3.2.4、切换窗口

在 selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。

3.2.5、切换表单

在Selenium中,处理表单切换是一个常见的任务,尤其是在涉及到frameiframe元素时。以下是Selenium中切换表单的一些关键点:

  1. Selenium提供了switch_to.frame()方法来切换到frameiframe。这个方法可以接受几种类型的参数,包括idnameindex以及页面元素对象。

  2. 完成frame/iframe内的操作后,可以通过switch_to.default_content()切换回主文档,或者使用switch_to.parent_frame()切换到父级frame。

  3. 如果页面中有多层嵌套的frame/iframe,你可能需要多次调用switch_to.frame()方法来逐层深入,或者使用switch_to.parent_frame()来逐层返回。

    “”"
    @Author :江上挽风&sty
    @Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
    @File :切换表单
    @Time :2024/12/6 13:41
    @Motto:一直努力,一直奋进,保持平常心

    “”"
    import time

    from selenium import webdriver
    from selenium.webdriver.edge.service import Service
    from selenium.webdriver.edge.options import Options
    from selenium.webdriver.common.by import By

    url = “https://www.qidian.com/all/”

    Service类用于设置WebDriver服务,这里指定了Edge浏览器驱动程序的路径

    service = Service(executable_path=‘D:ApplicationsSoftwareEdgeDriveredgedriver_win32msedgedriver.exe’)
    opt = Options()
    opt.add_argument(“–disable-blink-features=AutomationControlled”)

    使用上面定义的服务对象来创建一个Edge浏览器的WebDriver对象,这个对象可以模拟浏览器操作

    browser = webdriver.Edge(service=service, options=opt)

    调用maximize_window方法,使浏览器窗口最大化显示

    browser.maximize_window()
    browser.get(url)

    显式等待五秒,加载页面

    browser.implicitly_wait(5)

    time.sleep(3)
    login_button = browser.find_element(by=By.XPATH, value=‘//*[@id=“login-btn”]’)
    login_button.click()
    time.sleep(3)

    先获取表单所在的iframe元素

    iframe = browser.find_element(by=By.XPATH, value=‘//*[@id=“loginIfr”]’)

    进入这个表单

    browser.switch_to.frame(iframe)
    time.sleep(3)
    browser.find_element(by=By.XPATH, value=‘//[@id=“username”]‘).send_keys(‘17369961234’)
    time.sleep(3)
    browser.find_element(by=By.XPATH, value=’//
    [@id=“password”]’).send_keys(‘skjhg’)
    time.sleep(3)
    browser.find_element(by=By.XPATH, value=‘//[@id=“j-inputMode”]/div[2]/div/label[2]‘).click()
    time.sleep(2)
    browser.find_element(by=By.XPATH, value=’//
    [@id=“j-loginInputMode”]/div[3]/div[1]/p[2]/label’).click()
    time.sleep(2)
    browser.find_element(by=By.XPATH, value=‘//*[@id=“j-inputMode”]/div[2]/a’).click()
    time.sleep(2)
    browser.switch_to.default_content()
    time.sleep(2)

3.2.6、动作链

在Selenium中,动作链(ActionChains)是一种用于执行复杂用户交互的方法,比如鼠标移动、点击、拖放和键盘输入等。以下是Selenium中动作链的一些基本介绍和常用方法。动作链允许你将多个操作按顺序存放在一个队列里,当你调用perform()方法时,这些操作会依次执行。

常用方法:

方法

解释

click(on_element=None)

单击鼠标左键

click_and_hold(on_element=None)

点击鼠标左键并保持按下状态

context_click(on_element=None)

执行鼠标右键点击(上下文菜单)

double_click(on_element=None)

双击鼠标左键

drag_and_drop(source, target)

将一个元素拖拽到另一个元素上释放

drag_and_drop_by_offset(source, xoffset, yoffset)

将源元素拖动到指定的偏移位置上释放

key_down(value, element=None)

按下键盘上的某个键,不释放

key_up(value, element=None)

释放键盘上的某个键

move_by_offset(xoffset, yoffset)

鼠标从当前位置移动到某个坐标

move_to_element(to_element)

鼠标移动到某个元素

move_to_element_with_offset(to_element, xoffset, yoffset)

移动到距某个元素多少距离的位置

perform()

执行链中的所有动作

release(on_element=None)

在某个元素位置松开鼠标左键

send_keys(*keys_to_send)

发送某个键到当前焦点的元素

send_keys_to_element(element, *keys_to_send)

发送某个键到指定元素

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :动作链
@Time :2024/12/6 14:11
@Motto:一直努力,一直奋进,保持平常心

"""
import time

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select

url = "https://www.12306.cn/index/index.html"
# Service类用于设置WebDriver服务,这里指定了Edge浏览器驱动程序的路径
service = Service(executable_path='D:ApplicationsSoftwareEdgeDriveredgedriver_win32msedgedriver.exe')
opt = Options()
# 防止Edge在自动化测试过程中弹出一些对话框
opt.add_argument("--disable-blink-features=AutomationControlled")
# 使用add_experimental_option方法可以添加一些实验性的Edge选项
opt.add_experimental_option('excludeSwitches', ['enable-automation'])
# 的作用是让浏览器在WebDriver会话结束后保持开启状态
opt.add_experimental_option("detach", True)
# 使用上面定义的服务对象来创建一个Edge浏览器的WebDriver对象,这个对象可以模拟浏览器操作
browser = webdriver.Edge(service=service, options=opt)
# 显式等待五秒,加载页面
browser.implicitly_wait(5)
# 调用maximize_window方法,使浏览器窗口最大化显示
browser.maximize_window()
browser.get(url)

time.sleep(1)
# 将鼠标悬停在车票上
ticket_element = browser.find_element(by=By.XPATH, value='//*[@id="J-chepiao"]/a')
ActionChains(browser).move_to_element(ticket_element).perform()
time.sleep(2)
# 点击单程进入下一个页面
one_way_element = browser.find_element(by=By.XPATH, value='//*[@id="megamenu-3"]/div[1]/ul/li[1]/a')
ActionChains(browser).click(one_way_element).perform()
# 输入出发地
time.sleep(2)
from_station = browser.find_element(by=By.XPATH, value='//*[@id="fromStationText"]')
ActionChains(browser).click(from_station).pause(1).send_keys('重庆').pause(1).send_keys(Keys.ARROW_DOWN).pause(1).send_keys(Keys.ENTER).perform()
time.sleep(2)
# 输入目的地
to_station = browser.find_element(by=By.XPATH, value='//*[@id="toStationText"]')
ActionChains(browser).click(to_station).pause(1).send_keys('长沙').pause(1).send_keys(Keys.ENTER).perform()
time.sleep(2)
# 输入出发日期
date = browser.find_element(by=By.XPATH, value='//*[@id="place_area"]/ul/li[4]/span')
ActionChains(browser).click(date).pause(1).send_keys(Keys.CLEAR).pause(1).send_keys("2024-12-06").pause(1).send_keys(Keys.ARROW_DOWN).pause(1).send_keys(Keys.ENTER).perform()
time.sleep(2)
# 选择学生
browser.find_element(by=By.XPATH, value='//*[@id="sf2_label"]').click()
time.sleep(2)
# 勾线高铁
browser.find_element(by=By.XPATH, value='//*[@id="_ul_station_train_code"]/li[1]/label').click()
time.sleep(1)
# 选择发车时间
start_time_element = browser.find_element(by=By.XPATH, value='//*[@id="cc_start_time"]')
Select(start_time_element).select_by_visible_text('12:00--18:00')
# 单击查询
browser.find_element(by=By.XPATH, value='//*[@id="query_ticket"]').click()
time.sleep(3)

四、高级操作

4.1、反检测

在使用Selenium进行自动化测试或爬虫时,网站可能会通过各种方式检测到自动化工具的使用。以下是一些常用的Selenium反检测方法。

4.1.1、使用stealth.min.js文件

stealth.min.js 是一个JavaScript文件,它包含了一系列的代码,用于隐藏Selenium WebDriver的自动化特征,使得使用Selenium进行自动化测试时,浏览器的行为更接近于真实用户的浏览器行为,从而降低被网站检测为自动化工具的风险。在使用Selenium WebDriver时,可以在启动浏览器之前,通过执行stealth.min.js中的JavaScript代码来实现隐藏特征。这通常是通过Selenium的execute_cdp_cmd方法实现的,该方法允许执行Chrome DevTools Protocol命令。

下载安装stealth.min.js文件:

4.1.2、使用debugging模式

在Selenium中使用调试模式来防止检测,主要是指通过开启Chrome的远程调试端口来接管已经打开的浏览器会话,从而避免被网站检测到自动化工具的使用。

步骤:

1、找到Edge浏览器的安装路径:

C:Program Files (x86)MicrosoftEdgeApplication

2、在命令提示符下输入命令创建配置浏览器:

msedge.exe --remote-debugging-port=9222 --user-data-dir=“你的用户数据目录路径”

3、复制在Edge的快捷方式,并在其上右击,选择属性,在目标栏后面加上空格加上下面命令

“C:Program Files (x86)MicrosoftEdgeApplicationmsedge.exe”–remote-debugging-port=9222 --user-data-dir=“你的用户数据目录路径”

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Edge(options=options)
4.1.3、使用undetected_edgedriver

**undetected_edgedriver是一个基于undetected_chromedriver**进行一些调整以支持Edge浏览器的Selenium库。它旨在帮助自动化脚本更难被网站检测到,从而提高自动化任务的成功率。

安装undetected_edgedriver:

pip3 install undetected-edgedriver

使用方法:

import undetected_edgedriver as uc
# 创建Edge浏览器实例
browser = uc.Edge(use_subprocess=True)
# 打开网页
browser.get(url="https://your-target-website.com/")
# 执行其他操作,例如查找元素、点击按钮等
# ...
# 关闭浏览器
browser.quit()

4.2、图片验证码

使用超级鹰打码平台识别验证码图片中的数据,用于模拟登陆操作。

  • 查询该用户是否还有剩余的题分

  • 创建一个软件:用户中心>软件ID>生成一个软件ID>录入软件名称>提交(软件id和秘钥)

  • 下载示例代码:开发文档>点此下载python示例

  • 示例代码:

    #!/usr/bin/env python

    coding:utf-8

    import json

    import requests
    from hashlib import md5

    class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }
    
    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()
    
    def PostPic_base64(self, base64_str, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
            'file_base64':base64_str
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, headers=self.headers)
        return r.json()
    
    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()
    

    if name == ‘main’:
    with open(‘password.json’,‘r’,encoding=‘utf-8’) as f:
    info = json.loads(f.read())
    password = info[‘password’]
    username = info[‘username’]
    soft_id = info[‘soft_id’]
    print(username)

    chaojiying = Chaojiying_Client(username, password, soft_id)	#用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()
    code = chaojiying.PostPic(im,1902)
    print(code)
    #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    # print chaojiying.PostPic(im, 1902)
    # #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    #print chaojiying.PostPic(base64_str, 1902)  #此处为传入 base64代码
    

只需要password.jsonw文件中替换自己的用户名、密码和ID即可。

selenium模拟验证码登入超级鹰专业验证码识别平台案例:

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :验证码
@Time :2024/12/6 16:13
@Motto:一直努力,一直奋进,保持平常心

"""
import json
import time

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By

from chaojiying_Python import chaojiying
from chaojiying_Python.chaojiying import Chaojiying_Client


service = Service(executable_path='D:ApplicationsSoftwareEdgeDriveredgedriver_win32msedgedriver.exe')
def login(url,password,username,soft_id):
    browser = webdriver.Edge(service=service)
    browser.get(url)
    # 输入用户名
    browser.find_element(by=By.XPATH, value='/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys(username)
    # 输入密码
    time.sleep(2)
    browser.find_element(by=By.XPATH, value='/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys(password)
    # 获取验证码
    img = browser.find_element(by=By.XPATH, value='/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
    time.sleep(2)
    Chaojiying_Client(username,password,soft_id)
    code = chaojiying.chaojiying.PostPic(img,1902)['pic_str']
    # 输入验证码
    browser.find_element(by=By.XPATH, value='/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(code)
    time.sleep(2)
    # 点击登入
    browser.find_element(by=By.XPATH, value='/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()


if __name__ == '__main__':
    url = "https://www.chaojiying.com/user/login/"
    with open('chaojiying_Python/password.json','r',encoding='utf-8') as f:
        info = json.loads(f.read())
    password = info['password']
    username = info['username']
    soft_id = info['soft_id']
    login(url, password, username, soft_id)

五、结语

本博客为自学python爬虫的过程贴,内容上可能存在些许错误,希望大家批评指正,后续我将努力完善修改,散花!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter鸿蒙化中的Plugin

Flutter鸿蒙化中的Plugin 前言鸿蒙项目内PluginFlutter端实现鸿蒙端实现创建Plugin的插件类注册Plugin 开发纯Dart的package为现有插件项目添加ohos平台支持创建插件配置插件编写插件内容 参考资料 前言 大家知道Flutter和鸿蒙通信方式和Flutter和其他平台通信方式都是一样的&…

【Docker】搭建一个功能强大的自托管虚拟浏览器 - n.eko

前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版本为 DSM 7.2.2-72806 Update 2。 n.eko 支持多种类型浏览器在其虚拟环境中运行,本次教程使用 Chromium​ 浏览器镜像进行演示,支持访问内网设备和公网地址。 简介 n.eko 是…

AIGC视频生成国产之光:ByteDance的PixelDance模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍ByteDance的视频生成模型PixelDance,论文于2023年11月发布,模型上线于2024年9月,同时期上线的模型还有Seaweed&…

《keras 3 内卷神经网络》

keras 3 内卷神经网络 作者:Aritra Roy Gosthipaty 创建日期:2021/07/25 最后修改时间:2021/07/25 描述:深入研究特定于位置和通道无关的“内卷”内核。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub …

【json_object】mysql中json_object函数过长,显示不全

问题:json只显示部分 解决: SET GLOBAL group_concat_max_len 1000000; -- 设置为1MB,根据需要调整如果当前在navicat上修改,只有效本次连接和后续会话,重新连接还是会恢复默认值1024 在my.ini配置文件中新增或者修…

云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”

2024 年 12 月 24 日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2025 中国信通院深度观察报告会:算力互联网分论坛”,在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题,全面展示中国…

2024 年度学习总结

目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…

Spring Boot自动配置原理:如何实现零配置启动

引言 在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置…

1.2.神经网络基础

目录 1.2.神经网络基础 1.2.1.Logistic回归 1.2.2 梯度下降算法 1.2.3 导数 1.2.4 向量化编程 1.2.5 正向传播与反向传播 1.2.6.练习 1.2.神经网络基础 1.2.1.Logistic回归 1.2.1.1.Logistic回归 逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x ,…

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1(改matlab最大内存限制)情况2(重启电脑)情况3 前言 在使用matlab中,有时候需要占用的内存并没有超过电脑内存依旧会报错,提示内存不够用,可以尝试下面几种方法,总有一…

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址:https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题,限制了深度学习在…

深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化

目录 什么是协同过滤算法核心原理基本步骤相似度计算代码实现详解1.流程图2.创建基础的数据结构存储用户评分数据3.计算用户相似度4.获取相似用户5.推荐方法 算法优化建议1. 数据预处理优化去除异常值和噪声数据进行数据标准化使用稀疏矩阵优化存储 2. 相似度计算优化使用局部敏…

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤: 使用 Create React App Create React App 是一个官方支持的命令行工具,用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题,我们通过给代码加锁来解决线程不安全问题,在生活中我们也知道有很多种类型的锁,同时在代码的世界当中,也对应着很多类型的锁,今天我们对锁一探究竟! 1. 常见的锁策略 注意: …

智启未来,AI筑梦科技新星”------华清远见成都中心2025冬令营圆满结束

2025年1月11日-16日,华清远见成都中心为期6天的“智启未来,AI筑梦科技新星”2025冬令营活动圆满结束。此次活动吸引了众多对人工智能和无人驾驶技术充满热情的学生参与,共同开启了一段点燃科技梦想的精彩旅程。 报道接待 以AI无人驾驶小车为核…

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c,本地,CDB数据库主机的I/O带宽为6 GB/s,由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…

RabbitMQ--延迟队列

(一)延迟队列 1.概念 延迟队列是一种特殊的队列,消息被发送后,消费者并不会立刻拿到消息,而是等待一段时间后,消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多,…

3DsMax设置中文界面

按键盘上的“Win”键,直接输入3dsmax,选择Simplified Chinese打开,之后就都是中文了

opencv在图片上添加中文汉字(c++以及python)

opencv在图片上添加中文汉字(c以及python)_c opencv绘制中文 知乎-CSDN博客 环境: ubuntu18.04 desktopopencv 3.4.15 opencv是不支持中文的。 这里C代码是采用替换原图的像素点来实现的,实现之前我们先了解一下汉字点阵字库。…

线程同步与Mutex

梦想是逃离世界… 文章目录 一、什么是线程同步?二、线程同步机制三、互斥锁(Mutex)四、loock 和 unlock五、Mutex的四种类型 一、什么是线程同步? 线程同步(Thread Synchronization)是多线程编程中的一个重要概念,它…