前言

本文只是想记录一下前几天考试的一道练习,题目并不难,主要就是看对于python爬虫中数据解析几个库的灵活使用

题目

爬取百度贴吧热议榜单,获取其中的标题及内容个数

解析题目可知,我们需要获取的是当天百度贴吧的热议榜单的标题和内容个数,我们需要先知道热议榜单的url是什么

这时我们需要对于百度贴吧的页面进行分析

贴吧的网页主页url是https://tieba.baidu.com/

而我们浏览主页面就能发现mark

这个部分,我们点击查看榜单进入就能拿到热议榜的url为:http://tieba.baidu.com/hottopic/browse/topicList?res_type=1&red_tag=v1884297849

拿到url后我们就可以对页面发起请求,而我们要获取的内容是热议榜页面的热议标题和内容数

也就是这两个数据

mark

我们这时就可以去查看页面网页代码结构了

mark

其中标题和内容分别在topic-name标签下的topic-text和topic-num标签的内容中

因为这两个标签是平行存在的使用bs4可能无法很方便的合并数据,所以尝试后,在数据解析阶段我选择的是使用xpath去获取数据

代码

import requests
from lxml import etree
#网页url
url="http://tieba.baidu.com/hottopic/browse/topicList?res_type=1&red_tag=h0345537855"
#请求头
headers={
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#构造获取etree对象的函数
def get_tree(url):
res=requests.get(url,headers=headers)
res.encoding="utf-8"
page_text=res.text
tree=etree.HTML(page_text)
return tree
#调用函数
test=get_tree(url)
#创建空字典,后续报存数据
dict={}
#定位到topic-name标签
li_list=test.xpath("//div[@class='topic-name']")
#开始循环获取数据
for li in li_list:
#获取热议标题
title = li.xpath('./a/text()')[0]
#获取标题内容数
sum=li.xpath('./span[@class="topic-num"]/text()')[0]
#写入字典
dict['title']=title
dict['sum']=sum
#打印输出
print(dict)


运行结果

{'title': '穿山甲从药典中除名', 'sum': '244.2W个内容'}
{'title': '多所高校将全额退宿舍费', 'sum': '204.3W个内容'}
{'title': 'CSGO白给狂欢节', 'sum': '154.1W个内容'}
{'title': '粉丝抵制郑爽演新电影', 'sum': '139.8W个内容'}
{'title': '2020百大最美女星', 'sum': '132.1W个内容'}
{'title': '青簪行番位之争', 'sum': '98.4W个内容'}
{'title': '电饭锅用电脑的电源线会怎样?', 'sum': '77.4W个内容'}
{'title': '女儿举报亲妈出轨副局长', 'sum': '74.8W个内容'}
{'title': '美国富豪宝藏被发现', 'sum': '65.7W个内容'}
{'title': '和历史人物重名', 'sum': '59.4W个内容'}
{'title': '女子扮孟婆熬制孟婆汤', 'sum': '54.4W个内容'}
{'title': '杨丽萍徒弟水月回应婚礼', 'sum': '45.2W个内容'}
{'title': '世卫组织称全球疫情正在恶化', 'sum': '42.1W个内容'}
{'title': '90后夫妻住深山生9娃', 'sum': '38.7W个内容'}
{'title': '父子扮侠客捡垃圾', 'sum': '35.1W个内容'}
{'title': '特朗普称不会解散警察', 'sum': '29.7W个内容'}
{'title': '跪杀黑人警察首出庭', 'sum': '29.4W个内容'}
{'title': '夫妻把房让给66只猫', 'sum': '24.7W个内容'}
{'title': '阿水因病缺席首发', 'sum': '21.4W个内容'}
{'title': '高以翔最后一部剧', 'sum': '17.2W个内容'}
{'title': '托马斯全旋创造者去世', 'sum': '13W个内容'}
{'title': '杨丽萍回应争议', 'sum': '10.1W个内容'}
{'title': '情商超级低的男生是怎样的', 'sum': '8.7W个内容'}
{'title': '有钱一定快乐吗?', 'sum': '8.6W个内容'}
{'title': '女子用自行车撞击女童', 'sum': '8.4W个内容'}
{'title': '美国征兵用电竞游戏', 'sum': '7.3W个内容'}
{'title': '你有过中二时期吗?', 'sum': '5.5W个内容'}
{'title': '新冠肺炎治疗已进入临床试验', 'sum': '4.6W个内容'}
{'title': '最后悔氪金的游戏', 'sum': '3.6W个内容'}
{'title': '北京拟为见义勇为增加免责', 'sum': '3.1W个内容'}

这样就已经达到我们题目的需求了

后续的持久化存储,本人比较懒就不做了

数据意义不大