今天想要做的是把应用宝网站数据爬取下来。
知识要点

  • 解析html
  • 解析json
  • 线程池执行

爬取步骤

  • 左边一栏是分类,右边是应用app数据。
  • 首先解析左边一栏的数据,在html中class为menu-junior的li标签里。
  • 那么我们要解析这个li标签,拿到应用的大类,然后根据大类再爬取数据。

解析提取html对应的数据

全局变量存放这个应用首页的地址和发送json请求的地址

public static String mainPageUrl = "https://sj.qq.com/myapp/category.htm?orgame=1";public static String jsonUrl = "https://sj.qq.com/myapp/cate/appList.htm?orgame=1&categoryId={categoryId}&pageSize=20&pageContext={pageContext}";

发送http get请求,使用jsoup解析这个地址。

String content = HTTPUtil.sendGet(mainPageUrl).getContent();
Document document = Jsoup.parse(content);
Elements elements = document.getElementsByClass("menu-junior");
Elements tags = elements.get(0).getElementsByTag("li");
//循环li标签集合,拿到categoryId
for(int i=0; i<tags.size(); i++) {String htmlId = tags.get(i).attr("id");if(!StringUtils.isEmpty(htmlId)) {String categoryId = htmlId.replace("cate-", "");categoryIdList.add(categoryId);}
}

categoryIdList存放大类的线程安全的队列。因为LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选。

private static ConcurrentLinkedQueue<String> categoryIdList = new ConcurrentLinkedQueue<>();

jsop对应的pom文件

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.3</version>
</dependency><dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.25</version>
</dependency>

并发爬取,以大类为一个线程任务

这里有22个大类,那么开启22个任务,开启6个线程池去轮询这22个任务。
实现思路是: 每个线程从队列中消费一个大类数据,以这个大类为参数发送http请求。

url的内容是。{categoryId}和{pageContext}是后面的传递参数。

https://sj.qq.com/myapp/cate/appList.htm?orgame=1&categoryId
={categoryId}&pageSize=20&pageContext={pageContext}

处理url发送的请求

