神刀安全网

爬虫获取 js 动态数据 (1)

爬虫遇到 js 动态数据时,主要解决方法有两种:

  1. 使用一些库,例如 Selenium,来模拟浏览器环境抓取数据。但这样做对内存和 CPU 的消耗都比较大,爬虫效率低,应尽量避免。
  2. 手动分析 js 请求,构造请求 url

下面我选了一个漫画网站作为小例子,讲一下第二个方法。

https://manhua.sfacg.com/mh/YSJ/5183/

我们的目的是获取漫画图片 url,然后下载下来。

判断待爬数据是否 js 动态加载的

用 chrome 打开该网页,右键漫画图片 -> 检查

爬虫获取 js 动态数据 (1)

我们可以看到图片的 url 就在里面。可以右键此处(蓝色部分)-> copy -> copy xpath 获得图片对应的 xpath,然后可以使用 requests 和 xpath 获取图片 url。当然最后还是失败了。因为这里的图片是 js 动态加载出来的。
(当然,还有更简单的判断方法,直接安装 Chrome 插件 Toggle Javascript,该插件可以判断网页哪部分内容是 js 加载的)

获取跟待爬数据有关的 js 代码信息

我们可以查看网页源代码,Ctrl+F 定位图片 id “curPic”:

爬虫获取 js 动态数据 (1)

可以看到,里面根本没有图片的 url,图片是 js 加载的。阅读里面的 js 代码,我们可以知道图片 url 是由下面这行代码决定的:

pic2.src = hosts[getHost()] + picAy[curIndex] 

在源码中寻找 hostspicAy,发现它们只在这里出现过。这说明这两个数组可能是由 js 代码加载的。

寻找跟待爬数据有关的 js 请求

回到漫画那个页面,我们打开 Chrome 的 F12,点击 network,勾选 js,刷新网页,查看相关 js 请求对应的 preview,看看哪些包含 hostspicAy

爬虫获取 js 动态数据 (1)

额,这进展还是出乎意料的顺利,第一个 js 就有我们想要寻找的内容了。由此图可知,我们进入某一话漫画的第一页时,就有一份 js 代码请求了这一话漫画所有页的图片 url。点击该请求的 headers,我们可以看到该请求的 url,里面包含 js 文件名。那么,我们在写程序的时候,该如何得到这份 js 的文件名?

观察其他漫画的情况,我们可以发现,虽然这份 js 代码的命名没啥规律,不过在网页源代码中,它一般是处于第一个 js 的位置。这样就可以用正则表达式提取啦 O(∩_∩)O 哈哈~

知道 js 文件名后,我们就可以构造请求 url 了。

总结

至此,总结一下如何下载该网站漫画:

  1. 获取一话漫画的第一页 url
  2. 获取该 url 响应的 html
  3. 在 html 中寻找第一个 js 代码文件名
  4. 构造请求 url,获取该 js 的响应内容,从中提取所有图片 url

总结一下该例子中获取 js 动态数据的思路:

  1. 判断是不是 js 加载的数据
  2. 如果是 js 加载的,查看网页源代码中待爬取数据附近的 js 代码,获取关键信息(比如一些变量名)
  3. 回到待爬网页那里,按 F12(我用的 Chrome),点击 network,勾选 js,刷新网页,获取 js 请求
  4. 逐个查看每个请求的 preview,看有没有跟待爬取内容相关的信息。
  5. 如果有某个请求的响应内容包含我们需要的信息,查看该请求的 headers 和 url,想办法构造这样的请求url。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 爬虫获取 js 动态数据 (1)

分享到:更多 ()