CSDN爬虫(六)——动态网页爬取的两种策略

来源:互联网 发布:聪明的网络语怎么说 编辑:程序博客网 时间:2024/05/22 13:07


说明

  • 开发环境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
  • 爬虫框架:webMagic
  • 建议:建议首先阅读webMagic的文档,再查看此系列文章,便于理解,快速学习:http://webmagic.io/
  • 开发所需jar下载(不包括数据库操作相关jar包):点我下载
  • 该系列文章会省略webMagic文档已经讲解过的相关知识。

概述

  • 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可。但是,有一种情况是比较特殊的:网页的数据采用异步加载的,比如ajax加载的数据,在我们“查看网页源代码”是查看不到的。采用常规的爬虫这一块是解析不到的。
  • 第一种解决方案是采用一些第三方的工具,模拟浏览器的行为,去加载数据。比如:SeleniumPhantomJs

    • 优点:不必考虑动态页面的各种变化多端(无论动态数据如何变化,最终呈现在页面上的效果是固定的,我们只关心最终结果。),我们只用关心最终的现实结果即可。可以统一处理。
    • 缺点:性能低下,比如使用Selenium,每次我们都需要去启动一个浏览器进程;配置繁琐,不同的浏览器需要下载不同的驱动以及jar包,并且驱动和jar包之间有严格版本匹配关系,如果不匹配就不能使用(至少本人因为版本匹配的关系,花了很大的时间)。
  • 第二种解决方案是分析页面,找到对应请求接口,直接获取数据。

    • 优点:性能高,使用方便。我们直接获取原数据接口(换句话说就是直接拿取网页这一块动态数据的API接口),肯定会使用方便,并且改变的可能性也比较小。
    • 缺点:缺点也是明显的,如何获取接口API?有些网站可能会考虑到数据的安全性,做各种限制、混淆等。这就需要看开发者个人的基本功了,进行各种分析了。
  • 本文首先会采用Selenium进行第一种方式爬取CSDN评论模块的数据;然后采用第二种方式分析爬取CSDN评论模块的数据;另外,看网上一个很火的“爬取京东胸罩评论分析国人罩杯。。。”,我们就也尝试爬取“销量最高的胸罩的所有评论数据”。有福利=_+

方案一:采用Selenium模拟浏览器获取动态网页数据

