• 动态网页数据的采集方案


    我在上一篇文章中介绍了使用ScrapySharp快速从网页中采集数据,这种方式是通过直接发送的Http请求来获取的原始页面信息,对于静态网页非常有效,但还有许多网站中的页面内容并非全部存放在原始的页面中,很多内容是通过javascript来动态生成的,这些数据用前面的方式就抓取不到了。本文这里就简单的介绍一下动态网页的采集方案。

    对于这样的网页数据的采集,往往是利用一个浏览器引擎来实现整个页面的加载,输出加载完后的完整页面,然后就可以利用ScrapySharp等工具解析了。常用有如下几种方式:

     

    使用WebBrowser控件

    这种方式相信大多数.Net开发者都用到过,由于WebBrowser直接使用的是操作系统集成的IE,无需下载第三方控件,比较简单快捷。但它本身只是一个呈现用的控件,并没有提供多少接口,要集成一些扩展进去比较麻烦。

     

    使用WebBrowser

    PhantomJS是一个Webkit内核的无界面浏览器,它的一个特点是可以非常方便的集成javascript脚本,因此进行扩展开发是比较方便的,也能非常方便的在服务器端不能使用UI控件的地方使用。目前网上也大部分都是这种方案,我这里转录一下看过的几篇文章,并不做详细的介绍:

    本身这个程序还是比较方便而强大的,但是在试用过程中还是存在一些问题,例如有的网页不是很规范,不能正确的解析,或者存在乱码等。

     

    使用CEF控件

    CEF是google提供的Chrome集成方案Chromium Embedded Framework,相对提供了更为底层的API,我们可以进行更为强大的定制(当然也需要更多的工作量),例如,不采集图片以加快内容的解析。

     

    直接解析Javascript模拟渲染

    以上的方案虽然都能简单正确的获取解析后的完整页面,但却存在性能问题:很慢。虽然开发浏览器的都是顶尖高手,但由于页面的渲染本身是一个非常复杂的过程,用上述工具完整渲染一个页面仍需几秒钟的时间,并且资源开销不小,无法支撑大规模的数据采集。

    大多数情况下,这个并不是什么太大的问题,但如果对性能问题比较关注,有一个比较原始的方式可以解决,那就是具体分析网页的JS工作原理,模拟浏览器执行只是内容相关JS,手动获取输出的内容。

    这种方式下,主要需要一个javascript引擎,目前已经有大量的js引擎提供,基本上不是什么问题。它主要的问题在于需要对网页定制分析,而这些网页的JS大多数采取了一定的混淆策略,并不容易分析,往往需要大量时间来调试它。

  • 相关阅读:
    Centos8 静态IP设置
    2022年1月6号 LocalDateTime触发列无效问题
    2021年12月14日复盘(Oracle Not In,Limit 1000)
    2022年1月2日复盘 线上CPU飙升
    2021年12月16日复盘 JSQLParser 命中Oracle关键词报错
    2022年1月5号 on update CURRENT_TIMESTAMP无效情况记录
    2021年12月21日复盘 雪花算法 服务器时钟偏移错误
    Centos替换源
    2021年12月9日复盘 前端日期少8小时
    WPF中DataContext作用
  • 原文地址:https://www.cnblogs.com/TianFang/p/4822898.html
Copyright © 2020-2023  润新知