selenium+requests 实现网页跳转登录及爬取

这篇具有很好参考价值的文章主要介绍了selenium+requests 实现网页跳转登录及爬取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目背景

  • 本项目设立目的是为了通过脚本,实现学校体育场馆的“秒约”。便于同学瞬间抢到热门时间段的体育场
  • 服务器工作峰值时浏览器可能会卡死,因此例如selenium等需要加载浏览器界面的库可能会降低效率
  • 采用requests库直接向服务器发送请求,效率更高。

项目的组成部分

通过selenium库模拟登录获取cookies

如果在预约界面,点击“预约”按钮。然后抓包获取headerscookies等参数,很有可能只获取的一部分cookies
如果传递的cookies参数不够全面,很有可能重新跳转至登录界面。requests.post()返回的内容如下:
(返回跳转到登录网址的代码,而不是原网址内容)
selenium登录后访问其他页面,selenium,python,爬虫

而如果通过requests库,走正常流程登录时,登录系统用户名及密码通常进行过加密。使得我们不知道如何向系统传递参数进行登录。(如图)
selenium登录后访问其他页面,selenium,python,爬虫

因此我们可以通过用selenium模拟用户成功登录后,通过selenium获取cookies传递给requests,借壳上市,实现requests对页面的成功访问。同时也不会影响在抢预约时的效率。
此外需要注意的是,建议采用requests.Session()来进行访问。Session对象可以获取响应的cookies值并自动进行记录,可以保持一个持续会话的状态,避免后面访问网址需要多次传递cookies
具体代码如下:

print('开始自动化操作')

# 绕过人机检查
options = webdriver.EdgeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

# 采用Edge驱动
wb = webdriver.Edge(options = options,service=Service(r'D:\软件\PyCharm Community Edition 2023.1.3\edgedriver_win64\msedgedriver.exe'))

# 绕过人机检查
wb.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

# 直接获取预约界面,随后跳转至登录界面。完成登录后,会再跳转至预约界面。
wb.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1')
# 设置隐式等待5秒
wb.implicitly_wait(5)

# 在登录界面,找到用户名和密码框
user = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[1]/input')
password = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[2]/input[1]')
login = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[5]')

# 输入用户名及密码完成登录
user.send_keys('XXX')
password.send_keys('XXXX')
login.click()

time.sleep(3)

# 打印wb中所有的cookies
print(wb.get_cookies())

# 设置访问头
headers = {...
}


# 创建session对话对象
se = requests.Session()

# 将wb中所有的cookies传递给session对象
for co in wb.get_cookies():
    requests.utils.add_dict_to_cookiejar(se.cookies, {co['name']: co['value']})

# 撤销wb对象内存
wb.close()

# 打印session对象中所有的cookies
print(se.cookies)

# 访问预约网址
r1 = se.get(r'http://.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1', headers=headers)
# 打印预约网址源码,打印成功即成功登录
print(r1.text)

向服务器发送请求获取验证码并识别

至此,即将进入本项目第二个难点。获取验证码及识别
在选好场地和时间后,需要输入手机号及验证码才能点击预约。(如图)
selenium登录后访问其他页面,selenium,python,爬虫

通过抓包,我们能够清楚的知道请求网址及传递的参数。(如图)
selenium登录后访问其他页面,selenium,python,爬虫
现在唯一需要做的就是验证码的识别。通过开发者工具确定验证码图片位置,随后通过Session对象访问图片地址,并保存在本地。、
selenium登录后访问其他页面,selenium,python,爬虫
实现代码如下:

# 访问验证码地址
r2 = se.get(r'http://yuyue.XXX.XXX.cn/eduplus/validateimage', headers = headers)
image_path = 'test' + str(random.randint(0,99999)) + '.jpg'
with open(image_path, 'wb') as f:
    f.write(r2.content)

随后通过第三方接口,实现对验证码的识别及输出
(此次我选择的是图灵,虽然收费但是十分便宜)
实现代码如下:

# 图灵官方提供的API接口
def b64_api(username, password, img_path, ID):
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.fdyscloud.com.cn/tuling/predict", data=data_json).text)
    return result

# 通过图灵官方接口,识别验证码
result = b64_api(username="XXX", password="XXX", img_path=image_path, ID="XXXX")
validate_code = result.get('data').get('result')

向服务器发送请求,实现预约

最后汇总参数向服务器发起预约。以下为项目整体代码:

import time
import random
import json
import base64

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

# 图灵验证码识别官方接口
def b64_api(username, password, img_path, ID):
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.fdyscloud.com.cn/tuling/predict", data=data_json).text)
    return result


print('开始自动化操作')

# 绕过人机检查
options = webdriver.EdgeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

# 采用Edge驱动
wb = webdriver.Edge(options = options,service=Service(r'D:\软件\PyCharm Community Edition 2023.1.3\edgedriver_win64\msedgedriver.exe'))

# 绕过人机检查
wb.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

# 直接获取预约界面,随后跳转至登录界面。完成登录后,会再跳转至预约界面。
wb.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1')
# 设置隐式等待5秒
wb.implicitly_wait(5)

