python使用requests进行登录操作,抓取所需信息

这篇具有很好参考价值的文章主要介绍了python使用requests进行登录操作,抓取所需信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本次抓取的是百傲瑞达的考勤机系统的数据。地址为内网地址172.200.0.200:8098

先简单介绍下系统页面及想要抓取数据的页面

python的requests登录验证,前端

登录页面输入用户名密码会跳转到一个统计的黑板页面

python的requests登录验证,前端

想要抓取的数据页面如下

python的requests登录验证,前端

 解析下网站登录请求和打卡详情请求

页面登录会出现跳转,f12无法定位到发送的请求记录,使用fiddler进行数据抓包

python的requests登录验证,前端

 可以看到登录请求的地址,请求数据的格式content-type:application/x-www-form-urlencoded

python的requests登录验证,前端

请求的参数username,password,loginType,checkCode其中password的值与我们输入的值是不同的,存在某种加密。不必考虑这个数据是通过什么加密方式进行加密的,在请求的时候直接传递这个值即可。

python的requests登录验证,前端

 请求后返回的content内容,说明请求成功。

python的requests登录验证,前端

 cookies中也有服务器返回的cookie数据,从返回头中我们也可以看到相关的数据。cookie数据是我们请求该网站别的地址必须的参数。

python的requests登录验证,前端

 使用postcat工具(postman等都可)测试下登录操作

python的requests登录验证,前端

 可以验证登录操作是能正常返回数值的。

python的requests登录验证,前端

 返回头的数据也包含了我们需要的cookie数据。

接下来看下我们需要的获取的数据是如何请求到的。

 python的requests登录验证,前端

可知是通过这个地址的请求获取到的数据 

python的requests登录验证,前端

 请求头中数据的类型,请求头的值

python的requests登录验证,前端

传递的参数及值。

然后使用postcat进行验证下想法是否正确

python的requests登录验证,前端

 python的requests登录验证,前端

 请求结果如下:

python的requests登录验证,前端

进行第二页请求的时候,发现参数变了,增加了几个参数,没必要再次测试加参后的调用了。

python的requests登录验证,前端

 接下来进行代码实现

import requests

url = 'http://172.200.0.200:8098/login.do'
data = {
    'username': 'admin',
    'password': '21232f297a57a5a743894a0e4a801fc3',
    'loginType': 'NORMAL'
}
#该网站没有拦截非浏览器的请求,因此没有定义header,也可定义个header,post操作的时候将header参数带上

response = requests.post(url, data=data)
print(response.content.decode("utf-8"))
headers = response.headers
print(headers.get('Set-Cookie'))

python的requests登录验证,前端

请求打卡记录信息

temp_session=headers.get('Set-Cookie')
cookies = {
    'SESSION': temp_session
}

data_daka=MultipartEncoder(
    fields={
        'list':'',
        'pageSize':'50',
        'startApplyDateTime': '2022-05-25 00:00:00',
        'endApplyDateTime': '2022-08-25 23:59:59'
    }
)

header = {
    'Cookie': 'SESSION=' + temp_session,
    'Content-Type': data_daka.content_type,
    # 'Content-Type': mk.content_type,
    'X-Requested-With': 'XMLHttpRequest'
}
# daka_url='http://172.200.0.200:8098/attLeave.do'
daka_url='http://172.200.0.200:8098/attDayCardDetailReport.do'

response2 = requests.post(daka_url, data=data_daka,headers=header)
print(response2.content.decode(encoding="utf-8"))

发现print一下,发现打印出来的是登录页的信息,,这表示我们登录是失败的,此时我们重新分析下造成没有登录成功的原因。

仔细研究下fiddler捕获的数据,发现在login.do之前还有两个请求。并没有搞明白这两个请求是什么意思,不过可以实验下,大概就是一些验证的一些手段。接下来做个测试来看下。

python的requests登录验证,前端

 先进行portalPwdEffectiveCheck,接下来的请求所用的session要保持一致,请求数据的值不清楚是什么意思,直接使用fiddler捕获的这个数据。python的requests登录验证,前端

 接下来portalCheckStrength操作

python的requests登录验证,前端

 然后再进行login操作

python的requests登录验证,前端

接下来验证下这次获取的session是否正确

 python的requests登录验证,前端

bingo!验证了猜想,确实是通过这种方式进行验证信息的,接下来直接上代码!

 

