js爬虫反扒

2023-10-27

3、js动态网页抓取方式(重点)

许多时候爬虫取到的页面仅仅是一个静态的页面,即网页的源代码,就像在浏览器上的“查看网页源代码”一样。

一些动态的东西如javascript脚本执行后所产生的信息是抓取不到的,下面两种方案,可用来python爬取js执行后输出的信息。

① 用dryscrape库动态抓取页面

js脚本是通过浏览器来执行并返回信息的,所以,抓取js执行后的页面,一个最直接的方式就是用python模拟浏览器的行为。

WebKit 是一个开源的浏览器引擎,python提供了许多库可以调用这个引擎,dryscrape便是其中之一,它调用webkit引擎来处理包含js等的网页。

import dryscrape

使用dryscrape库 动态抓取页面

def get_url_dynamic(url):
session_req=dryscrape.Session()
session_req.visit(url) #请求页面
response=session_req.body() #网页的文本
#print(response)
return response
get_text_line(get_url_dynamic(url)) #将输出一条文本
这里对于其余包含js的网页也是适用的,虽然可以满足抓取动态页面的要求,但缺点还是很明显的:慢!

但想想也合理,python调用 webkit请求页面,而且等页面加载完,载入js文件,让js执行,将执行后的页面返回,慢一点情理之中。

除外还有很多库可以调用 webkit:PythonWebkit,PyWebKitGit,Pygt(可以用它写个浏览器),pyjamas等等,也可以实现相同的功能。

② selenium web测试框架

selenium是一个web测试框架,允许调用本地的浏览器引擎发送网页请求,所以,它同样可以实现抓取页面的要求。

使用 selenium webdriver 可行,但会实时打开浏览器窗口。

def get_url_dynamic2(url):
driver=webdriver.Firefox() #调用本地的火狐浏览器,Chrom 甚至 Ie 也可以的
driver.get(url) #请求页面,会打开一个浏览器窗口
html_text=driver.page_source
driver.quit()
#print html_text
return html_text
get_text_line(get_url_dynamic2(url)) #将输出一条文本
不失为一条临时的解决方案,与selenium类似的框架还有一个windmill,感觉稍复杂一些,这里就暂且不赘述了。

4、解析js(重点)

我们爬虫每次只有一个请求,但是实际上很多请求又js连带发送,所以我们需要利用爬虫解析js去实现这些请求的发送。

网页中的参数来源主要有以下四种:

固定值, 写死在html中的参数
用户给的参数
服务器(通过ajax)返回的参数, 比如时间戳, token等
js生成的参数
这里主要介绍一下解析js,破解加密方法或者生成参数值方法,python代码模拟实现这个方法, 从而得到我们需要的请求参数。

以微博登录为例:

当我们点击登录的时候都会发送一个login请求

登录表单中的参数并不一定都是我们需要的,可以通过对比多次请求中的参数,再加上一些经验和猜想,过滤掉固定参数或服务器自带参数和用户输入的参数。

这是剩下的就是js生成的数值或加密数值;

最终得到的值:

图片 picture id:

pcid: yf-d0efa944bb243bddcf11906cda5a46dee9b8

用户名:

su: cXdlcnRxd3Jl
nonce: 2SSH2A # 未知

密码:

sp: e121946ac9273faf9c63bc0fdc5d1f84e563a4064af16f635000e49cbb2976d73734b0a8c65a6537e2e728cd123e6a34a7723c940dd2aea902fb9e7c6196e3a15ec52607fd02d5e5a28e18254105358e897996f0b9057afe2d24b491bb12ba29db3265aef533c1b57905bf02c0cee0c546f4294b0cf73a553aa1f7faf9f835e5
prelt: 148 # 未知
请求参数中的用户名和密码都是经过加密处理的,如果需要模拟登录,就需要找到这个加密的方法,利用它来为我们的数据进行加密。

1)找到所需的js

要找到加密方法,首先我们需要先找到登录所需的js代码,可以使用以下3种方式:

① 找事件; 在页面检查目标元素,在开发工具的子窗口里选中Events Listeners, 找到click事件,点击定位到js代码。

② 找请求;在Network中点击列表界面的对应Initiator跳转至对应js界面;

③ 通过搜索参数名进行定位;

2)登录的js代码

3)在这个submit的方法上打断点,然后输入用户名密码,先不点登录,回到dev tool点击这个按钮启用调试。

4)然后再去点登录按钮, 这时候就可以开始调试;

5)逐步执行代码的同时观察我们输入的参数, 发生变化的地方即为加密方法, 如下

6)上图中的加密方式是base64, 我们可以使用代码来试一下

import base64

a = “aaaaaaaaaaaa” # 输入的用户名
print(base64.b64encode(a.encode())) # 得到的加密结果:b’YWFhYWFhYWFhYWFh’

如果用户名包含@等特殊符号, 需要先用parse.quote()进行转义

得到的加密结果与网页上js的执行结果一致;

