场景:爬虫 遇到的问题:获取页面隐藏的 token 节点,难道通过接口爬的东西,还要去自动化打开网页,取到 token,再塞进接口里边??
2 个问题: 1、python 如何执行 js 2、这种场景的问题,是怎么解决的?难道真要通过 selenium 取打开网页,去找到 token,再回过去把取的值,放到接口里边用?
费劲获取 csrf-token 也没用,它这个还要验证 cookie,好强势的防爬措施,至少把我拦在门外了,不知道各位如何?
Cookie: XSRF-TOKEN=eyJpdiI6IlpTM2JYUUdWeVN2XC9iSHdYNFNTSGFRPT0iLCJ2YWx1ZSI6IjhMTzVCM3ZRcDFaNE40TmRcL3BURjJNKzZ2QjRQT2NSaEFaQUVYTmlVUGZTMzRZdFdRYWNabE9wMnFBdytXdERvRWIzM1RPemY1eTh0R3d0cWtqMjNUUT09IiwibWFjIjoiZjVkNzRhM2Y4NjE4MWZkYWRlODQ5Y2ZjMjk4NGQ4MWJlNGNhMWNlYWM3YTMwYjQ0YTljNTNjNzY3ODA4Yjk3YyJ9; laravel_session=eyJpdiI6Ik1EQ3lcL205VUF1dzV5a1J0eVhFR1RBPT0iLCJ2YWx1ZSI6InZJMkROTDBaMXhDNGFpU2loXC92d0g1WWZFUFlNc0xDYzZicXF1TWc4bHRzaERYdUs0VWR5NlVCODUyWWNrY2FqNHZzbHQ1aUFZVURjcGtiZTlWczJOZz09IiwibWFjIjoiYTZkMmJjN2U0MTdiYzgzZDE1NzZhMjU5ZjE2ZjA5NWJmZTUzYzNmOTZlY2RkOWVkNWFjNjdhYjM2OTMxNDZmNiJ9
|  |      1est      2018-06-11 13:13:44 +08:00 纯 js 没有 DOM 的,你考虑清楚哦。 | 
|      2LaFayette      2018-06-11 13:16:48 +08:00 via iPhone 用 splash | 
|  |      3zthxxx      2018-06-11 13:18:28 +08:00 | 
|  |      4wly19960911      2018-06-11 13:18:56 +08:00 解析 DOM,然后 xpath 直接取页面的数据不行吗。我记得 python 不是提供的吗?又不是 JS 渲染的页面,不需要 selenium。 | 
|  |      5rabbbit      2018-06-11 13:19:37 +08:00 import execjs execjs.eval() | 
|      6wsds OP @wly19960911 python 可以解析 DOM 吗,通过 bs4? | 
|  |      7DonaidTrump      2018-06-11 13:28:15 +08:00 via iPhone 读一下 JS 逻辑,用 Python 实现一下就好了,不必非要执行 JS | 
|  |      9wly19960911      2018-06-11 13:45:41 +08:00 @tulongtou #7 我不了解 python 最近想试试爬虫玩玩,看了下 bs4 的介绍应该没什么问题,主要你搞错了问题。 你运行 JS 只是为了获取 html 的值的话没什么意义的。本身 JS 有意义的在于需要根据各种事件和功能去执行业务流程,去修改 DOM 只是一个必要的流程,不管哪个语言都有库解析 XML 和 HTML。不需要执行 JS 都可以 | 
|      10wsds OP @wly19960911 是这个意思,但我只能想到用 js 去取啊,还有其他 方法 吗 | 
|  |      11DonaidTrump      2018-06-11 13:50:34 +08:00 via iPhone @wly19960911 为什么是艾特我? | 
|  |      12wly19960911      2018-06-11 13:55:19 +08:00 @tulongtou #11 抱歉 AT 错了, | 
|  |      13wly19960911      2018-06-11 13:56:11 +08:00 @wsds #10 你刚刚说的 BS4 的库应该没问题,你可以看看各种教程。 | 
|  |      14hahastudio      2018-06-11 14:00:31 +08:00 如果这个值写在了 HTML 里,比如 <input name="token" type="hidden" value="blablabla"> 这样的,可以用 bs4,甚至你直接用 XPath,正则什么的都行的 | 
|      15wsds OP @hahastudio  <input type="hidden" name="_token" value="UlORUHsXUBI7YKg2h73u8pEaWyqDhYioSa1ZYwUK"> 取这个 value 的值 | 
|      16wsds OP | 
|  |      17just1      2018-06-11 14:21:49 +08:00 via Android 遇到过相同的问题,最后我选择了写 nodejs 脚本 | 
|  |      18hahastudio      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 就有了 | 
|      19wsds OP @hahastudio 在 iframe 也没关系吧,requests.get()不是返回所有的 html 吗? | 
|      20wplct      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...'); | 
|  |      21hahastudio      2018-06-11 15:20:03 +08:00 @wsds 如果你是这么认为的,我觉得你需要看更多的东西了。。。 | 
|  |      22kevanbin      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 ``` | 
|      23wsds OP @kevanbin 为什么这个页面用这个方法 不行? http://szjw.changsha.gov.cn/ywcx/ | 
|  |      24mitnick      2018-06-11 18:31:58 +08:00 @hahastudio +1 | 
|  |      25Leigg      2018-06-11 18:33:20 +08:00 via iPhone pyv8 | 
|  |      27Zzdex      2018-06-11 18:42:04 +08:00 可以用 execjs | 
|  |      28Alpha      2018-06-11 18:51:45 +08:00 phatomjs 就可以解决问题 | 
|  |      29congeec      2018-06-11 19:07:40 +08:00 via iPhone PyV8 老了,用 py_mini_racer | 
|  |      30flowfire      2018-06-11 19:36:18 +08:00 via iPhone headless chrome 了解一下 | 
|  |      33beforeuwait      2018-06-14 17:11:16 +08:00 phantomJS 就可以了啊 我有个类似的项目,一样的 js 算出一个 token 和一个 t,然后放到 cookie 里。 在拿到 js 后,写一个接收函数,然后 phantom 执行,输出 js 里的 token 和 t,然后请求 | 
|      34wsds OP @beforeuwait 不知道算的,从前端拿到 token,没有 cookie 的话,也是请求不成功的 |