import requests
from requests_toolbelt import MultipartEncoder
import uuid

etoken=str(uuid.uuid4())
# portalPwdEffectiveCheck
url_check = "http://172.200.0.200:8098/portalPwdEffectiveCheck.do"
payload = "content=oVxLMq8Ye7UkQ.2FZdY0.2F5PqBU9mi3CWlLYkG6mM013J1BJuxzJyVhQMTqDrx6cXaq.2FpfS4ftO6g0QoDhdJripOXsklVC.2BpZSyI9GXuzcr7VHArOJkJZetZ.2BhOF1SQMYIU"
headers = {
    'Content-Type': 'text/html',
    'eo-token':etoken
}
check_response = requests.post(url_check, data=payload, headers=headers)
temp_cookie = check_response.headers.get('Set-Cookie').split(';')[0]
nologin_cookie = check_response.cookies
print("请求的:"+temp_cookie)
print("请求代码获取的"+str(nologin_cookie.items()))
ectoken=check_response.headers.get('eo-token')

# portalCheckStrength
url_strength='http://172.200.0.200:8098/portalCheckStrength.do'
strength_payload="strength=-1"
headers = {
    'Content-Type': 'text/html',
    'cookie':temp_cookie,
    'eo-token':etoken
}
strength_response=requests.post(url_strength,data=strength_payload,headers=headers)
print(strength_response.content.decode('utf-8'))


# login
login_url='http://172.200.0.200:8098/login.do'
login_data = {
    'username': 'admin',
    'password': '21232f297a57a5a743894a0e4a801fc3',
    'loginType': 'NORMAL'
}
login_headers={
    'cookie':temp_cookie
}
response = requests.post(login_url, data=login_data,headers=login_headers)
print("login的cookie:"+str(response.cookies.items()))

login_session=response.headers.get('Set-Cookie').split(';')[0]
print("登陆后的session"+login_session)


#数据获取测试
daka_data=MultipartEncoder(
    fields={
        'list':'',
        'pageSize':'50',
        'startApplyDateTime': '2022-05-25 00:00:00',
        'endApplyDateTime': '2022-08-25 23:59:59'
    }
)

header = {
    'Cookie': login_session,
    'Content-Type': daka_data.content_type,
    'X-Requested-With': 'XMLHttpRequest'
}
# daka_url='http://172.200.0.200:8098/attLeave.do'
daka_url='http://172.200.0.200:8098/attDayCardDetailReport.do'

response2 = requests.post(daka_url, data=daka_data,headers=header)
print(response2.content.decode(encoding="utf-8"))

运行代码,完美解决该问题!

python的requests登录验证,前端

 其实这种登录页面直接使用requests进行操作比较麻烦,我们可以使用selenium进行登录,获取登录后的cookie值,然后就可以进行个人操作了,这里需要使用到webdriver,建议使用chromedriver,由于本人的chrome版本太高了,官方没有给出这个版本的driver,因此使用了edgedriver,话不多说,直接上代码!

from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
from requests_toolbelt import MultipartEncoder
import json
import time
#  options=option,executable_path='path_to_edge_driver', service_args=["--verbose"], service_log_path="NUL", 
option = webdriver.EdgeOptions()
option.add_argument("headless")

driver = webdriver.Edge(option)
# option=webdriver.EdgeOptions()
# option.add_argument("headless")
# driver = webdriver.Edge()
driver.get('http://172.200.0.200:8098/')
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, '#username').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '#password').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '#test').click()
cookie=driver.get_cookies()
print(cookie[0]['value'])

qj_url='http://172.200.0.200:8098/attLeave.do'
mk = MultipartEncoder(
    fields={
        'list': '',
        'pageSize': '800',
        'startApplyDateTime': '2022-05-25 00:00:00',
        'endApplyDateTime': '2022-08-25 23:59:59'
    }
)
pheader = {
    'Cookie': 'SESSION=' + cookie[0]['value'],
    'Content-Type': mk.content_type,
    'X-Requested-With': 'XMLHttpRequest'
}
r=requests.post(qj_url,data=mk,headers=pheader)
rows = json.loads(r.content.decode(encoding="utf-8"))
print(rows)

这里有个坑,就是sleep这个位置,不解释了文章来源地址https://www.toymoban.com/news/detail-796295.html