# 在登录界面,找到用户名和密码框
user = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[1]/input')
password = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[2]/input[1]')
login = wb.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div[4]/div/form/p[5]')

# 输入用户名及密码完成登录
user.send_keys('XXX')
password.send_keys('XXX')
login.click()


time.sleep(3)

# 打印wb中所有的cookies
print(wb.get_cookies())


headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Host': 'XXX.XXX.edu.cn',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}


# 创建session对话对象
se = requests.Session()
# 将wb中所有的cookies传递给session对象
for co in wb.get_cookies():
    requests.utils.add_dict_to_cookiejar(se.cookies, {co['name']: co['value']})

# 撤销wb对象内存
wb.close()

# 打印session对象中所有的cookies
print(se.cookies)

# 访问预约网址
r1 = se.get(r'http://XXX.XXX.edu.cn/eduplus/order/initOrderIndex.do?sclId=1', headers=headers)
# 打印预约网址源码,打印成功即成功登录
print(r1.text)

# 访问验证码网址
r2 = se.get(r'http://XXX.XXX.edu.cn/eduplus/validateimage', headers = headers)
image_path = 'test' + str(random.randint(0,99999)) + '.jpg'
with open(image_path, 'wb') as f:
    f.write(r2.content)

# 通过图灵官方接口,识别验证码
result = b64_api(username="XXX", password="XXX", img_path=image_path, ID="XXX")
validate_code = result.get('data').get('result')

# 相关预约参数
data={
    'useTime': 'XXX',    # 预约时段
    '预约项目': 'XXX',                        #  时段项目, 10 为九龙湖羽毛球
    'allowHalf': '2',
    'validateCode': validate_code,            # 验证码
    'phone': 'XXX',                  # 手机号
    'remark': ''                           # 备注
}


# 向网站发出预约
r3 = se.post('http://XXX.XXX.edu.cn/eduplus/order/order/getOrderInfo.do?sclId=1', headers=headers, data=data)

input('结束')

新人项目,欢迎指教交流!文章来源地址https://www.toymoban.com/news/detail-764963.html

到了这里,关于selenium+requests 实现网页跳转登录及爬取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium爬取网页内容,对网页内容进行点击

    所需要的库 首先明确所要爬取的网页,选择调用方法,增加无界面模式的无头参数,然后调用,获取网址,使页面放大,为最大化窗口 获取数据运用XPATH函数,将获取的数据作为item,运用XPATH函数获取,   模仿人点击下一页,运用 for语句,每10个一点,停留5秒 同样寻找下一

    2024年01月17日
    浏览(54)
  • 【爬虫】5.5 Selenium 爬取Ajax网页数据

    目录   AJAX 简介 任务目标 创建Ajax网站 创建服务器程序 编写爬虫程序         AJAX(Asynchronous JavaScript And XML,异步 JavaScript 及 XML) Asynchronous 一种创建 交互式 、 快速动态 网页应用的网页开发技术 通过在后台与服务器进行少量数据交换,无需重新加载整个网页的情况下

    2024年02月10日
    浏览(32)
  • Python实战:用Selenium爬取网页数据

    网络爬虫是Python编程中一个非常有用的技巧,它可以让您自动获取网页上的数据。在本文中,我们将介绍如何使用Selenium库来爬取网页数据,特别是那些需要模拟用户交互的动态网页。 Selenium是一个自动化测试工具,它可以模拟用户在浏览器中的操作,比如点击按钮、填写表

    2024年02月06日
    浏览(37)
  • python基于Selenium方法爬取网页图片

    selenium是一个用于web应用程序的自动化测试工具,通过Selenium可以写出自动化程序,拟人在浏览器对网页进行操作。selenium可以编写出自动化程序,简化手动保存的部分。 requests库可以向第三方发送http请求,是一个用于网络请求的模块,通常以GET方式请求特定资源,请求中不应

    2024年02月03日
    浏览(48)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(40)
  • Python使用Selenium Webdriver爬取网页所有内容

    有时候,我们在用urllib或者requests库抓取页面时,得到的html源代码和浏览器中看到的不一样。这将是我们面临的一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码可能就是一个空壳,

    2023年04月08日
    浏览(31)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(62)
  • 华纳云:Python中如何使用Selenium爬取网页数据

    这篇文章主要介绍“Python中如何使用Selenium爬取网页数据”,在日常操作中,相信很多人在Python中如何使用Selenium爬取网页数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中如何使用Selenium爬取网页数据”的疑惑有所帮助!接下

    2024年02月07日
    浏览(46)
  • 用selenium去爬取大麦网页面的演唱会信息

    利用selenium.webdriver爬取大麦网页面演唱会信息,信息包括: 演唱会标题、时间、价钱、地点、图片、网址。 操作环境: 1. Window10;  2. python3.9;   3. PycharmIDE 第三方库版本: 1. selenium 4.1.1 2. requests 2.28.1 本实验主要利用Goggle chrome浏览器进行,其中 浏览器版本为118开头 ,可在设

    2024年02月02日
    浏览(34)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包