请选择 进入手机版|继续访问电脑版
发新帖

Python 模拟浏览器请求,怎么保持前一个 get 和后一个 post 是对同一个页面进行处理呢 ...

[复制链接]
7610 18

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
如题..需要用到什么模块呢? requests 的话后一次 POST 是又一次对 URL 的请求了,不知道该怎么实现对上一次 GET 请求返回的页面进行请求呢?

举报 使用道具

回复

精彩评论18

wisej  新手上路  发表于 2018-5-16 17:32:33 | 显示全部楼层
如果你没有禁止重定向的话,我猜你是想要 r.url 这个值?

举报 使用道具

回复
302766392  新手上路  发表于 2018-5-16 17:33:12 | 显示全部楼层
可以建立一个会话连接
s = requests.session()
g_res = s.get(url, headers, params)
p_res = s.post(url, headers, data)

举报 使用道具

回复
shuax  新手上路  发表于 2018-5-16 17:40:50 | 显示全部楼层
我猜你是想用 session

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 17:47:27 | 显示全部楼层
import requests

# ses = requests.Session()
# first_url = "http://112.74.185.30:8080/yiban-web/stu/toSubject.jhtml?courseId=8"
# first_headers={
#     'host': '112.74.185.30:8080',
#     'Accept-Encoding': 'gzip, deflate',
#     'Upgrade-Insecure-Requests': '1',
#     'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1',
#     'Referer': 'http://112.74.185.30:8080/yiban-web/stu/toCourse.jhtml',
#     'DNT': '1',
#     'Connection': 'keep-alive',
# }
# first_cookies = {'JSESSIONID': '0D7E4E12942F878489DEA60B97561F8F'}

# res=ses.get(url=first_url,cookies=first_cookies)

headers = {
    'host': '112.74.185.30:8080',
    'Accept': 'application/json',
    'X-Requested-With': 'XMLHttpRequest',
    'Accept-Language': 'zh-cn',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'http://112.74.185.30:8080',
    'Content-Length': '57',
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1',
    'Referer': 'http://112.74.185.30:8080/yiban-web/stu/toSubject.jhtml?courseId=8',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Cookie': 'xxx',
}

data={
    'answer':'A',
    'courseId':'8',
    'uuid':'EB180D559F46426DAD2E9916DEA501DBxxxxxx'
}

res = requests.post(url='http://112.74.185.30:8080/yiban-web/stu/changeSituation.jhtml?_=1526406696684',headers=headers, data=data)
print(res.text)


====================================
注释里 GET 得到的页面里,有个 UUID 在一段 JS 代码里,然后我想得到这个 UUID 并且加到 DATA 中去 POST 刚刚 GET 得到的内容

举报 使用道具

回复
manzhiyong  新手上路  发表于 2018-5-16 17:47:58 | 显示全部楼层
webdriver 了解一下

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 18:27:39 | 显示全部楼层
@wisej 新回复贴了代码,是想得到 GET 页面生成的一段 KEY 值

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 18:35:39 | 显示全部楼层
谢谢楼上各位,我试试这俩方法。。

举报 使用道具

回复
hopetree  新手上路  发表于 2018-5-16 18:41:19 | 显示全部楼层
session 就行

举报 使用道具

回复
wisej  新手上路  发表于 2018-5-16 18:41:58 | 显示全部楼层
@Ruohua3kou 我一般是正则提取

举报 使用道具

回复
mavious  新手上路  发表于 2018-5-16 18:43:07 | 显示全部楼层
session 是用来保持 cookies 的,让 URL1 携带着 cookies 到下一个 URL2 里去。感觉不适用于 LZ 的要求。

举报 使用道具

回复
monologuechi  新手上路  发表于 2018-5-16 19:00:53 | 显示全部楼层
我也有遇到过这种问题,需要先获取页面生成的随机数,然后随机数要提交到表单里

举报 使用道具

回复
yenvy  新手上路  发表于 2018-5-16 19:06:11 | 显示全部楼层
没懂,就算用浏览器来真的不也是两次请求吗

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 19:09:38 | 显示全部楼层
import requests
import re
import json

