鱼C论坛

 找回密码
 立即注册
查看: 1720|回复: 14

[已解决]cookie 登录网页后如何继续访问其他页面

[复制链接]
发表于 2023-8-5 11:36:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 itzyx 于 2023-8-5 11:41 编辑

各位大佬最近想做个访问公司人事网页考勤数据的脚本,来统计自己的加班时长。
因为网页访问需要账号密码登录,我一开始看网上可以用会话的方法解决,但是找半天没找到登录的相关信息,无奈只能登录后,获取cookie 去模拟登录。
用cookie 已经成功登录,通过find_all 获取到了考勤的关键字,但考勤是在人事主页面点进去的另一个网页, 用关键字提取,我获取到了这个url地址
首先我没用cookie,直接request.get, 但是获取的数据不对,我又分别用登录主页面的cookie,和考勤界面的cookie, 去获取数据,但都不是我想要的,看视频,百度都没解决,所以想请教各位大佬,有没有什么办法能解决?
下面是截图还有代码:
import requests
import urllib.parse
from bs4 import BeautifulSoup

# 输入的Cookie字符串
cookie_str = "cookies 这里搞个演示"
# 解码Cookie字符串
decoded_cookie = urllib.parse.unquote(cookie_str)
# 分割Cookie
cookie_parts = decoded_cookie.split("; ")
# 创建一个字典来存储Cookie项
cookie_data = {}
for part in cookie_parts:
    key, value = part.split("=")
    cookie_data[key] = value

login_url = 'https://hr.xxxx.com/portal/index'  # 页面URL
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
response = requests.get(login_url, cookies=cookie_data, headers=headers)
if response.status_code == 200:
    response.encoding = response.apparent_encoding  # 文字解码
    soup = BeautifulSoup(response.text, 'html.parser')
    app = soup.find('a', attrs={'title': "个人考勤查询"}).get('href')
    url2 = 'https://hr.xxxx.com/' + app
    response = requests.get(url2, cookies=cookie_data, headers=headers)
    response.encoding = response.apparent_encoding  # 文字解码
    soup = BeautifulSoup(response.text, 'html.parser')
    times=soup.find_all('span')
else:
    print('网页登录失败!')
最佳答案
2023-8-5 12:21:45
itzyx 发表于 2023-8-5 12:19
selenium 感觉就有点复杂了,我本意想的是直接获取数据呢,大佬,这个问题,为啥我打开开发者模式,点击 ...

对于动态渲染的数据还是selenium比较适合初学者,它并不复杂,如果没学过可以问chatgpt

你在检查元素那里看到的并不是它的源代码,而是经过动态渲染后构建的文档树,你当然可以看到你想要的数据了,这就是为什么有时候你从检查元素那里复制出来的xpath或css选择器不能用的原因

登录人事网页,主界面显示的信息

登录人事网页,主界面显示的信息

点击个人考勤,展示的信息

点击个人考勤,展示的信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-5 11:36:55 | 显示全部楼层
问题描述:
用户想要通过模拟登录公司人事网页来获取考勤数据,已经成功获取到登录后的cookie,并且通过关键字提取到了考勤页面的URL。但是尝试直接使用cookie去访问考勤页面,获取的数据不正确。请问如何解决这个问题?

解决方法:
在模拟登录后,需要将获取到的cookie传递给后续的请求,以保持会话的状态。根据提供的代码,可以看到已经将cookie传递给了requests.get()方法的cookies参数。但是问题可能出在cookie的正确性上。

首先,建议确认一下获取到的cookie是否正确。可以通过打印cookie_data字典来检查。确保cookie中包含了必要的登录信息。

其次,可以尝试在请求考勤页面之前,先访问一下登录主页面,以确保cookie被正确地传递和使用。可以在登录主页面的请求后,打印一下response的内容,检查是否已经成功登录。