url = url.replace("{categoryId}", categoryId).replace("{pageContext}", "0");
//发送http请求,解析json串
String content = HTTPUtil.sendGet(url).getContent();
JSONObject jsonObject = JSON.parseObject(content);
String objString = jsonObject.getString("obj");//每一次请求,是分页进行的。为了获取全部数据,所以还要进行分页处理,每次pageSize增加,直至取到空数据为止。
int index = 0;
do {JSONArray jsonArray = jsonObject.getJSONArray("obj");for(int i=0; i<jsonArray.size(); i++) {App app = jsonArray.getJSONObject(i).toJavaObject(App.class);//-------获得app的数据,对app数据进行操作。----//System.out.println(i+"  "+app.getAppName() +"   "+url);//-----------------------------------------//}//每执行一次pageContext加上20int pageContext = (++index)*20;String againUrl = jsonUrl;//解析url,替换pageContextagainUrl = againUrl.replace("{categoryId}", categoryId).replace("{pageContext}", pageContext+"");content = HTTPUtil.sendGet(againUrl).getContent();jsonObject = JSON.parseObject(content);objString = jsonObject.getString("obj");
} while (!StringUtils.isEmpty(objString));

有了上面的方法后,那么就可以使用线程池调用他。

public void run() {//开启线程池去处理数据while(!CollectionUtils.isEmpty(categoryIdList)) {final String categoryId = categoryIdList.poll();executorService.submit(new Runnable() {@Overridepublic void run() {sendJsonUrl(jsonUrl, categoryId);}});}//线程池执行完毕后,关闭退出线程池executorService.shutdown();
}

如果了解获得线程池分配得详解,欢迎点击查看

上面可能写的比较乱,这里有提供源码下载。
水平原因可能存在错误,希望指正 chenrui@marsdl.com

java并发爬取 腾讯应用宝 里的数据 (含有源码下载)相关推荐

  1. 爬取腾讯新闻中省份疫情数据到Mysql数据库

    爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...

  2. python爬取豆瓣读书top250并保存xls(含源码)

    python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...

  3. scrapy中集成selenium+浏览器池实现selenium的并发爬取LCSC网站中非结构化表格数据+异步存储进mysql+完整代码

    爬取https://lcsc.com/products/Connectors_365.html这个网址下所有的表格数据. 蓝色的都是要爬取的子页面,要爬取子页面里面的表格数据 ,表格数据如下: 右上角 ...

  4. 爬取腾讯视频网站数据

    1 数据获取 腾讯视频的网站中隐含的是一个非结构化的数据.R语言的"XML"包中htmlParse和getNodeSet非常强大,通过htmlParse可以抓取页面数据并形成树状结 ...

  5. Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情

    Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --><d ...

  6. 爬虫 spider08——爬取腾讯娱乐新闻【使用redis去重】

    根据 爬虫 spider07--爬取腾讯娱乐新闻 https://blog.csdn.net/qq_41946557/article/details/102566143 进行修改! 代码: impor ...

  7. 爬虫实战——爬取腾讯招聘的职位信息(2020年2月2日)

    爬取腾讯招聘的职位信息 思路分析 特别说明 1.获取PostId列表 2.爬取详情页面 3.保存数据 完整代码 结果展示 总结分析 思路分析 特别说明 本文以Java工作岗位信息为例进行说明,如果想爬 ...

  8. Python 爬虫 携程池 爬取腾讯动漫

    简介 主要爬取腾讯动漫上某一漫画的所有图片的url 所用到的库 分析腾讯动漫网址 代码 所用到的库 gevent gevent.pool requests selenium xpath 分析腾讯动漫 ...

  9. Java实现爬取京东手机数据

    Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...

最新文章

  1. java timer和timertask_Timer和TimerTask与Java中的线程+睡眠
  2. k8s源码架构目录分析
  3. 借助 Evolution Linux 的帮助来轻松安装 Arch Linux
  4. 二叉查找树Java实现代码
  5. ERP项目实施的原则
  6. c#问题(按F1或F2键时触发事件)
  7. Wiz Editor md 为知笔记 Markdown 插件
  8. 在ASP.NET的母版页中使用图片和超链接,HTML标记和ASP.NET标记的不同
  9. Java Script 基本知识点
  10. vue怎么自己创建组件并引用_关于vue如何创建一个自定义组件(这是项目中经常得用的)...
  11. 对抗攻击FGSM的纯粹版FGNS
  12. ThinkPHP自定义标签的使用总结
  13. Linux的du命令
  14. 成都软考-技术技能提升补贴领取指南
  15. 小打卡软件测试,考勤打卡软件大测评,这款打卡软件你有在用吗?
  16. http://gm100861.blog.51cto.com/1930562/954333
  17. Chi-Plots和Kendall Plots
  18. selectpicker.js的属性和方法
  19. 木纹标识lisp_LISP架构中一种新的移动性管理方案研究
  20. 申宝证券-个股分化严重

热门文章

  1. 如何在Mac下安装MyEclipse、Weblogic、SVN等
  2. UE4-常见的宏-UFUNCTION
  3. IQueryable查询器扩展Expression动态排序
  4. 这是最全的一篇!!!浏览器输入网址后发什么了什么?
  5. Android 之 开机动画制作
  6. 如果腰椎管狭窄压迫了马尾神经还会产生哪些病症和病痛的出现呢?
  7. Unity实现十进制转十六进制功能
  8. SpringBoot整合RocketMQ报错:“PullMessageService“ NoClassDefFoundError xxx/protocol/FastCodesHeader解决
  9. 沉浸式状态栏 关于状态栏高度的获取
  10. 两个路由器无线桥接的一些探索