爬虫神器pyppeteer,对 js 加密降维打击

pyppeteer 是对无头浏览器  puppeteer 的 Python 封装。无头浏览器广泛用于自动化测试,同时也是一种很好地爬虫思路。

使用 puppeteer(等其他无头浏览器)的最大优势当然是 对 js 加密实行降维打击 ,完全无视 js 加密手段,对于一些需要登录的应用,也可以模拟点击然后保存 cookie。 而很多时候前端的加密是爬虫最难攻克的一部分 。当然puppeteer也有劣势,最大的劣势就是相比面向接口爬虫效率很低,就算是无头的chromium,那也会占用相当一部分内存。另外额外维护一个浏览器的启动、关闭也是一种负担。

小编整理的一整套系统的py thon学习教程从最基础的到框架再到项目实战的学习资料都有整理,送给每一位小伙伴, 有想学习py thon编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

加扣裙:835017344,此群的用途是仅供给CSDN粉丝交流使用。

这篇文章我们来写一个简单的 demo,爬取拼多多搜索页面的数据,最终的效果如下:

我们把所有 api 请求的原始数据保存下来:

示例 json 文件如下:

开发环境

  • python3.6+

最好是 python3.7,因为 asyncio 在 py3.7中加入了很好用的 asyncio.run() 方法。

  • 安装pyppeteer

如果安装有问题请去看官方文档。

python3 -m pip install pyppeteer
  • 安装 chromium

你懂的,天朝网络环境很复杂,如果要用 pyppeteer 自己绑定的 chromium ,半天都下载不下来,所以我们要手动安装,然后在程序里面指定 executablePath 。

下载地址: www.chromium.org/getting-inv…

hello world

pyppeteer 的 hello world 程序是前往 exmaple.com 截个图:

