java获取b站动态列表地址_爬虫入门(三)爬取b站搜索页视频分析(动态页面,DBUtils存储)...

这一次终于到了分析b站视频了。开始体会到写博客非常占用学技术的时间,但是还是希望能总结,沉淀下来。

工具:使用Webmaigc框架,DBUtils,C3P0连接池。

分析过程:b站的搜索页面是这样的。如果浏览器右键查看源代码,你会发现是动态页面,也就是从后台通过ajax等在某个路径加载获得数据

71f3eac892e043c19ec7f973ca4909aa.png

于是初入爬虫的我,打算贪方便试一下selenium模拟浏览器行为,结果效果不太好。当时是b站的搜索页面经常显示的是 出错啦,后来我就苦苦思索,我通过b站的页面在F12开发者工具里,从请求路径里找到了b站视频的搜索url,https://search.bilibili.com/api/search,当时还是很激动的!

从这个路径进去,发现b站视频的数据实际上是一个大Json,通过看webmagic文档知道了它提供了JsonPath的拿取方法。于是就按JsonPath拿数据,原本是用xpath在html里拿数据。

先贴一下我的processor核心代码:

1 public class BilibiliSearchProcessor implementsPageProcessor{2 private Site site = Site.me().setUserAgent("Mozilla/5.0 (Windows NT 10.0; …e/59.0.3071.109 Safari/537.36")3 .setRetryTimes(3)4 .setTimeOut(30000)5 .setSleepTime(1800)6 .setCycleRetryTimes(3)7 .setUseGzip(true)8 .addHeader("Host","search.bilibili.com")9 .addHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")10 .addHeader("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")11 .addHeader("Accept-Encoding","gzip, deflate, br")12 ;13 private static final String man = "Pierre Bensusan";14 private static final String defineUrl = "https://search.bilibili.com/api/search?search_type=video&keyword="+man+"&from_source=banner_search&order=totalrank&duration=0&tids=0";15 //"井草圣二","伍伍慧","押尾光太郎","岸部真明","松井佑贵","小松原俊","郑成河","depapepe","Pierre Bensusan","TOMMY EMMANUEL","Daniel Padim","andy mckee"};

16 public voidprocess(Page page) {17 int numPage = Integer.parseInt(page.getJson().jsonPath("$.numPages").get());18 for (int i=0;i

22 List ups = page.getJson().jsonPath("$..author").all();23 page.putField("author", ups);24 //标题

25 List titles = page.getJson().jsonPath("$..title").all();26 page.putField("title", titles);27 //链接

28 List srcLinks = page.getJson().jsonPath("$..arcurl").all();29 page.putField("srcLinks", srcLinks);30 //时长

31 List durations = page.getJson().jsonPath("$..duration").all();32 page.putField("duration", durations);33 //观看数

34 List watchNums = page.getJson().jsonPath("$..play").all();35 page.putField("watchNum", watchNums);36 //上传时间 2017-08-09 150222263337 //2016-09-28 147505314238 //2018-05-18 1526650568

39 List uploadTimes = page.getJson().jsonPath("$..pubdate").all();40 page.putField("uploadTime", uploadTimes);41 //review

42 List reviews = page.getJson().jsonPath("$..review").all();43 //video_review

44 List video_reviews = page.getJson().jsonPath("$..video_review").all();45 //favorite

46 List favorites = page.getJson().jsonPath("$..favorites").all();47 //视频说明

48 List description = page.getJson().jsonPath("$..description").all();49 page.putField("description", description);50 for (int i=0;i

57 publicSite getSite() {58 returnsite;59 }60

61 public static voidmain(String[] args) {62 Spider.create(newBilibiliSearchProcessor())63 //.addUrl(urls)

64 .addUrl(defineUrl)65 .addPipeline(newConsolePipeline())66 .thread(5)67 .run();68 }69 }

有几个当时遇到的要点讲一下:

第一是site的header一定要加!!没有为什么,一定要加,因为要模拟更真实的浏览器访问!

第二是site的爬取频率,b站还是有限制的,.setSleepTime(1800)这样就可以了,不会太快。

第三是b站视频爬的pubdate也就是上传时间,实际上是秒为单位,但是平时java里转换用的是毫秒,当晚我没想明白这个数字该怎么转换成date格式,第二天早上突然就发现了,真是感恩。

另外,json里拿到title实际上带有关键词的高亮,于是写了个cutHtml的方法去replace.

第四是header的host要加对,我当时用selenium有时成功有时失败,我后来改成直接拿Json的时候突然发现我Host之前写的地址好像不对劲,不是search.bilibili.com,现在才渐渐明白估计也是参数错了.

第五是能分析动态分析页面,尽量分析,因为用selenium速度还是不快的,而且会造成java程序结束,chrome进程却没有退出的情况(开发者估计也还没优化!)

1 public classSimpleUtil {2 //短日期格式

3 public static String DATE_FORMAT = "yyyy-MM-dd";4

5 /**

6 * 将长整型数字转换为日期格式的字符串7 *8 *@paramtime9 *@return

10 */

11 public static String convert2String(longtime) {12 if (time > 0l) {13 SimpleDateFormat sf = newSimpleDateFormat(DATE_FORMAT);14 Date date = newDate(time);15 returnsf.format(date);16 }17 return "";18 }19

20 public staticString cutHtml(String str){21 return str.replaceAll("?[^>]+>", "");22 }23 }

Dao就不贴了,直接用DBUtils,QueryRunner执行sql语句save一个数据对象.

有什么疑问可以发我邮箱zhhiyp@qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python a和b字符串和占位符输出_Python占位符的使用与format函数字符串格式化详解...

Python字符串格式化01字符串的格式化分类字符串的格式化方法共两种:占位符(%)与format方式。占位符方式在Python2比较常见,随着Python3到来,format方式变得广泛起来,format函数常与print()函数结合使用,具备很强的格式…

18135usm_佳能PZ-E1+EF-S 18-135mm f/3.5-5.6 IS USM镜头 小型工作室的利器

EF-S 18-135mm f/3.5-5.6 IS USM 在大神眼里据对是属于狗头系列的 哈哈哈 但是这货如果搭配佳能的 PZ-E1 在配合佳能80D 那绝对是小型视频工作室的首选 !!!mxcpTB2rqUOg80kpuFjSsppXXcGTXXa_!!104284319.jpg (156.5 KB, 下载次数: 1)2017-3-…

java服务器要二次编译,ecology项目二次开发环境搭建

ecology项目二次开发环境搭建Submitted By Weaver文档版本控制文档简要信息:文档主题(Title)ecology项目二次开发环境搭建作者(Author)审批者 (To Be Approved By)说明 (Comments)ecology项目二次开发环境搭建文件名称 (File Name)文档版本历史:序号日期…

列车matlab模型,【国家级精品课程】-中南大学-数学建模-lingo-matlab-优化建模-数模培训-全国赛论文-京沪线列车调度模型(B题)...

【国家级精品课程】-中南大学-数学建模-lingo-matlab-优化建模-数模培训-全国赛论文-京沪线列车调度模型(B题) 答卷编号: 答卷编号: 论文题目: 京沪线列车调度模型(B题) 参赛队员: 1. 唐欢 电话:13100251389 2. 任礼秋…

如何学习matlab 知乎,知乎日报

利用记忆软件 Anki 进行复习:先看一下效果:通过编程(Matlab 程序 main.m)把一集美剧中的每一句话的中英文和语音都分离出来,输入 Anki 进行复习。制作每一集的学习包的大概流程如下:下面是详细步骤:* 流程只适用于装了…

php javascript对象,JavaScript 对象

JavaScript 对象JavaScript 对象是拥有属性和方法的数据。真实生活中的对象,属性和方法真实生活中,一辆汽车是一个对象。对象有它的属性,如重量和颜色等,方法有启动停止等:对象属性方法car.name Fiatcar.model 500car.weight 8…

getlasterror返回57怎么解决_王者荣耀:用时最短职业比赛?3分57秒结束,解说都看呆了!...

原标题:王者荣耀:用时最短职业比赛?3分57秒结束,解说都看呆了!相信很多人都知道,王者荣耀作为一款手机游戏,虽然节奏比英雄联盟这种端游快得多,但一局比赛也要十分钟左右&#xff0c…

35岁学嵌入式合适吗_什么是嵌入式技术?

物联网应用技术中,嵌入式技术是至关重要的。但是,至少有60%的人不了解什么是嵌入式技术。物联网时代的到来,不管是从行业应用,还是智能硬件的爆发,亦或是大数据等等嵌入式技术都得到了史无前例的发展。简单来说&#x…

cvpr2020 人脸检测与识别_投石科技温度检测人脸识别设备装置

投石科技温度检测人脸识别设备装置内容共分为五大块,包括:行业概况、产品简介、核心功能、产品优势、应用场景。行业概况:人工智能安防即“人工智能安防”,以人工智能技术为核心,形成一系列产品和系统解决方案。近两年…

arrays合并两个数组_每天一道力扣题: 88. 合并两个有序数组

题目给你两个有序整数数组 nums1和nums2,请你将nums2合并到 nums1 中,使nums1成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m n)来保存 nums2 中…

dbsync for oracle ms sql,DBSync for Firebird and MSSQL

DBSync for Firebird and MSSQL简介DBSync for Firebird and MSSQL简介一:DBSync for Firebird and MSSQL是款专业的数据库同步软件。能够将MS SQL版完美的迁移到Firebird,支持从Firebird到MSSQL数据库的双向同步以及相反方向的精确同步,支持…

arthas 查看哪个方法调用最耗时_阿里巴巴问题排查神器Arthas使用实践

Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。Github:https://github.com/apache/incubator-dubbo文档:http://dubbo.incubator.apache.org/zh-cn/Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月…

及cp含义_新媒体运营炒CP,既好用,又好玩(第327回)

点击上方蓝色字关注我们,获得724小时新媒体运营协助炒CP这个词大家应该都听说过,英文是Coupling,是配对的意思,源自同人圈。比如,金晨与张继科出现在同一节目里,观众看两个人同框时感觉像一对,就…

c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...

程序内容:提供五种工资菜单,用户自行选择,读取用户输入的工作时长,计算工资和净收入,及其缴纳的税金。(C Primer Plus 第7章 第8题)程序更新:解决输入非数字选项后退出程序的bug。这…

linux 安装 交换分区大小,给已安装的Linux新增Swap交换分区

跟了我5年多的本本已步入花甲,CPU严重老化,运行Windows异常吃力,于是考虑换成Linux试试。忙活了一天,测试了2个“家用”Linux发行版,一个是深度的Linux Deepin 2013,另一个是雨林木风的StartOS 5.1。在测试过程中也遇到一些有用的…

linux音频驱动修复工具,Linux声卡驱动(4)——音频驱动实战

一、应用测试工具的使用1.在external/tinyalsa下有以C语言实现的alsa的测试程序,编译后生成tinypcminfo tinyplay tinycap tinymix 四个elf格式的测试工具(1) tinypcminfo :获取PCM In和PCM# tinypcminfo -D /dev/snd/controlC0# tinypcminfo -D /dev/sn…

二元相图软件_FactSage 软件教程 入门学习资料汇总

(一)英文版的学习资料(1)FactSage官网:http://www.factsage.com/打开FactSage官网,如下图所示,点击左侧FactSage界面上的模块按钮即可查看其使用方法。点击右侧的链接"Free FactSage Demo …

bufferreader readline一次读一行_python中read(),readline(),readlines()的区别

读取文件的三个方法:read()、readline()、readlines()。三种方法均可接受一个变量size,用于限制每次读取的数据量,也就是说从文件当前位置起读取size个字节;若无参数size,则表示读取至文件结束为止。接下来总结下三种读…

固定 顶部_一楼小院想建阳光房?固定的怕违建,那这样可伸缩的阳光房怎么样...

今天小编又有一个新鲜出炉的案例要跟大家分享啦!前几次与大家分享的都是伸缩阳光房顶,不论是手动还是电动款式 ,似乎都是针对天井、下沉式庭院等设计的。那针对一些小区里的一楼小院,固定的怕违建,有没有什么对策呢&am…

C语言坐标打飞机,C语言控制台实现打飞机小游戏

本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下初学C语言总觉得不能做些什么好玩的,这个小游戏只需 “一点点” (千真万确)C语言知识就能完成!总计不到200行的非空白代码(没有强行压缩行数)操作说…