首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  
  •   Ruohua3kou · 11 天前 · 1294 次点击

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

    第 1 条附言  ·  11 天前
    原题目问题利用 session 解决了。。
    现在是不知道什么原因导致 post 响应 500 (未用 session 前因为 post 的某值与上一次 get 的某值不符合被认为非法访问)
    该脚本原本是打算写一个自动答题的脚本
    ===================================
    import requests
    import re
    import json

    ses = requests.Session()
    ....
    字数显示,具体已在楼中回复
    ....
    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',
    …………………………
    第 2 条附言  ·  11 天前
    第二次修改之后:
    在第二个 headers 里添加 cookies 字典时,响应:{"data":{},"isSuccess":false,"message":"非正常访问!答题失败"}

    不添加 cookies
    第 3 条附言  ·  11 天前
    不小心点了提交。。
    接上,不在 headers 里添加 cookie 时,返回响应 500 Internal Server Error
    20 回复  |  直到 2018-05-17 04:28:04 +08:00
        1
    wisej   11 天前
    如果你没有禁止重定向的话,我猜你是想要 r.url 这个值?
        2
    302766392   11 天前   ♥ 1
    可以建立一个会话连接
    s = requests.session()
    g_res = s.get(url, headers, params)
    p_res = s.post(url, headers, data)
        3
    shuax   11 天前   ♥ 1
    我猜你是想用 session
        4
    Ruohua3kou   11 天前
    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 得到的内容
        5
    manzhiyong   11 天前   ♥ 1
    webdriver 了解一下
        6
    Ruohua3kou   11 天前
    @wisej 新回复贴了代码,是想得到 GET 页面生成的一段 KEY 值
        7
    Ruohua3kou   11 天前
    谢谢楼上各位,我试试这俩方法。。
        8
    Hopetree   11 天前   ♥ 1
    session 就行
        9
    wisej   11 天前   ♥ 1
    @Ruohua3kou 我一般是正则提取
        10
    Mavious   11 天前
    session 是用来保持 cookies 的,让 URL1 携带着 cookies 到下一个 URL2 里去。感觉不适用于 LZ 的要求。
        11
    MonoLogueChi   11 天前 via Android
    我也有遇到过这种问题,需要先获取页面生成的随机数,然后随机数要提交到表单里
        12
    YenvY   11 天前
    没懂,就算用浏览器来真的不也是两次请求吗
        13
    Ruohua3kou   11 天前
    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',
    …………………………

    =============================================
    不知道现在有什么解决办法呢,望请教!
        14
    LeGendAI   11 天前
    如果 KEY 是服务器返回的值,直接 get 一次页面,再用正则之类的提取就行了;如果 KEY 是本地生成的,找到它的生成逻辑自己再实现一下就 ok 了。get 和 post 之间不需要有关系啊。
        15
    LeGendAI   11 天前
    @Ruohua3kou 刚遇到 过一个 5xx 错误,可能你需要把 post 里面的参数名从 data 换成 json
        16
    zyqf   11 天前 via Android
    第一:headers 一般不需要写死 cookie,Session() 会自动帮你维护 。
    第二:注意下表单是否有类似 csrf_token 的值。

    另外注意下排版问题。希望能帮到你。
        17
    Ruohua3kou   11 天前
    @LeGendAI 刚试了下,data 改成 json=json.dumps(data)了,TAT 还是不行
        18
    Ruohua3kou   11 天前
    @zyqf 感谢提醒 ! 但是没找到类似 csrf_token 的值,第一次发帖,我会注意排版的。。
        19
    chrisyunhua   11 天前
    .post(url, json=dict)
        20
    xiaol825   11 天前
    fiddler 抓包看一下,对比下自己代码模拟发送的请求和真实的浏览器发送的请求的区别。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   528 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 21:49 · PVG 05:49 · LAX 14:49 · JFK 17:49
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1