import asyncio
from pyppeteer import launchasync def main():browser = await launch({# Windows 和 Linux 的目录不一样,情换成自己对应的executable文件地址'executablePath': '你下载的Chromium.app/Contents/MacOS/Chromium',})page = await browser.newPage()await page.goto('http://example.com')await page.screenshot({'path': 'example.png'})await browser.close()asyncio.get_event_loop().run_until_complete(main())

pyppeteer 重要接口介绍

pyppeteer.launch

launch 浏览器,可以传入一个字典来配置几个options,比如:

browser = await pyppeteer.launch({'headless': False, # 关闭无头模式'devtools': True, # 打开 chromium 的 devtools'executablePath': '你下载的Chromium.app/Contents/MacOS/Chromiu','args': [ '--disable-extensions','--hide-scrollbars','--disable-bundled-ppapi-flash','--mute-audio','--no-sandbox','--disable-setuid-sandbox','--disable-gpu',],'dumpio': True,
})

其中所有可选的 args 参数在这里: peter.sh/experiments…

dumpio 的作用:把无头浏览器进程的 stderr 核 stdout pip 到主程序,也就是设置为 True 的话,chromium console 的输出就会在主程序中被打印出来。

注入 js 脚本

可以通过 page.evaluate 形式,例如:

await page.evaluate("""() =>{Object.defineProperties(navigator,{webdriver:{get: () => false}})}
""")

我们会看到这一步非常关键,因为 puppeteer 出于政策考虑(这个词用的不是很好,就是那个意思)会设置 window.navigator.webdriver 为 true ,告诉网站我是一个 webdriver 驱动的浏览器。有些网站比较聪明(反爬措施做得比较好),就会通过这个来判断对方是不是爬虫程序。

这等价于在 devtools 里面输入那一段 js 代码。

还可以加载一个 js 文件:

await page.addScriptTag(path=path_to_your_js_file)

通过注入 js 脚本能完成很多很多有用的操作,比如自动下拉页面等。

截获 request 和 response

await page.setRequestInterception(True)
page.on('request', intercept_request)
page.on('response', intercept_response)

intercept_request 和 intercept_response 相当于是注册的两个回调函数,在浏览器发出请求和获取到请求之前指向这两个函数。

比如可以这样禁止获取图片、多媒体资源和发起 websocket 请求:

async def intercept_request(req):"""请求过滤"""if req.resourceType in ['image', 'media', 'eventsource', 'websocket']:await req.abort()else:await req.continue_()

然后每次获取到请求之后将内容打印出来(这里只打印了 fetch 和 xhr 类型response 的内容):

async def intercept_response(res):resourceType = res.request.resourceTypeif resourceType in ['xhr', 'fetch']:resp = await res.text()print(resp)
大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地

一共有哪些resourceType,pyppeteer文档里面有:

拼多多搜索爬虫

页面自动下拉

拼多多的搜索界面是一个无限下拉的页面,我们希望能够实现无限下拉页面,并且能够控制程序提前退出,不然一直下拉也不好,我们可能并不需要那么多数据。

js 脚本

async () => {await new Promise((resolve, reject) => {// 允许下滑的最大高度,防止那种可以无限下拉的页面无法结束const maxScrollHeight = null;// 控制下拉次数const maxScrollTimes = null;let currentScrollTimes = 0;// 记录上一次scrollHeight,便于判断此次下拉操作有没有成功,从而提前结束下拉let scrollHeight = 0;// maxTries : 有时候无法下拉可能是网速的原因let maxTries = 5;let tried = 0;const timer = setInterval(() => {// 下拉失败,提前退出// BUG : 如果网速慢的话,这一步会成立~// 所以设置一个 maxTried 变量if (document.body.scrollHeight === scrollHeight) {tried += 1;if (tried >= maxTries) {console.log("reached the end, now finished!");clearInterval(timer);resolve();}}scrollHeight = document.body.scrollHeight;window.scrollTo(0, scrollHeight);window.scrollBy(0, -10);// 判断是否设置了maxScrollTimesif (maxScrollTimes) {if (currentScrollTimes >= maxScrollTimes) {clearInterval(timer);resolve();}}// 判断是否设置了maxScrollHeightif (maxScrollHeight) {if (scrollHeight >= maxScrollHeight) {if (currentScrollTimes >= maxScrollTimes) {clearInterval(timer);resolve();}}}currentScrollTimes += 1;// 还原 triedtried = 0;}, 1000);});
};

这里面有几个重要的参数:

  • interval : 下拉间隔时间,以毫秒为单位
  • maxScrollHeight : 运行页面下拉最大高度
  • maxScrollTimes : 最多下拉多少次(推荐使用,可以更好控制爬取多少数据)
  • maxTries : 下拉不成功时最多重试几次,比如有时候会因为网络原因导致没能在 interval ms 内成功下拉

把这些替换成你需要的。 同时你可以打开 chrome 的开发者工具运行一下这段 js 脚本 。

完整代码

这段代码一共也就只有70多行,比较简陋,情根据自己的实际需求更改。

import os
import time
import json
from urllib.parse import urlsplit
import asyncio
import pyppeteer
from scripts import scriptsBASE_DIR = os.path.dirname(__file__)async def intercept_request(req):"""请求过滤"""if req.resourceType in ['image', 'media', 'eventsource', 'websocket']:await req.abort()else:await req.continue_()async def intercept_response(res):resourceType = res.request.resourceTypeif resourceType in ['xhr', 'fetch']:resp = await res.text()url = res.urltokens = urlsplit(url)folder = BASE_DIR + '/' + 'data/' + tokens.netloc + tokens.path + "/"if not os.path.exists(folder):os.makedirs(folder, exist_ok=True)filename = os.path.join(folder, str(int(time.time())) + '.json')with open(filename, 'w', encoding='utf-8') as f:f.write(resp)async def main():browser = await pyppeteer.launch({# 'headless': False,# 'devtools': True'executablePath': '/Users/changjiang/apps/Chromium.app/Contents/MacOS/Chromium','args': ['--disable-extensions','--hide-scrollbars','--disable-bundled-ppapi-flash','--mute-audio','--no-sandbox','--disable-setuid-sandbox','--disable-gpu',],'dumpio': True,})page = await browser.newPage()await page.setRequestInterception(True)page.on('request', intercept_request)page.on('response', intercept_response)await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')await page.setViewport({'width': 1080, 'height': 960})await page.goto('http://yangkeduo.com')await page.evaluate("""() =>{Object.defineProperties(navigator,{webdriver:{get: () => false}})}""")await page.evaluate("你的那一段页面自动下拉 js 脚本")await browser.close()if __name__ == '__main__':asyncio.run(main())

Python爬虫神器pyppeteer,对 js 加密降维打击相关推荐

  1. Python爬虫教程-16-破解js加密实例(有道在线翻译)

    python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...

  2. 拼多多搜索页面html,爬虫神器pyppeteer,对 js 加密降维打击

    参考文章:html pyppeteer 是对无头浏览器 puppeteer的 Python 封装.无头浏览器普遍用于自动化测试,同时也是一种很好地爬虫思路.前端 使用 puppeteer(等其余无头浏 ...

  3. Python爬虫神器pyppeteer

    简介 pyppeteer 是非官方 Python 版本的 Puppeteer 库,浏览器自动化库,由日本工程师开发. Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Ch ...

  4. 基于浏览器的python爬虫神器pyppeteer介绍及入门

    简介 在讲 python 的 pyppeteer 前,先来说下 Node 的 puppeteer 库: puppeteer的中文意思是:操纵木偶的人,木偶师. 那么 Node 的 puppeteer ...

  5. python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...

    前言: 今天为大家带来的内容,是五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码),在这里还是要啰嗦下,为了有更好的观赏性,大部分代码用图片的方式呈现出来!喜欢的话不忘点赞关注不迷 ...

  6. 5分钟学会Python爬虫神器autoscraper——自动化爬虫必备

    5分钟学会Python爬虫神器autoscraper--自动化爬虫必备 爬虫神器autoscraper介绍 安装 使用 批量抓取 查看结果 爬虫神器autoscraper介绍 今天给大家介绍一个非常智 ...

  7. Python爬虫之pyppeteer的使用(爬虫、获取cookie、截屏插件、防爬绕过)

    官方帮助: https://pyppeteer.github.io/pyppeteer/reference.html 下载文本中的网页源码,由于需要向下拉动滚动条所以使用pyppeteer渲染网页,并 ...

  8. python有道字典_Linux下自制有道词典 - python 解密有道词典JS加密

    对于爬虫新手来说,JS解密是一道过不去的坎,需要不断地练习. 平时在linux下开发,鉴于没有什么好用翻译软件,打开网易也占用系统资源,所以写了个在控制台的翻译软件接口. 使用python爬虫,查看网 ...

  9. python爬虫——有道翻译JS解密

    爬虫兴起的同时,反爬虫手段也在不断更新,今天以有道翻译http://fanyi.youdao.com/为例,介绍破解JavaScript加密的反爬虫基本流程. 分析网页 我们进入网站,随便输入一个内容 ...

最新文章

  1. Linux上常用的安全技术iptables与squid代理服务器
  2. 与数据相关的运算符和伪指令 offset align ptr type lengthof sizeof label 间接寻址 间接操作数 数组 变址操作数 指针 jmp, loop
  3. 树,森林,二叉树的互相转换
  4. [js] document.domain的作用是什么?它有什么限制?
  5. Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用
  6. greendao3.2.3配置时遇到的问题
  7. 过拟合解决方法python_机器学习之过拟合的风险
  8. RTMPdump 使用说明
  9. 线上不修改mysql的存储引擎对emoji标签做删除处理(PHP)
  10. JavaScript 错误 - Throw、Try 和 Catch
  11. 那些年用过的机械键盘
  12. jquery版本共存_多个jQuery版本共存的处理方案
  13. 【电脑运用及修理】6套台式组装机电脑配置清单大全(2022年618)
  14. php富强民主,鼠标点击网页爱国富强民主特效(附代码)
  15. 大学生html5实训报告,大学生实训心得体会范文(精选5篇)
  16. 2.2.7Python-异常处理
  17. Excel|5个神技巧,提高你的数据分析效率~
  18. 2020年度国产数据库:openGauss
  19. Redis、ES、Nginx和RabbitMQ面试回忆
  20. mysql的sleep线程多久_MySQL数据库sleep线程过多,怎么办?

热门文章

  1. centos镜像中Everything, GnomeLive ,KdeLive ,livecd ,NetInstall的意思
  2. 1635 超大型 LED 显示屏
  3. 地表反射率影响因素_全了,高考地理答题要点归纳!
  4. debian之网易云音乐的安装
  5. 【ESP32】1 连接WiFi,获取IP地址,显示信号强度
  6. android gps locationCb 数据
  7. 今日添加ubuntu7.10配置
  8. 闸门机制(Gate Mechanism)
  9. app消息推送服务器端,系统服务:APP消息推送服务
  10. 欲报从速,已有56所高校选择云创大学高质量免费直播授课!