5、爬虫中遇到的js反爬技术(重点)

1)JS写cookie

requests请求得到的网页是一对JS,跟浏览器打开看到的网页源码完全不一样,这种情况,往往是浏览器运行这段JS生成一个(或多个)cookie再带着这个cookie做二次请求。

在浏览器(chrome、Firefox都可以)里可以看到这一过程,首先把Chrome浏览器保存的该网站的cookie删除,按F12到Network窗口,把“preserve log”选中(Firefox是“Persist logs”),刷新网页,这样我们就可以看到历史的Network请求记录。

第一次打开“index.html”页面时返回的是521, 内容是一段JS代码;

第二次请求这个页面就得到了正常的HTML,查看两次请求的cookies,可以发现第二次请求时带上了一个cookie,而这个cookie并不是第一次请求时服务器发过来的,其实它就是JS生成的。

解决思路:研究那段JS,找到它生成cookie的算法,爬虫就可以解决这个问题。
2)JS加密ajax请求参数

抓某个网页里面的数据,发现网页源代码里面没有我们要的数据,麻烦之处在于数据往往是ajax请求得到的。

按F12打开Network窗口,刷新网页看看加载这个网页都下载了哪些URL,我们要的数据就在某个URL请求的结果里面。

这类URL在Chrome的Network里面的类型大多是XHR,通过观察它们的“Response”就可以发现我们要的数据。

我们可以把这个URL拷贝到地址栏,把那个参数随便改个字母,访问一下看看是不是能得到正确的结果,由此来验证它是否是很重要的加密参数。

解决思路:对于这样的加密参数,可以尝试通过debug JS来找到对应的JS加密算法,其中关键的是在Chrome里面设置“XHR/fetch Breakpoints”。

3)JS反调试(反debug)

前面我们都用到了Chrome 的F12去查看网页加载的过程,或者是调试JS的运行过程。

不过这种方法用多了,网站就加了反调试的策略,只有我们打开F12,就会暂停在一个“debugger”代码行,无论怎样都跳不出去。

不管我们点击多少次继续运行,它一直在这个“debugger”这里,每次都会多出一个VMxx的标签,观察“Call Stack”发现它好像陷入了一个函数的递归调用。

这个“debugger”让我们无法调试JS,但是关掉F12窗口,网页就正常加载了。

解决思路:“反-反调试”,通过“Call Stack”找到把我们带入死循环的函数,重新定义它。
JS的运行应该停止在设置的断点处,此时该函数尚未运行,我们在Console里面重新定义它,继续运行就可以跳过该陷阱。

4)JS发送鼠标点击事件

有些网站它的反爬都不是上面的方式,你从浏览器可以打开正常的页面,而在requests里面却被要求输入验证码或重定向其它网页。

可以试着从“Network”看看,比如下面这个Network流里面的信息:

认真看看后会发现,每点击页面的的链接,它都会做一个“cl.gif”的请求,它看上去是下载一个gif图片,然而并不是。

它请求时发送的参数非常多,而且这些参数都是当前页面的信息。比如包含了被点击的链接等等。

先来顺一下它的逻辑:

JS会响应链接被点击的事件,在打开链接前,先访问cl.gif,把当前的信息发送给服务器,然后再打开被点击的链接。服务器收到被点击链接的请求,会看看之前是不是已经通过cl.gif把对应信息发过来,如果发过来了就认为是合法的浏览器访问,给出正常的网页内容。

因为requests没有鼠标事件响应就没有访问cl.gif的过程就直接访问链接,服务器就拒绝服务。

逻辑绕明白了就好办了!

解决思路:在访问链接前先访问一下cl.gif即可,关键是要研究cl.gif后的参数,把这些参数都带上问题就不大了,这样就可以绕过这个反爬策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js爬虫反扒 的相关文章

