首页   注册   登录
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 中怎么执行 js?

  •  
  •   wsds · 157 天前 · 2672 次点击
    这是一个创建于 157 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景:爬虫 遇到的问题:获取页面隐藏的 token 节点,难道通过接口爬的东西,还要去自动化打开网页,取到 token,再塞进接口里边??

    2 个问题: 1、python 如何执行 js 2、这种场景的问题,是怎么解决的?难道真要通过 selenium 取打开网页,去找到 token,再回过去把取的值,放到接口里边用?

    第 1 条附言  ·  157 天前

    费劲获取 csrf-token 也没用,它这个还要验证 cookie,好强势的防爬措施,至少把我拦在门外了,不知道各位如何?

    Cookie: XSRF-TOKEN=eyJpdiI6IlpTM2JYUUdWeVN2XC9iSHdYNFNTSGFRPT0iLCJ2YWx1ZSI6IjhMTzVCM3ZRcDFaNE40TmRcL3BURjJNKzZ2QjRQT2NSaEFaQUVYTmlVUGZTMzRZdFdRYWNabE9wMnFBdytXdERvRWIzM1RPemY1eTh0R3d0cWtqMjNUUT09IiwibWFjIjoiZjVkNzRhM2Y4NjE4MWZkYWRlODQ5Y2ZjMjk4NGQ4MWJlNGNhMWNlYWM3YTMwYjQ0YTljNTNjNzY3ODA4Yjk3YyJ9; laravel_session=eyJpdiI6Ik1EQ3lcL205VUF1dzV5a1J0eVhFR1RBPT0iLCJ2YWx1ZSI6InZJMkROTDBaMXhDNGFpU2loXC92d0g1WWZFUFlNc0xDYzZicXF1TWc4bHRzaERYdUs0VWR5NlVCODUyWWNrY2FqNHZzbHQ1aUFZVURjcGtiZTlWczJOZz09IiwibWFjIjoiYTZkMmJjN2U0MTdiYzgzZDE1NzZhMjU5ZjE2ZjA5NWJmZTUzYzNmOTZlY2RkOWVkNWFjNjdhYjM2OTMxNDZmNiJ9
    
    34 回复  |  直到 2018-06-15 09:30:31 +08:00
        1
    est   157 天前
    纯 js 没有 DOM 的,你考虑清楚哦。
        2
    qianc1990   157 天前 via iPhone
    用 splash
        3
    zthxxx   157 天前
        4
    wly19960911   157 天前
    解析 DOM,然后 xpath 直接取页面的数据不行吗。我记得 python 不是提供的吗?又不是 JS 渲染的页面,不需要 selenium。
        5
    rabbbit   157 天前
    import execjs
    execjs.eval()
        6
    wsds   157 天前
    @wly19960911 python 可以解析 DOM 吗,通过 bs4?
        7
    tulongtou   157 天前 via iPhone
    读一下 JS 逻辑,用 Python 实现一下就好了,不必非要执行 JS
        8
    wsds   157 天前
    @tulongtou 就是要在 dom 中取值,python 能做到?
        9
    wly19960911   157 天前
    @tulongtou #7 我不了解 python 最近想试试爬虫玩玩,看了下 bs4 的介绍应该没什么问题,主要你搞错了问题。

    你运行 JS 只是为了获取 html 的值的话没什么意义的。本身 JS 有意义的在于需要根据各种事件和功能去执行业务流程,去修改 DOM 只是一个必要的流程,不管哪个语言都有库解析 XML 和 HTML。不需要执行 JS 都可以
        10
    wsds   157 天前
    @wly19960911 是这个意思,但我只能想到用 js 去取啊,还有其他 方法 吗
        11
    tulongtou   157 天前 via iPhone
    @wly19960911 为什么是艾特我?
        12
    wly19960911   157 天前
    @tulongtou #11 抱歉 AT 错了,
        13
    wly19960911   157 天前
    @wsds #10 你刚刚说的 BS4 的库应该没问题,你可以看看各种教程。
        14
    hahastudio   157 天前
    如果这个值写在了 HTML 里,比如 <input name="token" type="hidden" value="blablabla"> 这样的,可以用 bs4,甚至你直接用 XPath,正则什么的都行的
        15
    wsds   157 天前
    @hahastudio
    <input type="hidden" name="_token" value="UlORUHsXUBI7YKg2h73u8pEaWyqDhYioSa1ZYwUK">
    取这个 value 的值
        16
    wsds   157 天前
    @hahastudio 现在的问题是,我 requests.get("http://szjw.changsha.gov.cn/ywcx/"),返回的 dom 中,找不到这个 input
    好尴尬
        17
    just1   157 天前 via Android
    遇到过相同的问题,最后我选择了写 nodejs 脚本
        18
    hahastudio   157 天前
    @wsds 因为你想要的这个 token 是 iframe 里的
    <iframe id="Frame_Content" src="http://www.cszjw.net/preselllicence" frameborder="0" scrolling="auto" style="width: 100%; height:100%; min-height:600px;"></iframe>
    你打开 http://www.cszjw.net/preselllicence 就有了
        19
    wsds   157 天前
    @hahastudio 在 iframe 也没关系吧,requests.get()不是返回所有的 html 吗?
        20
    wplct   157 天前
    我也是最后选择了 node js 写了个 web 服务调用
    在脚本上模拟一些环境,如
    var navigator = {};
    navigator.userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
    navigator.vendor = "Google Inc.";
    // 电池状态相关
    navigator.getBattery = function () {
    var battery = {
    charging: true,
    chargingTime: 0,
    dischargingTime: Infinity,
    level: 1,
    onchargingchange: null,
    onchargingtimechange: null,
    ondischargingtimechange: null,
    onlevelchange: null
    };
    return new Promise(function (resolve, reject) {
    resolve(battery)
    });
    };
    然后在脚本后面开个服务器
    // 导入 koa,和 koa 1.x 不同,在 koa2 中,我们导入的是一个 class,因此用大写的 Koa 表示:
    const Koa = require('koa');
    // const koaBody = require('koa-body');
    // 创建一个 Koa 对象表示 web app 本身:
    const app = new Koa();
    // app.use(koaBody());
    // 对于任何请求,app 将调用该异步函数处理请求:
    app.use(async (ctx, next) => {
    await next();
    console.log(ctx.request.body)
    // const body = ctx.request.body;
    // if(!body.href){
    // body.href = ''
    // }
    ctx.response.type = 'text/html';

    ctx.response.body = get_isg('');
    });

    // 在端口 3000 监听:
    app.listen(3000);
    console.log('app started at port 3000...');
        21
    hahastudio   157 天前
    @wsds 如果你是这么认为的,我觉得你需要看更多的东西了。。。
        22
    kevanbin   157 天前
    ```
    from requests_html import HTMLSession
    def getToken():
    session = HTMLSession()
    url = 'http://www.cszjw.net/preselllicence'
    token = session.get(url).html.find('input[name="_token"]')[0].attrs['value']
    return token
    ```
        23
    wsds   157 天前
    @kevanbin 为什么这个页面用这个方法 不行? http://szjw.changsha.gov.cn/ywcx/
        24
    mitnick   157 天前
        25
    Leigg   157 天前 via iPhone
    pyv8
        26
    param   157 天前 via Android
    @wplct nodejs 你写个脚本调用不好吗
        27
    Zzdex   157 天前
    可以用 execjs
        28
    Alpha   157 天前
    phatomjs 就可以解决问题
        29
    congeec   157 天前 via iPhone
    PyV8 老了,用 py_mini_racer
        30
    flowfire   157 天前 via iPhone
    headless chrome 了解一下
        31
    kevanbin   157 天前
    @wsds iframe 中的代码,无法在网页源代码中得到
        32
    wsds   157 天前
    @kevanbin 了解了,感谢
        33
    beforeuwait   154 天前
    phantomJS 就可以了啊
    我有个类似的项目,一样的 js 算出一个 token 和一个 t,然后放到 cookie 里。
    在拿到 js 后,写一个接收函数,然后 phantom 执行,输出 js 里的 token 和 t,然后请求
        34
    wsds   154 天前
    @beforeuwait 不知道算的,从前端拿到 token,没有 cookie 的话,也是请求不成功的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3067 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 20ms · UTC 04:09 · PVG 12:09 · LAX 20:09 · JFK 23:09
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1