腾讯、网易、新浪新闻网站爬虫编写记录及评论格式分析
0 前言
先说说看这篇博客你能知道什么:1 腾讯、网易、新浪不同新闻的地址格式以及评论内容的地址格式(返回数据为json的异步接口);2 一些比较通用的设计方法,对软件设计的菜鸟可能有帮助;
之前也说了要写这篇博客,现在终于写出来了。我的毕业设计的指导老师说毕设论文的字数不够……所以我决定把这些本不应该出现在论文中的实现细节凑到论文中。至于下面说到的东西要解决什么问题,各位可以先看看这个网站(我毕设的初步结果,目前还在优化中,包括代码结构还有UI设计):http://news.reetsee.com/
凡是这篇博文中出现超链接的地方,可以放心点击,新的页面会在新标签中打开而不会直接在当前的标签打开。
这个网站要实现以下功能:从腾讯新闻、网易新闻、新浪新闻中(当然以后可能会更多其它新闻网站)通过代码自动分析出哪些新闻内容是相似的,然后把相似的内容组织到一起,例如三个网站都有“北京成功申奥”这样的新闻,这个网站会自动把三条新闻归到一起,然后把三个新闻网站的热门评论都下载下来,按照时间排序,最后通过代码计算出一段“评论概括”,因为有的人很懒,看新闻基本就是看了标题然后看评论,看评论可能只看热门评论,看热门评论可能还看那种被顶得最多的,所以我就这么帮下这些懒人了……哈哈哈。
网站打开得有点慢,这个是因为我的代码写得不够好,在百度也看到很多牛逼的技术内容,回头看看这个毕设的各种设计,觉得有点丢脸,迟点重构····目前先凑合着用。咳咳,跑题了,这个网站的所有内容可以说都是通过爬虫抓取下来了,我的工作只不过是将爬虫获取的内容进行了组织然后重新展现。
这篇博客的内容仅仅是说一下爬虫是怎么写的,完全不会涉及分析新闻相似的算法是怎么样的以及对热门评论进行概括的算法是怎么样的。
那么下面开始。
1 新闻格式规范化
我在同学介绍下选择了Python的Scrapy爬虫框架进行爬虫编写(最近我自己用PHP写了个爬虫框架Phpfetcher,可以参见这里:http://blog.reetsee.com/archives/366)。要在自己的网站上展示新闻内容,就应该将下载好的新闻按照统一的格式处理好,这样前端(网页端)才能够方便地处理、展示。一篇新闻有以下几个需要关注的地方:
- 新闻标题
- 新闻正文
- 新闻时间
由于要知道新闻的来源以及对应的评论,所以加上这两项:4. 新闻来源,5. 新闻评论地址。
那么最终在我这里,一篇处理后的新闻格式应该是这样的(这里使用类似json的格式表示,“[]”表示一个数组,“{}”表示一个字典):
01
|
{
|
02
|
'source' : '来源网站' ,
|
03
|
'date' : '时间(长度8位,如20140501)' ,
|
04
|
'contents' : {
|
05
|
'link' : '新闻详细内容页面的地址' ,
|
06
|
'title' : '新闻标题' ,
|
07
|
'passage' : '新闻正文' ,
|
08
|
},
|
09
|
'comments' : {
|
10
|
'link' : '新闻对应的评论页面地址' ,
|
11
|
},
|
12
|
}
|
如果有人问既然已经有了新闻的地址页面,为什么还要将新闻标题、新闻正文这些内容保存到本地呢?因为要在本地对新闻进行分类,就必须将这些内容下载下来。
上面的格式只是一个初步的统一格式,最终的格式相比这个可能会有小变化,这个后面再说。
2 评论格式规范化
要在我的网站对评论进行展示,就要有统一的格式,通常评论的要素包括三个:
- 用户名
- 评论时间
- 评论内容
由于我要标注评论的来源,所以再加一个:4. 评论来源,那么最终被我处理过的评论格式如下:
1
|
{
|
2
|
'source' : '来自哪个新闻网站' ,
|
3
|
'user' : '用户名' ,
|
4
|
'time' : '10位长度的时间戳' , //转换成时间戳是为了方便以后排序
|
5
|
'content' : '评论内容'
|
6
|
}
|
那么最终重新按照时间排序后的评论列表格式应该是像下面这样的:
01
|
[
|
02
|
{
|
03
|
'source' : '' ,
|
04
|
'user' : '' ,
|
05
|
'time' : '' ,
|
06
|
'content' : ''
|
07
|
},
|
08
|
{
|
09
|
'source' : '' ,
|
10
|
'user' : '' ,
|
11
|
'time' : '' ,
|
12
|
'content' : ''
|
13
|
},
|
14
|
{
|
15
|
'source' : '' ,
|
16
|
'user' : '' ,
|
17
|
'time' : '' ,
|
18
|
'content' : ''
|
19
|
},
|
20
|
21
|
...
|
22
|
]
|
这里先规范好最终的评论格式,下面针对评论部分的讲解设计就有头有据了。
另外就是评论并不需要爬虫下载!因为评论是实时更新的,不像新闻,基本上发布了就不怎么变化了。因为评论的内容是在用户点击某条新闻后才通过HTTP请求获取的。
3 URL规则分析
3.1 腾讯新闻
- targetid就是新闻的id;
- time就是时间戳,有了这个可以转换成公元时间;
- content就是回复的内容(这位网友真是热心回复这么多);
- up就是人家给的赞的数量;
- userinfo中的nick就是用户名了,后面竟然还有对应的腾讯微博的用户信息。
01
|
{
|
02
|
id: "5828439023791190273" ,
|
03
|
targetid: 1004703995,
|
04
|
parent: "0" ,
|
05
|
replyuser: "" ,
|
06
|
replyuserid: 0,
|
07
|
timeDifference: "01月13日 18:15:50" ,
|
08
|
time: "1389608150" ,
|
09
|
content: "很高兴看到中央军委日前印发《关于军队贯彻落实〈党政机关厉行节约反对浪费条例〉的措施》,规定今后所有公务用车采购国产自主品牌,其实不光是汽车,像电脑、打印机、扫描仪、复印机、服务器、网络设备、软件等产品更要带头采购国产自主品牌,防止军队内部机密资料遭受国外网络黑客攻击!希望中央军委、中国海陆空军队能够切实担负起捍卫国土、捍卫钓鱼岛的职责!其实中国的部队,大部分军官素质是好的,但也有相当一部分军官也十分腐败,作风腐化堕落,为人霸道欺负新兵,道德品质极差;艰苦奋斗、勤俭建军的思想有所淡化;革命意志、进取精神有所退化;铺张浪费、大手大脚现象有所抬头。加强军队的反腐倡廉建设对于巩固党的执政地位、树立中国军队的新形象、提升国防战斗力十分重要。要保卫好祖国国土完整,加强军队作风建设和反腐倡廉建设责任重大。“物必自腐,而后虫之”,如果任由各种腐败作风在军队系统漫延,将使中国军队的整体战斗力、中国军官的整体政治素质大大下降,后果不堪设想!希望中央军委一定要在全军大力开展创先争优活动,加强中国军人综合素质建设与作风建设,全面推广党风廉政建设巡视检查制度,大力清除军队内部的腐败分子,大力整顿军队内部的“吃喝玩乐嫖赌、卖官鬻爵收受贿赂违规提拔干部”等各类不正之风,营造“勤于学习、善于学习、钻研技术、廉洁从业”的良好氛围,铸造一支英勇善战、战斗力凝聚力号召力超强的中国军队!同时中国军队应该坚持人性化细节化管理,对于长期夫妻两地分居的军官、军人要免费发放性慰器,防止他们流入社会进入嫖娼卖淫场所影响中国军队形象!希望中国能够集国家和中华民族的坚强意志,大力加强自主创新型国家建设,努力攻克在大型民用飞机、军用飞机、导弹系统、航空母舰等制约国家核心技术的关键高端产业领域,早日使我国的民用与军用飞机、导弹、航空母舰早日上市,彻底摆脱对欧洲、美国、日本在先进技术上的制约,成为一个装备制造强国!中国不能搞、不会搞军事扩张但也绝不能太懦弱,一定要夯实军事装备,提升军队战斗力,保护好国土、海域的安全,捍卫民族尊严!" ,
|
10
|
up: "91" ,
|
11
|
rep: "0" ,
|
12
|
type: "2" ,
|
13
|
hotscale: "3" ,
|
14
|
checktype: "2" ,
|
15
|
checkstatus: "1" ,
|
16
|
isdeleted: "0" ,
|
17
|
tagself: "" ,
|
18
|
taghost: "" ,
|
19
|
source: "1" ,
|
20
|
userinfo: {
|
21
|
userid: "21059616" ,
|
22
|
uidex: "ec52a391823814524e8446efa3bd6a48d9" ,
|
23
|
nick: "炎黄子孙中国梦" ,
|
24
|
head: "http://q1.qlogo.cn/g?b=qq&k=ACz0AuPMwiaSfHTmIGWbIOw&s=40&t=0" ,
|
25
|
gender: "1" ,
|
26
|
viptype: "0" ,
|
27
|
mediaid: 0,
|
28
|
region: "中国:安徽:宣城" ,
|
29
|
thirdlogin: 0,
|
30
|
wbuserinfo: {
|
31
|
name: "cjppjc17" ,
|
32
|
nick: "炎黄子孙中国梦" ,
|
33
|
url: "" ,
|
34
|
vip: 0,
|
35
|
ep: 0,
|
36
|
brief: "" ,
|
37
|
identification: "" ,
|
38
|
intro: "" ,
|
39
|
liveaddr: {
|
40
|
country: "1" ,
|
41
|
province: "34" ,
|
42
|
city: "18" ,
|
43
|
area: ""
|
44
|
},
|
45
|
level: 0,
|
46
|
classify: ""
|
47
|
},
|
48
|
commentnum: "283" ,
|
49
|
commentednum: "168" ,
|
50
|
upnum: "2108"
|
51
|
}
|
52
|
},
|
还记得在“评论规范化”中定的格式吗?现在我们就从上面的json格式找到一个将其规范化的方法,假设热门评论连接中返回的json格式的变量名为js,i为遍历时的下标,那么用下面这个方法进行评论格式的规范化:
1
|
{
|
2
|
'source' : 'tencent' ,
|
3
|
'user' : js[ 'data' ][ 'commentid' ][i][ 'userinfo' ][ 'nick' ],
|
4
|
'time' : js[ 'data' ][ 'commentid' ][i][ 'time' ], //原格式就是10位时间戳了不用转换
|
5
|
'content' : js[ 'data' ][ 'commentid' ][i][ 'content' ]
|
6
|
}
|
3.2 网易新闻
01
|
<script type= "text/javascript" >
|
02
|
if ( typeof isForceShowComment != "undefined" ) {
|
03
|
isShowComments = isForceShowComment;
|
04
|
};
|
05
|
function tieInit() {
|
06
|
tie_load({
|
07
|
urs: "http://img1.cache.netease.com/utf8/microblog/urs/urs1.0.3.js" ,
|
08
|
tie: "http://img1.cache.netease.com/utf8/tie/tieanywhere2.6.6-min.js"
|
09
|
},
|
10
|
function () {
|
11
|
var replyCount = 10068,
|
12
|
totalCount = 59215,
|
13
|
threadId = "9IISVTCG0001124J" ,
|
14
|
boardId = "news_guonei8_bbs" ,
|
15
|
host = tieChannel,
|
16
|
tId = tId;
|
17
|
NTES( ".js-tielink" ).attr( "href" , "http://comment." + host + ".163.com/" + boardId + "/" + threadId + ".html" )
|
18
|
NTES( ".js-tiecount" ).attr( "innerHTML" , totalCount);
|
19
|
NTES( ".js-joinCount" ).attr( "innerHTML" , TieAnywhere.formatNumber(totalCount.toString(), 3));
|
20
|
NTES( ".js-bjoinCount" ).attr( "innerHTML" , TieAnywhere.formatNumber(totalCount.toString(), 3));
|
21
|
NTES( ".js-actCount" ).attr( "innerHTML" , TieAnywhere.formatNumber(replyCount.toString(), 3));
|
22
|
NTES( ".js-bactCount" ).attr( "innerHTML" , TieAnywhere.formatNumber(replyCount.toString(), 3));
|
23
|
new TieAnywhere.Tie({
|
24
|
wraper: NTES( "#tieArea" ),
|
25
|
threadId: threadId,
|
26
|
boardId: boardId,
|
27
|
host: host,
|
28
|
isShowComment: isShowComments,
|
29
|
isStrict: isStrict,
|
30
|
tId: tId
|
31
|
});
|
32
|
})
|
33
|
};
|
34
|
tie_ready( function () {
|
35
|
if (!window.NTES) {
|
36
|
tie_load({ lib: "http://img1.cache.netease.com/cnews/js/ntes_jslib_1.x.js" }, function () {
|
37
|
tieInit();
|
38
|
}, "GBK" )
|
39
|
} else {
|
40
|
tieInit();
|
41
|
};
|
42
|
});
|
43
|
</script>
|
44
|
<!--tie end-->
|
- 前面的数字1表示1楼;
- f是显示的内容,对应分别为“网易XX网友”,用户ID,用户IP,没有用户ID的就显示“网易XX网友”,连“网易XX网友”都没有的就显示IP地址,我猜的;
- v是支持数量;
- u不知道是什么粗略看一眼值全部都是’u’;
- d是当前评论的新闻id;
- t就是发表评论的时间啦;
- b就是评论的内容;
- a就是表示这个楼是不是最后一层楼的;
- p就是上面那个div标签的id;
- n怀疑是网易帐号或者用户名;
- l不知道是什么;
- ip就是ip了。
01
|
{
|
02
|
1: {
|
03
|
f: "网易日本手机网友 <span id=9KUDRCJ8 class=cGray>ip:126.255.*.*:</span>" ,
|
04
|
v: "11014" ,
|
05
|
u: "u" ,
|
06
|
d: "9KUD5BUN00011229" ,
|
07
|
t: "2014-02-13 03:34:08" ,
|
08
|
b: "媽的,這傻逼幹嘛不索取精液流失費?" ,
|
09
|
a: "0" ,
|
10
|
p: "9KUDRCJ8" ,
|
11
|
n: "chinese_cc@163.com" ,
|
12
|
l: "0" ,
|
13
|
ip: "126.255.*.*"
|
14
|
}
|
15
|
},
|
另外一个例子:
01
|
{
|
02
|
1: {
|
03
|
f: "网易山东省济南市手机网友 [<a href=''>逗狗儿玩呵呵</a>]: " ,
|
04
|
d: "9KUD5BUN00011229" ,
|
05
|
b: "这么一搞这女的以后还能嫁出去?够阴的。" ,
|
06
|
a: "0" ,
|
07
|
n: "逗狗儿玩呵呵" ,
|
08
|
l: "0" ,
|
09
|
tsn: "8058245774" ,
|
10
|
ip: "113.128.*.*" ,
|
11
|
timg: "http://mimg.126.net/p/butter/1008031648/img/face_big.gif" ,
|
12
|
v: "9219" ,
|
13
|
u: "u" ,
|
14
|
t: "2014-02-13 04:04:49" ,
|
15
|
p: "9KUFJMLA" ,
|
16
|
tid: "4983565181079566873"
|
17
|
}
|
18
|
},
|
1
|
{
|
2
|
'source' : 'netease' ,
|
3
|
'user' : js[ 'hotPosts' ][i][ '1' ][ 'n' ],
|
4
|
'time' : js[ 'hotPosts' ][i][ '1' ][ 't' ], //原格式“%Y-%m-%d %H:%M:%S”,要转换成10位长度的时间戳
|
5
|
'content' : js[ 'hotPosts' ][i][ '1' ][ 'b' ]
|
6
|
}
|
3.3 新浪新闻
1
|
<meta name= "comment" content= "kj:2-1-9122947" >
|
2
|
<meta name= "sudameta" content= "comment_channel:kj;comment_id:2-1-9122947" >
|
1
|
{
|
2
|
'source' : 'sina' ,
|
3
|
'user' : js[ 'hot_list' ][i][ 'nick' ],
|
4
|
'time' : js[ 'hot_list' ][i][ 'time' ], //原格式“%Y-%m-%d %H:%M:%S”,要转换为10位时间戳
|
5
|
'content' : js[ 'hot_list' ][i][ 'content' ]
|
6
|
}
|
4 最终格式及补充说明
01
|
{
|
02
|
'source' : 'tencent' ,
|
03
|
'date' : '20140214' ,
|
04
|
'newsId' : '015412' ,
|
05
|
'cmtId' : '1004980094' ,
|
06
|
'contents' : {
|
07
|
'link' : 'http://news.qq.com/a/20140214/015412.htm' ,
|
08
|
'title' : '哈尔滨一夜清查酒店洗浴等2700余家' ,
|
09
|
'passage' : '正文内容'
|
10
|
},
|
11
|
'comments' : {
|
12
|
'link' : 'http://coral.qq.com/1004980094' ,
|
13
|
}
|
14
|
}
|
网易:
01
|
{
|
02
|
'source' : 'netease' ,
|
03
|
'date' : '20140214' ,
|
04
|
'newsId' : '9L2525NG0001124J' ,
|
05
|
'cmtId' : '9L2525NG0001124J' ,
|
06
|
'boardId' : 'news_guonei8_bbs' ,
|
07
|
'contents' : {
|
08
|
'link' : 'http://news.163.com/14/0214/14/9L2525NG0001124J.html' ,
|
09
|
'title' : '哈尔滨4800余警力一夜清查酒店洗浴等2700余家' ,
|
10
|
'passage' : '正文内容'
|
11
|
},
|
12
|
'comments' : {
|
13
|
'link' : 'http://comment.news.163.com/news_guonei8_bbs/9L2525NG0001124J.html' ,
|
14
|
},
|
15
|
}
|
新浪:
01
|
{
|
02
|
'source' : 'sina' ,
|
03
|
'date' : '20140214' ,
|
04
|
'newsId' : '1-1-29471498' ,
|
05
|
'cmtId' : '1-1-29471498' ,
|
06
|
'channelId' : 'gn' ,
|
07
|
'contents' : {
|
08
|
'link' : 'http://news.sina.com.cn/c/2014-02-14/142829471498.shtml' ,
|
09
|
'title' : '哈尔滨4800余警力一夜清查2700家酒店洗浴场所' ,
|
10
|
'passage' : '正文内容' ,
|
11
|
},
|
12
|
'comments' : {
|
13
|
'link' : 'http://comment5.news.sina.com.cn/comment/skin/default.html?channel=gn&newsid=1-1-29471498' ,
|
14
|
},
|
15
|
}
|
原文链接地址: http://blog.reetsee.com/archives/237
腾讯、网易、新浪新闻网站爬虫编写记录及评论格式分析相关推荐
- Android使用Intent一键分享图片文字到腾讯、新浪、开心、微信等
现在分享应用很多,消耗研发与维护时间,增加项目成本,而且集成分享功能后我们的应用包会比以前要大几MB.其实有android的Intent可以满足分享文字和图片的需求,而且不增加应用包的大小. /*** ...
- 淘宝京东商品长链接缩短为腾讯,新浪短链接的接口有哪些?
分享淘宝京东商品宝贝的都知道,商品的详情页链接太长在微博,微信发布的话太占用字符空间了,而且过长的链接很不正规用户难以接受.所以我们需要将这些长链接转换缩短成一个非常短的短链接再发布.所有短链接服务商 ...
- 使用javaMail进行腾讯,新浪,网易网上邮箱验证
最近本人在开发web项目中,使用到了javaMail来进行邮箱验证.最初刚接触javaMail开发的时候,本人搜索很多有关这方面的知识和案例,比如慕课网上的课程,但那些都只是针对本地邮箱服务器或者单个 ...
- 国内大公司的开源项目( 阿里 腾讯 百度 新浪 搜狐 豆瓣 大众点评)
阿里 阿里的开源项目很多,这也跟@淘宝正明的开源态度密不可分.有很多重量级的项目,例如LVS.Tengine,或者很有实践价值的中间件,例如 MetaQ(分布式消息系统).dubbo(RPC框架).c ...
- 腾讯、新浪、淘宝、搜狐的IP库接口,根据IP显示当地的天气功能
实现根据IP显示当地天气的功能,现在测试各个平台给予的IP库的准确度问题: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...
- 获取股票简单数据:腾讯、新浪、东方财富。。。
1,腾讯的数据显示是用脚本动态改变某个表格的内容. 腾讯脚本太多,还没有看出来在哪里能找到规律. 初步想法,把它页面所有的链接都搞出来,去搜索关键字"main-" 2,新浪直接给你 ...
- 淘宝、百度、腾讯、新浪开放平台
淘宝开放平台: http://open.taobao.com/ 百度开放平台:http://open.baidu.com/ 腾讯开放平台:http://open.qq.com/ 新浪开放平台:http ...
- 淘宝 腾讯 百度 新浪 技术团队 博客
From:http://blog.csdn.net/perfect2011/article/details/18844575 csdn lidp http://blog.csdn.net/perfe ...
- scrapy爬取新浪股吧中康美评论
题目要求 使用scrapy,建立爬虫 针对新浪股吧,下载自己选择的上海证券市场股票评论,股票代码自选填入随后示范连接处,http://guba.sina.com.cn/?s=bar&name= ...
最新文章
- android处理url中的特殊字符
- (转自PHPer)成长的选择
- ibatis主键自动生成
- Python中对象是否可以迭代iterable
- intellij idea不显示git push按钮的解决办法
- 【C++】50.编程中切换状态的【有限状态机】
- 安卓桌布显示的dip和px
- vpx8运行待解决问题
- 日结问题解决思路和方式
- 不越狱 继续逆向 微信运动
- Windows10下安装MySQL8.0
- 菲佣WPF——3(关于INotifyPropertyChanged的使用的想法)
- cuda和cudnn各版本下载地址
- win10 计算机 权限,介绍电脑windows10管理员权限开启的4种方法
- python读取组合惯导数据,并进行坐标转换到北东天、utm坐标系
- 苹果 / Apple iCloud 教育版 200GB 云盘账号自助注册教程
- 服务器路由器无线ap,TP-Link TL-WR841N路由器无线AP设置方法
- MyBatis 大于等于、小于等于的写法
- Facebook中国程序员之死:年仅38岁跳楼轻生,浙大EE毕业生,去年刚入职
- HDCP @HMAC-SHA256[基于mbedtls]
热门文章
- plc与python之间实现通信的结构框图_Python设计模式 - UML - 通信图(Communication Diagram)...
- 小区移动基站能否杀人于无形?
- 五一惠州双月湾游,海滩,帐篷,野营,烧烤、篝火晚会
- 《Cortex-M0权威指南》之Cortex-M0编程入门
- How to Easily Read a Linux Man Page
- Visual Studio .NET已检测到指定的Web服务器运行的不是ASP.NET 1.1 版...的解决办法
- 小米两高管科普Redmi K50电竞版快充细节:挑战最快边玩边充
- 1台车至少赚1万块!华为卖车,两天订单破3000辆
- 90后互联网打工人:为了买小两居,爸妈打零工帮我凑首付
- 华为带动涨价?二季度中国市场智能手机均价涨了13%