随机推荐

  • k线图中趋势线的画法精讲

    曾经有技术分析师大师把技术分析概括为一句话 那就是 一把直尺走天下 这是画线分析方法的直观和有效的高度概括 在众多的画线方法中 趋势线用以衡量贵金属的价格趋势 通过趋势线的方向可以明确地看出价格变动的方向 一 上升趋势线的画法 在上升趋势中
  • Ubuntu下pycharm的安装和卸载

    pycahrm安装 首先要去pycharm的官方网站下载Linux版本的pycharm安装包 如果想要下载以前版本的pycharm可以登录下方的网站去下载 https www jetbrains com pycharm download o
  • 按摩软件仿东郊到家系统开发,上门预约系统;

    按摩软件仿东郊到家系统开发 上门预约系统 用户端 技师端 商家端 以及管理后台 上门预约的操作 1 技师管理 技师满意度进行统一跟踪评估 进行分级管理 分级评估 2 订单管理 按订单状态分类筛选 安装进度一目了然 3 智能派单 根据客户位置
  • 64位机器源码安装遇到的问题,解决,一锅端

    1 如果是centos5会出现如下问题 checking host system type Invalid configuration x86 64 unknown linux gnu machine x86 64 unknown not
  • Hexo-零基础搭建个人博客(详解)

    Hexo零基础搭建个人博客 Hexo是一个基于 node js的快速生成静态博客的开源框架 支持 Markdown和大多数 Octopress 插件 一个命令即可部署到 Github页面 Giteee Heroku等 强大的APl 可无限扩
  • 数据库关闭四种方式

    数据库关闭四种方式 shutdown 参数 默认normal abort 模拟突然掉电 内存被清空 内存中的数据没有写入数据文件 事务被立即中断 没有提交也没有回滚 immediate 强制中断当前正在运行的所有事务 回滚这些事务 回滚完毕
  • c语言编写简易的自动售货机程序

    今天本来想做一个弹窗的可以输入有按钮点确定的自动售货机程序的 但是因为学校没教我是自学的找了一下午 不是教我如何创建的 就是代码各种报错的 我试了一下午都不行 只能放弃了 今天这串代码是根据我的c语言笔试 我们有上机考试的 的其中一道编程的
  • 二、量化选股

    文章目录 总体介绍 一 基本面选股 1 因子选股 判断方法 五个步骤 2 风格轮动 3 行业轮动 二 市场行为选股 1 资金流 2 动量反转 基本概念 1 行为金融学 2 阿尔法动量模型 3 一致预期 4 趋势追踪 基本概念 5 筹码选股
  • uniGUI用Grid++Report报表插件设计保存报表(For unigui ver:0.95.0.1045)

    uniGUI的0 95 0 1045版本提供了CallbackUrl 我们也可以用这个提供的回调网址来实现优秀的国产报表插件在IE Chorme FireFox中在线设计并保存报表到服务端的功能 界面效果如下 代码如下 unit Main
  • SpringBoot用线程池ThreadPoolExecutor处理百万级数据

    SpringBoot用线程池ThreadPoolExecutor处理百万级数据 更多优秀文章 请扫码关注个人微信公众号或搜索 程序猿小杨 添加 一 背景 使用JDK线程池ThreadPoolExecutor多线程异步执行批量插入 更新等操作
  • 如何优雅地用VScode在Ubuntu服务器上跑cuda代码

    0 安装相关软件 VScode 及对应插件 推荐VScode配置好远程服务后在服务端添加如下插件 Xming Xming X Server for Windows download SourceForge netDownload Xming
  • CMake Error: CMake was unable to find a build program corresponding to “Ninja“.

    CMake Error CMake was unable to find a build program corresponding to Ninja 使用cmake G ninja 后出现问题 报错信息如下所示 CMake Error C
  • 关于dispose 方法的资源释放

    当在程序上实现dispose 方法时 当前对象所占用的资源会被释放 当前对象便不能再被使用 但在内存中还并不会被及时的释放 要待到下次垃圾回收的时候 内存才能得到释放
  • Redis哨兵模式高可用原理

    我们知道主从复制是高可用的基石 从库宕机依然可以将请求发送给主库或者其他从库 但是 Master 宕机 只能响应读操作 写请求无法再执行 所以主从复制架构面临一个严峻问题 主库挂了 无法执行 写操作 无法自动选择一个 Slave 切换为 M
  • javabean相关问题

    目录 一般情况下 javabean有哪些具体的规范 JavaBean规范 在jsp页中 如何实现对它页的引入 or 嵌入 1 第一种 js import 2 第二种 jsp include指令 3 第三种 jsp include动作 什么是
  • Qt笔记8--zlib实现gzip解压

    Qt笔记8 zlib实现gzip解压 几个月前 由于需要使用过zlib解压文本和图片 现在将当初的方法记录在这里 以便于后续查阅 1 功能及使用方法 功能 1 解压gzip压缩的字符串 2 解压gzip压缩的图片 方法 1 下载并编译zli
  • 日常学习 mmsegmentation处理数据集和图片格式

    mmsegmentation 对数据集的读取与处理 对于自定义数据集需要在mmseg datasets下建立自己的数据集文件 如 import os path as osp from builder import DATASETS from
  • BUG -- 背景图片 background-postion 值为 百分比 时无效

    最近再写公司官网 要求响应式 为了图方便用百分比遇到一个bug 经过多方测试 此时遇到的问题是 当background size的值与容器的width height值相同时 同为px或者 background postion属性值设置为百分
  • 毕业设计-基于人工智能的脱机手写数字识别系统

    目录 前言 课题背景和意义 实现技术思路 一 相关背景知识介绍 二 基于智能优化算法的SVM在手写数字中的应用 三 基于智能优化算法的KELM在手写数字中的应用 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • js爬虫反扒

    3 js动态网页抓取方式 重点 许多时候爬虫取到的页面仅仅是一个静态的页面 即网页的源代码 就像在浏览器上的 查看网页源代码 一样 一些动态的东西如javascript脚本执行后所产生的信息是抓取不到的 下面两种方案 可用来python爬取