最近想买内存条,京东上看了价格一直没降,于是找了个可以看历史价格的网站:查询商品历史价格走势(支持京东,天猫,淘宝等)APP - 慢慢买​tool.manmanbuy.com

这个网站功能挺强大,可以查到各大电商几乎所有商品近两年的价格走势:

你看,还贴心地提供了降价提醒。

不过点击「设置降价提醒」,会让你下载个 APP

像我这么懒的人,会拿起手机扫描二维码下载 APP 吗?不,我 Command+Option+I 打开了网页开发者工具 ...

选中 Preserve log,然后刷新页面,接着过滤出 XHR 请求:

可以看到就一条 XHR 请求,返回 JSON 中的 datePrice 就是我们需要的内容了。

再来看下这个 XHR 的具体 URI:

http://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=http%253A%2F%2Fitem.jd.com%2F1099630.html&bjid=&spbh=&cxid=&zkid=&w=951&token=qgta6a0724e5e87cd45124d68c8876c69869et

参数中的 url 是我们需要查询的商品链接,这是我们已知并主动提供给接口的。DA、action、w 这三个参数对于这个接口来说是可以固定,关键的就是这个 token 参数了。

尝试只改了下 token 参数,它总是给我返回这个结果:我要的是内存不是增高鞋啊,orz ...

再来看下开发者工具。

过滤工具栏里,重新选择 All,然后 Command+F 呼出搜索框搜索 token:

很容易就找到了对应的代码:

if ('【金士顿Fury系列】金士顿(Kingston)骇客神条 Fury系列 DDR3 1600 8GB台式机内存(HX316C10F/8)蓝色【行情 报价 价格 评测】-京东' != "") {

$("#iframeId").attr("src", "history2018.aspx?w=951&h=780&h2=420&m=1&e=1&browes=1&url=" + escape('【金士顿Fury系列】金士顿(Kingston)骇客神条 Fury系列 DDR3 1600 8GB台式机内存(HX316C10F/8)蓝色【行情 报价 价格 评测】-京东') + "&token=" + d.encrypt('【金士顿Fury系列】金士顿(Kingston)骇客神条 Fury系列 DDR3 1600 8GB台式机内存(HX316C10F/8)蓝色【行情 报价 价格 评测】-京东', 2, true));

historyouhui('【金士顿Fury系列】金士顿(Kingston)骇客神条 Fury系列 DDR3 1600 8GB台式机内存(HX316C10F/8)蓝色【行情 报价 价格 评测】-京东', 6);

}

这里先去请求 history2018.aspx,然后在这个页面里通过 AJAX 来访问我们上面找到的 XHR:

所以这个 token 参数是这么加密来的:

d.encrypt('【金士顿Fury系列】金士顿(Kingston)骇客神条 Fury系列 DDR3 1600 8GB台式机内存(HX316C10F/8)蓝色【行情 报价 价格 评测】-京东', 2, true)

但是这个 d.encrypt 在这个 XHR 上却是没有找到。

搜下 encrypt,找到了对应的加密脚本:

这里有两个 shenqing.js (真烦这种用拼音来作为文件名变量名的),但是版本不同,看了其实两个版本在加密方法上并没有改变,先看下较新的版本好了。

http://include.manmanbuy.com/js/shenqing.js?v=20172

函数 1:

函数 2:

这是经过打包混淆的代码,稍微 Google 了一下,就算是没什么前端经验的我,也可以发现这些代码是用 JsPacker 来压缩的:

根据网上的信息,来到一个在线 JsPacker 解压的网站,将两段函数分别贴进去,解压:

反正是挺长的两段 JS 代码,要想翻译成 Python 谈何容易。所以我们需要一个工具,能直接执行 JS 脚本返回结果。

登登登登,本文主角隆重出场,它就是 PyV8:

PyV8 的安装略蛋疼,建议直接使用编译好的二进制包,可到以下的地址来获取各平台上对应的二进制包:emmetio/pyv8-binaries​github.comv2-41b18c6f815d9536378857126cf6db1a_ipico.jpg

接着我们来写段 Demo 代码来验证下:

from pyv8 import PyV8

f1 = '''解压后的 js 函数 1'''

f2 = '''解压后的 js 函数 2'''

ctxt = PyV8.JSContext()

ctxt.enter()

ctxt.eval(f1)

ctxt.eval(f2)

print(ctxt.eval('''d.encrypt('【金士顿低电压版】金士顿(Kingston)低电压版 DDR3 1600 8GB 笔记本内存【行情 报价 价格 评测】-京东', 2, true)'''))

ctxt.leave()

运行结果:

出来了加密后的 token。用这个 token 确认下是否能得到真实的数据:

curl 'http://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=http%253A%2F%2Fitem.jd.com%2F1066754.html&bjid=&spbh=&cxid=&zkid=&w=951&token=x6mwf2d62fc1bac4b61462942033d429fe79m4vzg' | iconv -f gbk -t utf8

这就对了!

