python 爬虫 采集联盟信息

举报
HW小龙 发表于 2020/08/02 17:28:06 2020/08/02
【摘要】 用于采集联盟数据,比如 联盟名 、简介、成员数、话题数、总浏览量、总回复量,以及帖子信息

效果:

git项目地址:https://gitee.com/1091198228/huaweilianmengshujucaiji



开发日志

2020年8月3日00点51分:

    +帖子.作者

pname=tree.xpath('//a[@class="poPname"]/text()')
pname
Out[5]: 
['HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙',
 'HW小龙']

[+]帖子.发表日期

        本来想从联盟的主页提取帖子的发表日期

#规则写出来之后是这样的,很明显,多了“发表于”这三个字。
#还需要写个循环去消除这三个字,挺麻烦的。下个版本可能会直接从帖子里面提取(这种方式会影响帖子的浏览量)
time=tree.xpath('//span[@title]/@title | //span[@class="poPtime" and not(span)]/text()')
time
Out[14]: 
['2020-8-1',
 '2020-7-31',
 '发表于2020-6-17',
 '2020-7-31',
 '发表于2020-7-13',
 '2020-7-30',
 '发表于2020-7-16',
 '发表于2020-7-20',
 '发表于2020-7-21',
 '发表于2020-7-18',
 '发表于2020-7-17',
 '发表于2020-7-9',
 '发表于2020-7-1']

+表格保存为html网页

    效果:

代码片段:

import datetime
#获取当前日期
nowdate=datetime.datetime.now()
#获取年月,因为是按月统计所以日暂时用不着
mytime=nowdate.strftime("%Y")+"年"+nowdate.strftime("%m")+"月"
if input("是否保存数据为html?[y/n]:") == "y":
    style='<style type="text/css">table{width:90%;background:#ccc;margin:10px auto;border-collapse:collapse;}th,td{height:25px;line-height:25px;text-align:center;border:1px solid #ccc;}th{background:#eee;font-weight:normal;}tr{background:#fff;}tr:hover{background:#cc0;}td a{color:#06f;text-decoration:none;}td a:hover{color:#06f;text-decoration:underline;}</style>'
    htmlfile=mytime+lminfo["unScNa"]+".html"
    htmlbody= style + itmes_tab(sumitmes).get_html_string()+lminfo_tab(lminfo).get_html_string()
    f = open(htmlfile,"w")
    f.write(htmlbody)
    f.close()
    print("保存成功:文件名:",htmlfile)
    os.system(htmlfile)  #打开网页

+主题发表日期

    #爬取发表日期,返回一个日期列表
    time=tree.xpath('//span[@title]/@title | //span[@class="poPtime" and not(span)]/text()')
    #由于日期提取后自带“发表于”这三个字,所以写个循环删掉
    for t in range(len(time)):
        time[t]=time[t].strip("发表于")

        精确到日,预计3.0版本会精确到分钟(可能会影响统计结果)

+显示联盟人员发帖树图

        结构化数据后生成echarts图表数据。目前觉得这个功能意义不大。。。

        效果:

if input("是否保存数据?[y/n]")=="y":
    print("准备保存数据ing")
    datajson={"name":lminfo["unScNa"],"children":[]}
    namelist={}
    for i in sumitmes[0]:
        if i["pname"] in namelist:
            namelist[i["pname"]].append({"name":i["title"]})
        else:
            namelist[i["pname"]]=[]
            namelist[i["pname"]].append({"name":i["title"]})
    for i in namelist:
        print(i)
        datajson["children"].append({"name":i,"children":namelist[i]})
    print(json.dumps(datajson,ensure_ascii=False))
<body>
		<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.0.0-alpha.1/echarts.js"></script>
		<div id="main" style="width: 100%;height: 2000px;"></div>

		<script type="text/javascript">
			// 基于准备好的dom,初始化echarts实例
			var myChart = echarts.init(document.getElementById('main'));

			// 指定图表的配置项和数据
			myChart.setOption(option = {
			
			tooltip: {
				trigger: 'item',
				triggerOn: 'mousemove'
			},
			series: [{
				type: 'tree',
				triggerOn: 'mousemove',
				data: [数据放到这里面],
				 top: '1%',
				 left: '7%',
				 bottom: '1%',
				 right: '20%',
				symbolSize: 10,
				symbol: 'emptyCircle',
				roam:'true',
				label: {
					position: 'left',
					verticalAlign: 'middle',
					align: 'right',
					fontSize: 20
				},

				leaves: {
					label: {
						position: 'right',
						verticalAlign: 'middle',
						align: 'left'
					}
				},
				initialTreeDepth:1,
				expandAndCollapse: true,
				animationDuration: 550,
				animationDurationUpdate: 750
			}]
			});
		</script>
	</body>


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。