前言
上次完成了静态网页的爬取,这次来爬取动态加载的网页。
静态网页一般通过点击“下一页”来加载下一页的内容,一般来说 URL 都会随页数而产生相应的变化。
而所谓的动态网站,就是那些下拉自动加载或者点击“加载更多”来加载更多的网页内容,而且网页的 URL 不发生变化;
这种网页一般采用 AJAX 请求后端服务器,实现动态加载的效果。
AJAX 具体怎么工作的?还要慢慢了解,这里我只知道动态加载的效果是通过 AJAX 请求服务器完成的;
既然有请求,就肯定有请求链接,分析出请求链接之后,就可以通过 requests 模拟请求,从而实现数据的爬取。
爬虫目标
- 爬取澎湃网美数课专栏的所有文章中的图片
地址:(https://www.thepaper.cn/list_25635)
爬取步骤
AJAX 请求 url 分析
首先 F12
进入开发者页面,选择 Network
,再点击 XHR
;这个 XHR 就是 AJAX 的请求类型;
然后一直下拉网页,让它加载几次之后,就能看到出现了几个特殊的请求链接;
随便点击一个请求链接,就能看到这个请求的详细信息;里面的 Request URL
就是 AJAX 请求后台服务器的完整链接。
找到请求链接之后,来看一下有没有什么规律:
1 | https://www.thepaper.cn/load_index.jsp?nodeids=25635&topCids=&pageidx=2&isList=true&lastTime=1549194757315 |
通过观察可以发现,请求链接只有 pageidx
和 lastTime
两个参数在变化,前者显然是一页一页的增加的,后面那个完全没有规律好嘛?
索性,,,删掉试试;果然,那个 lastTime
参数并没有什么用处,删掉之后一样能得到返回的结果。
这样请求链接就变得相当有规律了,就能很方便的用 for 循环构造了;甚至那个 isList=true
都可以不要了;某一返回结果如下图:
返回结果分析
可以看到每篇文章的标题里都会有一个链接:
打开那个链接,就进入到了那篇文章的详情页面;
而且,对文章中的图片进行 检查
,图片的源地址暴露无疑:
到这里就差不多了,总体思路就是:先模拟 AJAX 请求,在返回的结果页面中提取出详情页面的链接,然后再对详情页面中的图片地址进行提取,最后下载。
爬取结果
最后是下载到了一个本地的文件夹里:
完整代码
1 | import requests |
外话
这里尝试了一下多进程爬取,效果非常明显,普通下载 1000+ s,多进程下载 300+ s;虽然我不太懂多进程具体是怎么回事,就冲着这个效果,也要学一学吧。