到了这里,关于python使用requests进行登录操作,抓取所需信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用javaweb实现登录注册页面,并且对功能和业务进行分层 用户登录成功跳转到主页并展示数据库的商品的信息

    一、Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。 这里以一个最常用的用户登录

    2024年02月03日
    浏览(36)
  • Python爬虫技术系列-03/4flask结合requests测试静态页面和动态页面抓取

    flask内容参考:Flask框架入门教程(非常详细) 安装flask 创建一个webapp.py文件,内容如下 运行代码 终端输出如下: 在浏览器输入 返回如下 创建webapp_html_str.py文件,代码如下: 运行 运行代码 在浏览器输入 返回如下 返回一个静态html页面 在工程目录下,创建一个templates目录,在

    2024年02月04日
    浏览(32)
  • 使用jsp、HttpServlet完成一个登录、注册,并用MySQL连接数据进行操作

    这两个是写数据库的软件。  启动MySQL对应的版本型号。 user表 1.判断存在(有没有login的数据库,有就删掉)即删除。 DROP DATABASE IF EXISTS login; 2.创建数据库,使用数据库  #创建数据库 CREATE DATABASE login; #使用数据库 use login; 3.创建一个表我们这定义叫user,给表增添3条数据 #创

    2024年02月04日
    浏览(37)
  • python爬虫——怎么抓取职位信息

    目录 背景 为什么要抓取职位信息 怎么抓取职位信息 代码示例 被反爬怎么办 使用代理IP进行爬取 总结 高考刚结束,马上又到了大学生毕业的时候了,各大厂也开始了一波招工潮了,想知道大厂或竞争对手都招些什么人,有什么需求,于是打算爬点职位信息参考下。 抓取职

    2024年02月09日
    浏览(31)
  • kali 使用后台进行手机拍照,查看定位,获取信息,(通讯录等操作)

    控制安卓手机拍照,查看定位,获取通信录 引言 准备工作 1. kali、手机 2.戴上眼睛注意别敲错命令,复制的时候注意看! 开始了!!! First Second ** 大家好,我是Zues,今天我来教会大家一个入侵安卓手机控制手机拍照,查看定位,获取通信录,查看手机内容。 本作品只适用于

    2024年02月20日
    浏览(29)
  • 接口的返回值中所需信息作为其他接口入参使用(postman与jmeter的使用)

    一、背景:  偶尔会用到一个场景,两个接口之前的调用有依赖关系,将其中一个的返回参数中的部分信息取出来作为入参在第二个接口中使用,代码内是比较好实现,只要定义一个变量,用于参数传递。 如果是测试过程中使用的的话,比如postman与jmeter的话也是可以实现,

    2024年01月21日
    浏览(33)
  • python使用selenium打开chrome浏览器时带用户登录信息

    导读 我们在使用 selenium 打开google浏览器的时候,默认打开的是一个新的浏览器窗口,而且里面不带有任何的浏览器缓存信息。当我们想要爬取某个网站信息或者做某些操作的时候就需要自己再去模拟登陆 selenium操作浏览器 这里我们就以CSDN为例,来展示如何让selenium在打开

    2023年04月24日
    浏览(39)
  • Python 使用requests模块进行ip代理时报错:AttributeError: ‘str‘ object has no attribute ‘get‘

    我正在进行代理ip的测试,但报了这么个错误: AttributeError: \\\'str\\\' object has no attribute \\\'get\\\' 从“芝麻代理”获取代理ip,用这些代理ip访问百度,如果返回状态码200,就算成功 当我执行上面的代码后,报了这么个错误: AttributeError: \\\'str\\\' object has no attribute \\\'get\\\' 经过多次排查,确定

    2024年02月03日
    浏览(29)
  • 使用Python的Requests和BeautifulSoup库来爬取新闻网站的新闻标题、发布时间、内容等信息,并将数据存储到数据库中

    BeautifulSoup是Python的一个HTML/XML解析库,用于从HTML或XML文件中提取数据。结合Python的requests库,可以实现网页爬取和数据提取。 以下是一个简单的使用BeautifulSoup和requests库实现爬虫的示例:   用requests库和BeautifulSoup4库,爬取校园新闻列表的时间、标题、链接、来源。

    2024年02月10日
    浏览(38)
  • 使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

    兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录。 目标:某 7 网游登录 主页:aHR0cHM6Ly93d3cuMzcuY29tLw== 接口:aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA== 逆向参数:Query String Parameters: password: SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM

    2023年04月13日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包