另外,建议在请求考勤页面之前,添加一些必要的请求头信息,例如Referer。可以参考登录主页面的请求头信息,将相关的请求头添加到访问考勤页面的请求中。

最后,建议检查一下考勤页面的URL是否正确。可以打印一下拼接后的url2,确认是否与实际期望的URL一致。

综上所述,可以按照上述方法逐步排查问题,确保cookie正确传递和使用,以及请求头信息正确设置,最终获取到正确的考勤数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 11:47:05 | 显示全部楼层
试试用 session 看看
import requests
import urllib.parse
from bs4 import BeautifulSoup

# 输入的Cookie字符串
cookie_str = "cookies 这里搞个演示"
# 解码Cookie字符串
decoded_cookie = urllib.parse.unquote(cookie_str)
# 分割Cookie
cookie_parts = decoded_cookie.split("; ")
# 创建一个字典来存储Cookie项
cookie_data = {}
for part in cookie_parts:
    key, value = part.split("=")
    cookie_data[key] = value

login_url = 'https://hr.xxxx.com/portal/index'  # 页面URL
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
sess = requests.Session()
response = sess.get(login_url, cookies=cookie_data, headers=headers)
if response.status_code == 200:
    response.encoding = response.apparent_encoding  # 文字解码
    soup = BeautifulSoup(response.text, 'html.parser')
    app = soup.find('a', attrs={'title': "个人考勤查询"}).get('href')
    url2 = 'https://hr.xxxx.com/' + app
    response = sess.get(url2, headers=headers)
    response.encoding = response.apparent_encoding  # 文字解码
    soup = BeautifulSoup(response.text, 'html.parser')
    times=soup.find_all('span')
