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()函数结合使用,具备很强的格式…

python list tuple 消耗_Python内存消耗:dict VS元组列表

在这种情况下,你实际上得到了一个不完整的内存使用图片。字典的总大小以不规则的间隔增加一倍以上,如果在字典大小增加后比较这两个结构的大小,它会再次变大。一个带有递归大小函数的简单脚本(见下面的代码)显示了一个非常清晰的模式&#xf…

python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...

python3实现版本PrefaceGNU Make 太麻烦?Makefile 写起来太臃肿?头文件依赖生成搞不定?多核同时编译太麻烦?Emake 帮你解决这些问题:使用简单:设定源文件,设定编译参数和输出目标就行了&#xf…

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-…

开启php缩略图,PHP生成缩略图

//参数1 文件名 参数2 缩放比例function _thumb($_filename,$_percent){ob_clean();//生成png标头文件header(Content-type:image/png);$_nexplode(., $_filename);//获取文件的信息,宽和高list($_width,$_height)getimagesize($_filename);//生成缩略后的大小$_new_wid…

php项目中sql,php – 大括号{}在SQL查询中做了什么?

有关双引号字符串语法,请参见http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing.花括号用于复杂的变量表达式.它们由PHP解释,而不是由SQL接口解释.$query "SELECT * FROM users WHERE user$_POST[username] AND password$_POST[pas…

php获取本机ip外网地址,php获取本机ip(远程IP地址)

例子,php获取用户IP地址。复制代码 代码示例:// 111111111111echo $_SERVER[REMOTE_ADDR];// 2222222222222function get_local_ip() {$preg "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25…

php打png图片水印颜色失真,ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整...

/**———————————————————-* 为图片添加水印———————————————————-* static public———————————————————-* param string $source 原文件名* param string $water 水印图片* param string $$savename 添加水印后的图片名…

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

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

matlab基础试题,MATLAB基础试题题目及答案,课程2020最新期末考试题库,章节测验答案...

【判断题】手指第一关节应该始终保持支撑。【单选题】如果陈先生购买了一套 200 万的住房(家庭首套住房),房屋面积为 105 平方米,容积率为 3.0, 房价低于当地平均价格,则他要缴纳的契税为( )万元。在做高抬指练习时注意下键速度要…

乘法口诀表编程php视频,PHP学习之制作乘法口诀表

进入学习php语言状态。昨日看了一天视频。才能够把这个小口诀表实现。好难啊。里面有个口诀表的函数、echo "";for ($a1;$a<9;$a){ //循环输出a a默认值是1 a的值不会大于9 且不断加一for ($b1;$b<$a;$b){//{b默认值是1 且b值不能大于a值 也就是九 加一运算/*一…

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

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

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

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

php javascript对象,JavaScript 对象

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

oracle12c 删除pdb用户,oracle 12c pdb测试:创建、开关、删除

pdb测试&#xff1a;创建、开关、删除-----------------------ORACLE12C中提出来CDB和PDB的概念他们可以分别理解为容器和插件(PDB插入在CDB中)CDB的管理和传统数据库区别不大--确认当前cdbSQL> select name,cdb from v$database;NAME CDB--------- ---ZARADB YES--…

oracle 备份批处理,windows下oracle自动备份批处理

上一篇日志中&#xff0c;我将windows下的备份流程分成了五步走。本日志就结合上篇的理论来个实例。该实例是来自于我现网的中的一个备份示例(不要想着弄我密码啊&#xff0c;内容改过的&#xff0c;呵呵)。费话少说&#xff0c;直接上脚本&#xff1a;eche off//下面一部分是设…

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

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

oracle约束 关闭,Oracle约束管理脚本

正在看的ORACLE教程是:Oracle约束管理脚本。作为一个Oracle数据库管理员&#xff0c;会碰到这样的数据库管理需求&#xff0c;停止或者打开当前用户(模式)下所有表的约束条件和触发器。这在数据库的合并以及对数据库系统的代码表中某些代码的修改时需要做的工作之一。我们来看这…

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

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

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

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