步骤
  1. 下载需要的jar和浏览器驱动。注意事项:其实这一块是个难点,需要Selenium所需的jar、浏览器驱动、浏览器版本需要匹配,如果不匹配会出现各种问题。文章结束会给出一个我测试成功用的一个版本的jar包以及驱动的下载。版本匹配可以参考这篇文章:http://blog.csdn.net/huilan_same/article/details/51896672;我用的是chrome浏览器,chromedriver下载地址(不需要翻墙):http://chromedriver.storage.googleapis.com/index.html。
  2. 将下载的驱动放到谷歌浏览器的安装目录下,如下图 
    这里写图片描述

  3. 导入jar包,具体步骤不再详述。如下图 
    这里写图片描述

  4. 编写测试代码

    package com.wgyscsf.spider;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;/** * @author 高远</n> * 编写日期   2016-11-13下午9:02:01</n> * 邮箱  wgyscsf@163.com</n> * 博客  http://blog.csdn.net/wgyscsf</n> * TODO</n> */public class SeleniumTest {    public static void main(String[] args) {        // 第一步: 设置chromedriver地址。一定要指定驱动的位置。        System.setProperty("webdriver.chrome.driver",                "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");        // 第二步:初始化驱动        WebDriver driver = new ChromeDriver();        // 第三步:获取目标网页        driver.get("http://blog.csdn.net/wgyscsf/article/details/52835845");        // 第四步:解析。以下就可以进行解了。使用webMagic、jsoup等进行必要的解析。        System.out.println("Page title is: " + driver.getTitle());        System.out.println("Page title is: " + driver.getPageSource());    }}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
结果分析
  • 分析页面地址:http://blog.csdn.net/wgyscsf/article/details/52835845

  • 查看原网页源码,我们发现原网页有一条评论:“请问您,有爬好的数据集吗”。我们在网页源码页搜索,结果搜索不到(不要被迷惑了,那一条评论是最新评论列表中的数据,并不是文章详情的评论数据。): 
    这里写图片描述

这里写图片描述

  • 查看采用Selenium解析后的页面的数据,我们搜索可以搜索到文章详情的数据(不是最新评论的数据哦,是真正文章详情的评论数据。): 
    这里写图片描述

这里写图片描述

方案二:分析页面(采用Chrome浏览器进行演示),获取所需的API

案例一:获取CSDN博文详情的评论API(就是上面分析的那个)

步骤:
  1. 打开需要分析的网页:http://blog.csdn.net/wgyscsf/article/details/52835845

  2. 按F12,选择Network,刷新页面。如下图 
    这里写图片描述

  3. 这里我们就需要一个一个分析了,找到我们所需要的API。这里有一个技巧:我们可以采用Filter,如下图。进行信息过滤。 
    这里写图片描述

  4. 比如我们要分析获取评论信息,那么第一想法就是这个接口的命名可能就是Comment…。这样可以快速定位,找到我们需要的信息。 
    这里写图片描述

  5. 不负众望,我们真的找到了。看来我们的想法和CSDN的开发人员的想法一致:评论就应该用评论的英文commnet进行命名! 
    这里写图片描述

  6. copy找到完整API地址: 
    这里写图片描述 
    这里写图片描述

案例二:获取京东销量最高胸罩的所有评论信息

步骤:
  1. 打开需要分析的网页:https://item.jd.com/10341817326.html
  2. 按F12(不要忘了选择商品评论后再刷新哦),选择Network,刷新页面。如下图 
    这里写图片描述
  3. 这里我们就需要一个一个分析了,找到我们所需要的API。这里有一个技巧:我们可以采用Filter,如下图。进行信息过滤。

  4. 比如我们要分析获取评论信息,那么第一想法就是这个js的命名可能就是Comment…。这样可以快速定位,找到我们需要的信息。 
    这里写图片描述

  5. 不负众望,我们真的找到了。看来我们的想法和CSDN的开发人员的想法一致:评论就应该用评论的英文commnet进行命名! 
    这里写图片描述

  6. copy找到完整API地址:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv50&productId=10341817326&score=0&sortType=5&page=0&pageSize=10,该链接有福利=_+

这里写图片描述

操作代码(代码已全部迁移至github,欢迎star)

https://github.com/scsfwgy/WebMagic_CSDN_Demo 点击获取

说明

  • 开发环境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
  • 爬虫框架:webMagic
  • 建议:建议首先阅读webMagic的文档,再查看此系列文章,便于理解,快速学习:http://webmagic.io/
  • 开发所需jar下载(不包括数据库操作相关jar包):点我下载
  • 该系列文章会省略webMagic文档已经讲解过的相关知识。

概述

  • 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可。但是,有一种情况是比较特殊的:网页的数据采用异步加载的,比如ajax加载的数据,在我们“查看网页源代码”是查看不到的。采用常规的爬虫这一块是解析不到的。
  • 第一种解决方案是采用一些第三方的工具,模拟浏览器的行为,去加载数据。比如:SeleniumPhantomJs

    • 优点:不必考虑动态页面的各种变化多端(无论动态数据如何变化,最终呈现在页面上的效果是固定的,我们只关心最终结果。),我们只用关心最终的现实结果即可。可以统一处理。
    • 缺点:性能低下,比如使用Selenium,每次我们都需要去启动一个浏览器进程;配置繁琐,不同的浏览器需要下载不同的驱动以及jar包,并且驱动和jar包之间有严格版本匹配关系,如果不匹配就不能使用(至少本人因为版本匹配的关系,花了很大的时间)。
  • 第二种解决方案是分析页面,找到对应请求接口,直接获取数据。

    • 优点:性能高,使用方便。我们直接获取原数据接口(换句话说就是直接拿取网页这一块动态数据的API接口),肯定会使用方便,并且改变的可能性也比较小。
    • 缺点:缺点也是明显的,如何获取接口API?有些网站可能会考虑到数据的安全性,做各种限制、混淆等。这就需要看开发者个人的基本功了,进行各种分析了。
  • 本文首先会采用Selenium进行第一种方式爬取CSDN评论模块的数据;然后采用第二种方式分析爬取CSDN评论模块的数据;另外,看网上一个很火的“爬取京东胸罩评论分析国人罩杯。。。”,我们就也尝试爬取“销量最高的胸罩的所有评论数据”。有福利=_+

方案一:采用Selenium模拟浏览器获取动态网页数据

步骤
  1. 下载需要的jar和浏览器驱动。注意事项:其实这一块是个难点,需要Selenium所需的jar、浏览器驱动、浏览器版本需要匹配,如果不匹配会出现各种问题。文章结束会给出一个我测试成功用的一个版本的jar包以及驱动的下载。版本匹配可以参考这篇文章:http://blog.csdn.net/huilan_same/article/details/51896672;我用的是chrome浏览器,chromedriver下载地址(不需要翻墙):http://chromedriver.storage.googleapis.com/index.html。
  2. 将下载的驱动放到谷歌浏览器的安装目录下,如下图 
    这里写图片描述

  3. 导入jar包,具体步骤不再详述。如下图 
    这里写图片描述

  4. 编写测试代码

    package com.wgyscsf.spider;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;/** * @author 高远</n> * 编写日期   2016-11-13下午9:02:01</n> * 邮箱  wgyscsf@163.com</n> * 博客  http://blog.csdn.net/wgyscsf</n> * TODO</n> */public class SeleniumTest {    public static void main(String[] args) {        // 第一步: 设置chromedriver地址。一定要指定驱动的位置。        System.setProperty("webdriver.chrome.driver",                "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");        // 第二步:初始化驱动        WebDriver driver = new ChromeDriver();        // 第三步:获取目标网页        driver.get("http://blog.csdn.net/wgyscsf/article/details/52835845");        // 第四步:解析。以下就可以进行解了。使用webMagic、jsoup等进行必要的解析。        System.out.println("Page title is: " + driver.getTitle());        System.out.println("Page title is: " + driver.getPageSource());    }}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
结果分析
  • 分析页面地址:http://blog.csdn.net/wgyscsf/article/details/52835845

  • 查看原网页源码,我们发现原网页有一条评论:“请问您,有爬好的数据集吗”。我们在网页源码页搜索,结果搜索不到(不要被迷惑了,那一条评论是最新评论列表中的数据,并不是文章详情的评论数据。): 
    这里写图片描述

这里写图片描述

  • 查看采用Selenium解析后的页面的数据,我们搜索可以搜索到文章详情的数据(不是最新评论的数据哦,是真正文章详情的评论数据。): 
    这里写图片描述

这里写图片描述

方案二:分析页面(采用Chrome浏览器进行演示),获取所需的API

案例一:获取CSDN博文详情的评论API(就是上面分析的那个)

步骤:
  1. 打开需要分析的网页:http://blog.csdn.net/wgyscsf/article/details/52835845

  2. 按F12,选择Network,刷新页面。如下图 
    这里写图片描述

  3. 这里我们就需要一个一个分析了,找到我们所需要的API。这里有一个技巧:我们可以采用Filter,如下图。进行信息过滤。 
    这里写图片描述

  4. 比如我们要分析获取评论信息,那么第一想法就是这个接口的命名可能就是Comment…。这样可以快速定位,找到我们需要的信息。 
    这里写图片描述

  5. 不负众望,我们真的找到了。看来我们的想法和CSDN的开发人员的想法一致:评论就应该用评论的英文commnet进行命名! 
    这里写图片描述

  6. copy找到完整API地址: 
    这里写图片描述 
    这里写图片描述

案例二:获取京东销量最高胸罩的所有评论信息

步骤:
  1. 打开需要分析的网页:https://item.jd.com/10341817326.html
  2. 按F12(不要忘了选择商品评论后再刷新哦),选择Network,刷新页面。如下图 
    这里写图片描述
  3. 这里我们就需要一个一个分析了,找到我们所需要的API。这里有一个技巧:我们可以采用Filter,如下图。进行信息过滤。

  4. 比如我们要分析获取评论信息,那么第一想法就是这个js的命名可能就是Comment…。这样可以快速定位,找到我们需要的信息。 
    这里写图片描述

  5. 不负众望,我们真的找到了。看来我们的想法和CSDN的开发人员的想法一致:评论就应该用评论的英文commnet进行命名! 
    这里写图片描述

  6. copy找到完整API地址:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv50&productId=10341817326&score=0&sortType=5&page=0&pageSize=10,该链接有福利=_+

这里写图片描述

操作代码(代码已全部迁移至github,欢迎star)

https://github.com/scsfwgy/WebMagic_CSDN_Demo 点击获取

阅读全文
0 0