java并发爬取 腾讯应用宝 里的数据 (含有源码下载)
今天想要做的是把应用宝网站数据爬取下来。
知识要点
- 解析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并发爬取 腾讯应用宝 里的数据 (含有源码下载)相关推荐
- 爬取腾讯新闻中省份疫情数据到Mysql数据库
爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...
- python爬取豆瓣读书top250并保存xls(含源码)
python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...
- scrapy中集成selenium+浏览器池实现selenium的并发爬取LCSC网站中非结构化表格数据+异步存储进mysql+完整代码
爬取https://lcsc.com/products/Connectors_365.html这个网址下所有的表格数据. 蓝色的都是要爬取的子页面,要爬取子页面里面的表格数据 ,表格数据如下: 右上角 ...
- 爬取腾讯视频网站数据
1 数据获取 腾讯视频的网站中隐含的是一个非结构化的数据.R语言的"XML"包中htmlParse和getNodeSet非常强大,通过htmlParse可以抓取页面数据并形成树状结 ...
- Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情
Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --><d ...
- 爬虫 spider08——爬取腾讯娱乐新闻【使用redis去重】
根据 爬虫 spider07--爬取腾讯娱乐新闻 https://blog.csdn.net/qq_41946557/article/details/102566143 进行修改! 代码: impor ...
- 爬虫实战——爬取腾讯招聘的职位信息(2020年2月2日)
爬取腾讯招聘的职位信息 思路分析 特别说明 1.获取PostId列表 2.爬取详情页面 3.保存数据 完整代码 结果展示 总结分析 思路分析 特别说明 本文以Java工作岗位信息为例进行说明,如果想爬 ...
- Python 爬虫 携程池 爬取腾讯动漫
简介 主要爬取腾讯动漫上某一漫画的所有图片的url 所用到的库 分析腾讯动漫网址 代码 所用到的库 gevent gevent.pool requests selenium xpath 分析腾讯动漫 ...
- Java实现爬取京东手机数据
Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...
最新文章
- java timer和timertask_Timer和TimerTask与Java中的线程+睡眠
- k8s源码架构目录分析
- 借助 Evolution Linux 的帮助来轻松安装 Arch Linux
- 二叉查找树Java实现代码
- ERP项目实施的原则
- c#问题(按F1或F2键时触发事件)
- Wiz Editor md 为知笔记 Markdown 插件
- 在ASP.NET的母版页中使用图片和超链接,HTML标记和ASP.NET标记的不同
- Java Script 基本知识点
- vue怎么自己创建组件并引用_关于vue如何创建一个自定义组件(这是项目中经常得用的)...
- 对抗攻击FGSM的纯粹版FGNS
- ThinkPHP自定义标签的使用总结
- Linux的du命令
- 成都软考-技术技能提升补贴领取指南
- 小打卡软件测试,考勤打卡软件大测评,这款打卡软件你有在用吗?
- http://gm100861.blog.51cto.com/1930562/954333
- Chi-Plots和Kendall Plots
- selectpicker.js的属性和方法
- 木纹标识lisp_LISP架构中一种新的移动性管理方案研究
- 申宝证券-个股分化严重
热门文章
- 如何在Mac下安装MyEclipse、Weblogic、SVN等
- UE4-常见的宏-UFUNCTION
- IQueryable查询器扩展Expression动态排序
- 这是最全的一篇!!!浏览器输入网址后发什么了什么?
- Android 之 开机动画制作
- 如果腰椎管狭窄压迫了马尾神经还会产生哪些病症和病痛的出现呢?
- Unity实现十进制转十六进制功能
- SpringBoot整合RocketMQ报错:“PullMessageService“ NoClassDefFoundError xxx/protocol/FastCodesHeader解决
- 沉浸式状态栏 关于状态栏高度的获取
- 两个路由器无线桥接的一些探索