爬虫遇到js动态渲染问题

爬虫遇到js动态渲染问题爬虫遇到js动态渲染问题时间:2020年6月3日10:28:48作者:钟健概要:关于scrapy爬虫应对网页JavaScript动态渲染问题关键字:scrapycrapy-splash一、传统爬虫的问题scrapy爬虫与传统爬虫一样,都是通过访问服务器端的网页,获取网页内容,最终都是通过对于网页内容的分析来获取数据,这样的弊端就在于他更适用于静态网页的爬取,而面对js渲染的动态网页就有点力不从心了,因为通过js渲染出来的动态网页的内容与网页文件内容是不一样的。1.实际案例腾讯招聘:ht

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

爬虫遇到js动态渲染问题

时间:2020年6月3日10:28:48

作者:钟健

概要:关于scrapy爬虫应对网页JavaScript动态渲染问题

关键字:scrapy crapy-splash

一、传统爬虫的问题

scrapy爬虫与传统爬虫一样,都是通过访问服务器端的网页,获取网页内容,最终都是通过对于网页内容的分析来获取数据,这样的弊端就在于他更适用于静态网页的爬取,而面对js渲染的动态网页就有点力不从心了,因为通过js渲染出来的动态网页的内容与网页文件内容是不一样的

1.实际案例

腾讯招聘:https://careers.tencent.com/search.html

在这里插入图片描述

这个网站第一眼看过去是非常中规中矩的结构也很鲜明,感觉是很好爬的样子,但是当你查看他的网页文件的时候,就会发现:

在这里插入图片描述

网页文件并没有太多的内容,全部是引用了js做的动态渲染,所有数据都在js中间,这就使我们无法对于网页的结构进行分析来进行爬取数据

那我们如何,获取到它实际显示的页面,然后对页面内容进行分析呢?

二、scrapy解决动态网页渲染问题的策略

目前scrapy解决动态网页渲染问题的主要有以下三种的解决方法:

  • seleium+chrome

就是传统的结合浏览器进行渲染,优点就在于,浏览器能访问什么,他就能够获取到什么,缺点也很明显,因为它需要配合浏览器,所以它的速度很慢。

  • selenium+phantomjs

    与上一种的方式一样,但是不需要开浏览器。

  • scrapy-splash(推荐)

    而scrapy-splash与以上两种方法对比,它更加快速轻量,由于,他是基于twisted和qt开发的轻量浏览器引擎,并提供了http api,速度更快,最重要的是他能够与scrapy非常完美的融合。

三、安装使用scrapy-splash

1.安装Docker

由于ScrapySplash要在docker里使用,我们先安装docker,过程比较复杂痛苦,略

在安装的过程中有一个非常严峻的问题,那就是docker,需要开启win10 hyper虚拟服务,这与你在电脑上安装的VM是相冲突的,所以在使用docker,的时候无法使用VM虚拟机,而且每次切换时都需要重启电脑,目前这个问题暂时无法解决。

2.安装splash镜像

docker run -p 8050:8050 scrapinghub/splash

这个过程异常异常的慢,而且必须是国内的镜像,才能够下载下来。

所以我配置了两个国内的下载IP,一个网易的,一个阿里云的。