ses = requests.Session()
first_url = "htt [防检测] p://112.74.185.30:8080/yiban-web/stu/toSubject.jh [防检测] tml?courseId=8"
first_headers={
    'host': '1 12.74.185.30:8080',
    'Accept-Encoding': 'gzip, deflate',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1',
    'Referer': 'h [防检测] ttp://112.74.185.30:8080/yiban-web/stu/toCourse.jht [防检测] ml',
    'DNT': '1',
    'Connection': 'keep-alive',
}
first_cookies = {'JSESSIONID': 'E3857AA04B846ED5414BA5EE0421617F'}

res=ses.get(url=first_url,cookies=first_cookies)

text=res.text
answer = re.findall(r'"answer":\"(.*?)\"',text)
uuid = re.findall(r'baseInfoData.data.uuid = \'(.*)\'', text)

headers = {
    'host': '112.74.185.30:8080',
    'Accept': 'application/json',
    'X-Requested-With': 'XMLHttpRequest',
    'Accept-Language': 'zh-cn',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/json; charset=UTF-8',
    'Origin': 'ht [防检测] tp://112.74.185.30:8080',
    'Content-Length': '57',
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1',
    'Referer': 'h [防检测] ttp://112.74.185.30:8080/yiban-web/stu/toSubject.jht [防检测] ml?cour [防检测] seId=8',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Cookie': 'JSESSIONID=0D7E4E12942F878489DEA60B97561F8F',
}

data={
    'answer':'A',
    'courseId':'8',
    'uuid':''
}
data['uuid'] = uuid[0]
data['answer']=answer[0]

res = ses.post(url='ht [防检测] tp://112.74.1 [防检测] 85.30:8080/yiban-web/stu/changeSituation.jht [防检测] ml',
               headers=headers, data=json.dumps(data))
print(res.text)

===========================================
利用 session(),使上次 get 和下次 post 成功对同一个页面请求了,但是第二次的 post 从被验证为非法访问变成了响应头 500.....(应该是 UUID 对上了所以验证为合法访问了,但是不知道什么原因出现 500 错误) 看了下,第一次 GET 到的页面中提交函数是用 muj.ajax (我不太懂 js。。),
function changeSituation(answer){

            var data={'answer':answer,'courseId':baseInfoData.data.subject.courseId,'uuid':baseInfoData.data.uuid};

            mui.ajax({

                        url: '/yiban-web/stu/changeSituation.jhtml',

                        async: true,

                        cache: false,

                        type: 'post',

                        data:data,

                        dataType: 'json',
                       …………………………

=============================================
不知道现在有什么解决办法呢,望请教!

举报 使用道具

回复
legendai  新手上路  发表于 2018-5-16 19:15:45 | 显示全部楼层
如果 KEY 是服务器返回的值,直接 get 一次页面,再用正则之类的提取就行了;如果 KEY 是本地生成的,找到它的生成逻辑自己再实现一下就 ok 了。get 和 post 之间不需要有关系啊。

举报 使用道具

回复
legendai  新手上路  发表于 2018-5-16 19:24:05 | 显示全部楼层
@Ruohua3kou 刚遇到 过一个 5xx 错误,可能你需要把 post 里面的参数名从 data 换成 json

举报 使用道具

回复
zyqf  新手上路  发表于 2018-5-16 19:31:51 | 显示全部楼层
第一:headers 一般不需要写死 cookie,Session() 会自动帮你维护 。
第二:注意下表单是否有类似 csrf_token 的值。

另外注意下排版问题。希望能帮到你。

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 19:44:24 | 显示全部楼层
@LeGendAI 刚试了下,data 改成 json=json.dumps(data)了,TAT 还是不行

举报 使用道具

回复
ruohua3kou  新手上路  发表于 2018-5-16 19:52:55 | 显示全部楼层
@zyqf 感谢提醒 !  但是没找到类似 csrf_token 的值,第一次发帖,我会注意排版的。。

举报 使用道具

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

本版积分规则

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