不过仔细一看,对比网页上绘图的结果,日期其实刚好相差了一个月。不清楚为何会这么处理,不过不管它了,直接加上一个月就好。

整合下代码,最后可以将数据打印出来了:

还可以用 pyecharts 打印出漂亮的图表:

最后当然是回到我们的目的了:设置降价提醒。这里我使用了倍洽的 incoming 机器人:

完成!

嗯,为了不拿出手机扫描二维码,我花了几个小时时间配置环境写了个脚本 ...

完整代码:https://gist.github.com/jackhuntcn/c017b658d0e1c728e1cd5ced6f9fd0f6​gist.github.com

python执行javascript网页_Python 爬虫如何优雅地执行 javascript 函数相关推荐

  1. python如何解析网页_Python爬虫入门第一课:如何解析网页

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于肥宅与画家 ,作者AntzUhl 我们编写网络爬虫最主要的目 ...

  2. python requests下载网页_python爬虫 requests-html的使用

    一 介绍 Python上有一个非常著名的HTTP库--requests,相信大家都听说过,用过的人都说非常爽!现在requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜 ...

  3. python如何修改网页_python爬虫:使用BeautifulSoup修改网页内容

    BeautifulSoup除了可以查找和定位网页内容,还可以修改网页.修改意味着可以增加或删除标签,改变标签名字,变更标签属性,改变文本内容等等. 使用修BeautifulSoup修改标签 每一个标签 ...

  4. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  5. python爬电影天堂_python爬虫爬取电影天堂电影

    python爬虫爬取电影天堂电影?本项目实现一个简单的爬虫,通过requests和BeautifulSoup爬取电影天堂电影信息,包括片名.年代.产地.类别.语言.海报链接和视频链接等内容.pytho ...

  6. 爬虫python下载网站所有图片_python爬虫(4):多页图片批量下载-澎湃网信息图...

    澎湃网文章的质量不错,它的"美数课"栏目的信息图做得也很好.图片干货多还能带来ppt和图表制作的技巧.为了更方便浏览所有文章图片,通过分析Ajax爬取栏目至今所有信息图的图片. 但 ...

  7. python git是什么_python爬虫之git的使用

    一.简单认识: 1.初始化文件夹为版本控制文件夹,首先建立一个文件夹,进入这个文件夹以后输入git init初始化这个文件夹. 2.Git几种位置概念 1.本地代码:本地更改完代码以后,虽然是存放在g ...

  8. python 简单网页_Python爬虫 (一):爬取一个简单的静态网页

    版本:python3.7 平台:windows10 工具 :pycharm 断断续续学习了py3爬虫2周左右的时间,发现自己学习的过于零散化,所以想通过这个专栏系统的整理下自己所学过的知识.如有错误, ...

  9. python 豆瓣评论数据分析_Python爬虫实战案例:豆瓣影评大数据分析报告之网页分析...

    个人希望,通过这个完整的爬虫案例(预计总共4篇短文),能够让爬虫小白学会怎么做爬虫的开发,所以在高手们看来,会有很多浅显的废话,如果觉得啰嗦,可以跳过一些内容~ 上一篇文章给大家简单介绍了Python ...

最新文章

  1. XFS 文件系统 (一) :设计概览
  2. 重要的mysql语句用法
  3. 方法 - 查询到本周的日期
  4. 1089: [SCOI2003]严格n元树
  5. 泊松图像融合(泊松融合)
  6. java 基础学习——基本语法(三)
  7. ASP.NETmvc常用JQUERY插件【jquery.dataTables.js】
  8. 进入软件开发行业必须要掌握的基础知识(2005-5-18)
  9. html多语言国际化,gMIS吉密斯i18n多语言国际化更新
  10. java对mysql查询_如何利用java对mysql数据库进行增删改查
  11. svn服务的安装与设置 .
  12. python 系统当前时间向前推2天_当前日期往前推N天,当前日期往后推N天
  13. 联想e480一键恢复小孔_thinkpade480win10如何一键还原
  14. 【ACL2020】关于正式风格迁移的数据增强方法
  15. uniapp实现app长截图
  16. 愤怒的牛(重回基础二分)
  17. encode decode 使用指南
  18. 有了手机远程控制手机的软件,在家突然收到工作任务也不怕
  19. 整流十五—网侧低频电流谐波抑制方法及其稳定性分析
  20. Vue 使用echarts 地图自定义图标和修改图标样式,点击切换图标

热门文章

  1. Rosalind第18题——ros_bio18_ORF
  2. hdu 2048 错排公式 神、上帝以及老天爷
  3. 如何培养一个搞垮公司的项目经理?
  4. 若依微服务框架ruoyi-cloud使用手册(持续更新中)
  5. 教育行业BP怎么写?参考这个案例可避开80%的坑丨案例
  6. 【Yocto学习入门】03 - Yocto 代码初步了解
  7. sns jointplot 和 子图
  8. kali 利用msf通过win7永恒之蓝漏洞获取权限
  9. 什么是jsp,它有什么用+jsp的本质是什么
  10. java字符串转16进制