{ 
   
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

下载完成过后,打开浏览器访问:http://localhost:8050/

在这里插入图片描述

这就表示已经安装完成了,命令行不能关闭哦

3.安装scrapy-splash

pip install scrapy-splash

python没有花里胡哨的安装过程。

四、项目实践

1.项目的创建和配置过程略

2.settings.py的配置

PIDER_MIDDLEWARES = { 
   
   'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DOWNLOADER_MIDDLEWARES = { 
   
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,  # 不配置查不到信息
}

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'

SPLASH_URL = "http://localhost:8050/"  # 自己安装的docker里的splash位置
# DUPEFILTER_CLASS = "scrapy_splash.SplashAwareDupeFilter"
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

3.爬虫的设计

    def start_requests(self):
        splah_args = { 
   
            "lua_source": """ function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(0.5)) return { html = splash:html(), png = splash:png(), har = splash:har(), } end """
        }
        headers = { 
   
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/72.0.3626.109 Safari/537.36',
        }
        yield SplashRequest(url=self.start_url, callback=self.parse, args=splah_args,
                            headers=headers)
  • 这里我们编写一个初始化的start_requests方法,这个方法是继承父类的。

  • 注意我们最后的请求方式SplashRequest,我们不再使用Request,而是使用scrapy-splash的请求方式,这里也体现了它与scope框架的完美融合。

  • 至于里面的参数,就没有必要介绍了,其中要注意两个参数argscallback

    • args是配置信息可以参照http://localhost:8050/中的
    • callback下一级处理方法的函数名,最后的方法一定要指向self.parse,这是scrapy迭代爬取的灵魂。

4.解析打印数据

    def parse(self, response):
        print(response.text)
        job_boxs = response.xpath('.//div[@class="recruit-list"]')
        for job_box in job_boxs:
            title = job_box.xpath('.//a/h4/text()').get()
            print(title)

这是通过渲染以后的网页数据

在这里插入图片描述

这里我们直接获取职位的标题

在这里插入图片描述

这就表明scrapy爬虫应对动态网页渲染问题已经解决,也就意味着scrapy能够处理大部分的网页,并可以应对一些图形验证问题

五、总结与思考

  1. 之后遇到的问题,当我们获取到了,职位列表过后,当我们需要访问详情页的时候,我们就必须获取详情页的链接,但是腾讯非常的聪明,并没有采用超链接的方式进行跳转,而是通过用户点击事件,然后通过js跳转,这就造成了我们无法获取详情页的链接。

  2. 当我沮丧的时候,我认真的检查了浏览器与服务器的数据交换中,其实它的数据也是通过js进行后台请求得到的,所以通过对大量的数据进行采集,最终找到了他的数据接口(贼开心!!!)

    在这里插入图片描述

这时候我们就要做取舍了,我们想要的是所有数据,并不是渲染出来的网页,与解析网页内容相比,直接通过它的接口获取json数据,更加快捷方便,速度更快,所以我们就要做出取舍,在这里直接获取接口数据将更好,错误率会更低,速度也会更快。

  1. 其实大部分的动态网页的渲染,都存在与数据端进行请求交互数据,当然也存在一些,直接把数据存在js中间,然后再通过js渲染到网页上,这时候scrapy-splash就可以发挥价值了,尤其是在一些验证码,图形验证方面更加突出。
  2. 随着前端技术的不断发展,前端对数据的控制更加灵活多样,这也要求爬虫的逻辑也需要不断的跟进,也要求使用新的工具,新的技术,在不断的探索实践中跟上时代的步伐。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159469.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 微信小程序后端开发流程_微信小程序开发入门

    微信小程序后端开发流程_微信小程序开发入门微信小程序开发流程记录一、代码处理(一)微信小程序(前端显示)微信小程序项目的架构部分特点说明(二)后台服务器(数据交互)需要的环境特别注意二、项目部署(一)Wampserver的设置(二)域名的获取(三)小程序官方网站上的设置一、代码处理最近一大学同窗开了家自习室,需要一个自习室的预约微信小程序,又恰好手上没有什么代码项目在写,本着少一事不如多一事的原则,尝试了第一次的微信小程序开发。白天要上班,只能利用晚上时间编写,反正他也不着急开业,于是前前后后用了大概半个月的时间,故做记录。刚开始写,确实没什

  • Linux开发在中国[通俗易懂]

    Linux开发在中国[通俗易懂][2004-5-15]  中关村最堵车的白颐路旁的一座公寓里,赵宇一手拿着遥控器,一手指着电视屏幕给客户演示着流媒体的点播效果。作为腾博讯公司的总经理,赵宇已经在Linux圈里面摸爬滚打了五年多。他曾策划发行过Linux光盘,创建过Linux社区,做过Linux杂志主编。现在,他又基于Linux流媒体服务器技术创建了自己的公司。  但…

  • jar包和war包的区别

    jar包和war包的区别1.概念1.1jar包JAR包是类的归档文件,JAR文件格式以流行的ZIP文件格式为基础。与ZIP文件不同的是,JAR文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和JVM这样的工具直接使用。2.2war包war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。2.目录结构

  • Idea使用git切换远程分支[通俗易懂]

    描述公司开发人数越来越多,项目业务逻辑越来越复杂,就有了越来越多的分支,各个小伙伴在各自的分支上进行开发,然后进行合并,如果本大爷需要切换到别的开发分支上,那如何实现呢?解决方案屁话不多说,直接上图 点击鼠标右键,选择GIT–>Repository–>Pull… Branchestomerge:选择你需要的分支,如果你没遇到你想要的分支就点击刷新一下。…

  • Linux curl命令最全详解

    Linux curl命令最全详解目录一、最常用的curl命令1、发送GET请求2、发送POST请求3、发送json格式请求:二、curl命令语法与curl命令参数详解1、curl命令语法2、curl命令参数详解三、Linuxcurl命令退出码四、常见用法1、下载(option:-o或者option:-O)2、上传文件(option:-T)3、伪造来源页面|伪造referer|盗链(option:-e)4、伪造代理设备(模仿浏览器)5、设置http请求6、http响应头7.

  • 全息投影技术的实现_自制全息投影视频素材

    全息投影技术的实现_自制全息投影视频素材今天自己亲自动手制作了一个全息投影仪,智能手机早就具备投射出全息影像的潜质,现在Mrwhosetheboss就将这段教程上传到网上,看起来简直酷极了。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号