Python 中怎么执行 js? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
wsds
V2EX    Python

Python 中怎么执行 js?

  •  
  •   wsds 2018-06-11 13:09:49 +08:00 7537 次点击
    这是一个创建于 2736 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言    2018-06-11 19:46:25 +08:00

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

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

    你运行 JS 只是为了获取 html 的值的话没什么意义的。本身 JS 有意义的在于需要根据各种事件和功能去执行业务流程,去修改 DOM 只是一个必要的流程,不管哪个语言都有库解析 XML 和 HTML。不需要执行 JS 都可以
    wsds
        10
    wsds  
    OP
       2018-06-11 13:50:19 +08:00
    @wly19960911 是这个意思,但我只能想到用 js 去取啊,还有其他 方法 吗
    DonaidTrump
        11
    DonaidTrump  
       2018-06-11 13:50:34 +08:00 via iPhone
    @wly19960911 为什么是艾特我?
    wly19960911
        12
    wly19960911  
       2018-06-11 13:55:19 +08:00
    @tulongtou #11 抱歉 AT 错了,
    wly19960911
        13
    wly19960911  
       2018-06-11 13:56:11 +08:00
    @wsds #10 你刚刚说的 BS4 的库应该没问题,你可以看看各种教程。
    hahastudio
        14
    hahastudio  
       2018-06-11 14:00:31 +08:00
    如果这个值写在了 HTML 里,比如 <input name="token" type="hidden" value="blablabla"> 这样的,可以用 bs4,甚至你直接用 XPath,正则什么的都行的
    wsds
        15
    wsds  
    OP
       2018-06-11 14:20:16 +08:00
    @hahastudio
    <input type="hidden" name="_token" value="UlORUHsXUBI7YKg2h73u8pEaWyqDhYioSa1ZYwUK">
    取这个 value 的值
    wsds
        16
    wsds  
    OP
       2018-06-11 14:21:12 +08:00
    @hahastudio 现在的问题是,我 requests.get("http://szjw.changsha.gov.cn/ywcx/"),返回的 dom 中,找不到这个 input
    好尴尬
    just1
        17
    just1  
       2018-06-11 14:21:49 +08:00 via Android
    遇到过相同的问题,最后我选择了写 nodejs 脚本
    hahastudio
        18
    hahastudio  
       2018-06-11 14:27:54 +08:00
    @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 就有了
    wsds
        19
    wsds  
    OP
       2018-06-11 14:40:15 +08:00
    @hahastudio 在 iframe 也没关系吧,requests.get()不是返回所有的 html 吗?
    wplct
        20
    wplct  
       2018-06-11 14:49:18 +08:00
    我也是最后选择了 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...');
    hahastudio
        21
    hahastudio  
       2018-06-11 15:20:03 +08:00
    @wsds 如果你是这么认为的,我觉得你需要看更多的东西了。。。
    kevanbin
        22
    kevanbin  
       2018-06-11 15:37:24 +08:00
    ```
    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
    ```
    wsds
        23
    wsds  
    OP
       2018-06-11 18:17:15 +08:00
    @kevanbin 为什么这个页面用这个方法 不行? http://szjw.changsha.gov.cn/ywcx/
    mitnick
        24
    mitnick  
       2018-06-11 18:31:58 +08:00
    Leigg
        25
    Leigg  
       2018-06-11 18:33:20 +08:00 via iPhone
    pyv8
    param
        26
    param  
       2018-06-11 18:41:41 +08:00 via Android
    @wplct nodejs 你写个脚本调用不好吗
    Zzdex
        27
    Zzdex  
       2018-06-11 18:42:04 +08:00
    可以用 execjs
    Alpha
        28
    Alpha  
       2018-06-11 18:51:45 +08:00
    phatomjs 就可以解决问题
    congeec
        29
    congeec  
       2018-06-11 19:07:40 +08:00 via iPhone
    PyV8 老了,用 py_mini_racer
    flowfire
        30
    flowfire  
       2018-06-11 19:36:18 +08:00 via iPhone
    headless chrome 了解一下
    kevanbin
        31
    kevanbin  
       2018-06-12 09:54:06 +08:00
    @wsds iframe 中的代码,无法在网页源代码中得到
    wsds
        32
    wsds  
    OP
       2018-06-12 10:46:39 +08:00
    @kevanbin 了解了,感谢
    beforeuwait
        33
    beforeuwait  
       2018-06-14 17:11:16 +08:00
    phantomJS 就可以了啊
    我有个类似的项目,一样的 js 算出一个 token 和一个 t,然后放到 cookie 里。
    在拿到 js 后,写一个接收函数,然后 phantom 执行,输出 js 里的 token 和 t,然后请求
    wsds
        34
    wsds  
    OP
       2018-06-15 09:30:31 +08:00
    @beforeuwait 不知道算的,从前端拿到 token,没有 cookie 的话,也是请求不成功的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2590 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 08:16 PVG 16:16 LAX 00:16 JFK 03:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86