else:
    print('网页登录失败!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 11:49:19 | 显示全部楼层
isdkz 发表于 2023-8-5 11:36
问题描述:
用户想要通过模拟登录公司人事网页来获取考勤数据,已经成功获取到登录后的cookie,并且通过关 ...

感谢解答!
① 获取的cookie 是正确的,已经成功登录人事页面,response 状态200正常;
② 考勤的URL也是正确的,人工直接点击URl, 可以打开个人考勤界面(代码获取的数据异常,是不是可能跟个人考勤页面的数据是动态渲染的呢,然后获取不到,这点不太清楚)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 11:51:07 | 显示全部楼层
isdkz 发表于 2023-8-5 11:47
试试用 session 看看

好的,大佬 我也试过,但是第一次用会话,可能哪里有问题,提示我参数异常。我再试一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 11:52:03 | 显示全部楼层
itzyx 发表于 2023-8-5 11:49
感谢解答!
① 获取的cookie 是正确的,已经成功登录人事页面,response 状态200正常;
② 考勤的URL也 ...

你看他是不是动态渲染的可以用以下方法:

点击导航栏左边的锁头 -> 此网站的权限 -> 把允许javascript禁用 -> 刷新一下网页看看有没有你想要的元素,如果没有的话就说明它是动态渲染上去的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 12:02:20 | 显示全部楼层
itzyx 发表于 2023-8-5 08:49
感谢解答!
① 获取的cookie 是正确的,已经成功登录人事页面,response 状态200正常;
② 考勤的URL也 ...

根据代码和描述,可能导致获取不到个人考勤页面数据的原因有以下几点:

动态渲染:个人考勤页面的数据是否是通过 JavaScript 动态加载或渲染的。如果是动态渲染的,使用 requests 库获取页面的静态 HTML 内容可能无法获取到完整的数据。你可以尝试使用相关的爬虫框架(如 Scrapy、Selenium)来模拟浏览器行为,获取页面中动态渲染的数据。

登录状态:尽管你已经在代码中设置了正确的 Cookie 并请求了登录页面成功,但个人考勤页面可能需要更多的认证信息或会话状态才能够正常访问。你可以检查一下在打开个人考勤页面时是否需要额外的 Cookie 或其他认证参数,并将其包含在请求中。

数据定位错误:在代码中,你使用了 Beautiful Soup 解析页面,并尝试找到标题为 "个人考勤查询" 的链接。但这只是一个假设,如果页面结构或元素发生变化,可能无法正确定位到相应的链接或数据。你可以在浏览器中检查页面源代码,确认目标数据的准确位置,并相应地调整代码中的定位逻辑。

总之,要解决这个问题,你可以先检查页面是否通过动态渲染加载数据,进一步确认访问个人考勤页面所需的认证信息,以及确认数据的准确位置和解析方式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 12:09:20 | 显示全部楼层
本帖最后由 itzyx 于 2023-8-5 12:11 编辑
isdkz 发表于 2023-8-5 11:52
你看他是不是动态渲染的可以用以下方法:

点击导航栏左边的锁头 -> 此网站的权限 -> 把允许javascript ...


我禁用了javascript,刷新一下,网页空白了,应该是动态渲染的数据,但是我有个疑问,为啥我打开开发者模式,点击界面相关位置,检查元素能看到我想要的数据呢。 不太懂这个,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 12:09:56 | 显示全部楼层
Mike_python小 发表于 2023-8-5 12:02
根据代码和描述,可能导致获取不到个人考勤页面数据的原因有以下几点:

动态渲染:个人考勤页面的数据 ...

大佬 刚试了 是动态渲染的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 12:12:11 | 显示全部楼层
itzyx 发表于 2023-8-5 12:09
我禁用了javascript,刷新一下,网页空白了,应该是动态渲染的数据。

既然是动态渲染的,你就在开发者界面的 network 标签 ctrl + f 搜索你想要的数据,看看是来自于哪个请求的,

看看你有没有办法构造相应的请求来获取到数据

要不然就用 selenium
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 12:12:59 | 显示全部楼层
isdkz 发表于 2023-8-5 12:12
既然是动态渲染的,你就在开发者界面的 network 标签 ctrl + f 搜索你想要的数据,看看是来自于哪个请求 ...

记得先把javascript启用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 12:19:00 | 显示全部楼层
isdkz 发表于 2023-8-5 12:12
既然是动态渲染的,你就在开发者界面的 network 标签 ctrl + f 搜索你想要的数据,看看是来自于哪个请求 ...

selenium 感觉就有点复杂了,我本意想的是直接获取数据呢,大佬,这个问题,为啥我打开开发者模式,点击界面相关位置,检查元素能看到我想要的数据呢。这个是动态渲染吗?但是我禁用javascript刷新又没数据了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 12:21:45 | 显示全部楼层    本楼为最佳答案   
itzyx 发表于 2023-8-5 12:19
selenium 感觉就有点复杂了,我本意想的是直接获取数据呢,大佬,这个问题,为啥我打开开发者模式,点击 ...

对于动态渲染的数据还是selenium比较适合初学者,它并不复杂,如果没学过可以问chatgpt

你在检查元素那里看到的并不是它的源代码,而是经过动态渲染后构建的文档树,你当然可以看到你想要的数据了,这就是为什么有时候你从检查元素那里复制出来的xpath或css选择器不能用的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-5 12:30:19 | 显示全部楼层
isdkz 发表于 2023-8-5 12:21
对于动态渲染的数据还是selenium比较适合初学者,它并不复杂,如果没学过可以问chatgpt

你在检查元素 ...

好的 感谢大佬解答,我试试seleium,之前搞过一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 12:40:42 | 显示全部楼层
itzyx 发表于 2023-8-5 12:30
好的 感谢大佬解答,我试试seleium,之前搞过一次

不客气,一些代码可以问chatgpt怎么写,但是chatgpt的数据比较老旧,现在selenium这个库早就更新了

如果你直接使用chatgpt的代码可能会出现问题,你只需要把报错信息复制到百度搜索资料即可,或者也可以结合使用新必应或者百度的文心一言之类的

没有chatgpt的话可以用这个镜像站:https://c.binjie.fun/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表