爬虫学习——获取动态网页信息
对于静态网页可以直接研究html网页代码实现内容获取,对于动态网页绝大多数都是页面内容是通过JavaScript脚本动态生成(也就是json数据格式),而不是静态的,故需要使用一些新方法对其进行内容获取。凡是通过静态方法获取不到的内容,均为动态网页生成的内容。
对于硬编码在JavaScript中的内容,可以直接对js进行下手;但是对于JavaScript通过HTTP请求跟网站动态交互获取信息的方式,其需要对应的渲染引擎处理后,在执行爬取操作。
幸运的是,Scrapy中刚好有对应的渲染引擎Splash(Webkit开发且无界面的浏览器,提供基于JavaScript的HTTP接口的渲染服务),可以通过它获得以下内容:经过渲染后的HTML页面或者网页截图;支持并发渲染多页面。
那么如何使用Splashd的服务呢?
首先在Linux中安装它,然后在本地端口8050或8051端口启动该服务。安装的时候记得选择管理员权限:
Sudo apt-get install docker //借助docker容器进行安装,故先安装docker
Sudo docker pull scrapinghub/splash //借助docker获取splash
Sudo docker run -p 8050:8051-p 8050:8051 scrapinghub/splash //在对应的端口启动渲染服务。
为了更深入学习Splash的功能,可以参考以下文档:
Splash HTTP API — Splash 3.5 documentation该网页链接指向Splash项目的API文档页面。Splash是一个用Python编写的轻量级浏览器自动化工具,主要用于渲染和抓取JavaScript动态生成的网页内容。该链接的文档页面提供了Splash的应用程序编程接口(API)的详细信息,开发者可以通过这些API与Splash进行交互,实现诸如加载网页、执行JavaScript代码、获取页面截图、提取页面内容等功能。其中Splash的两个api端点:Render.html用于提供JavaScript页面渲染服务和execute可用于执行用户自定义的JavaScript脚本代码。
使用这render.html的服务只需要知道以下参数即可:
Render.htmld的请求地址:http://localhost:8050/render.html;请求方式:GET/POST
返回类型:html。适用于爬取JavaScript的动态数据
Execute用于运行用户自定义的模拟点击页面中的按钮和模拟人与页面进行交互的操作。
使用这execute的服务只需要知道以下参数即可:
Execute的请求地址:http://localhost:8050/execute;请求方式:POST;返回类型:自定义;
传入代码:自定义的lua脚本。适用场景:模拟人打开页面;等待页面加载;执行JavaScript代码;获取HTTP响应头;模拟人获取Cookie。
除了在Linux中借助docker来使用Splash的服务外,也可以在pycharm中通过pip install scrapy-splash指令来使用该服务,然后必须在settings.py文件中对其进行内容配置(Splash服务器地址,设置去重过滤器,缓存参数等),另外记得加上USER_AGENT在setting.py中。
如何查看USER_AGENT?在网页检查中可以看到: