← 全部文章
Python爬虫xpath

requests + xpath 爬取全网热搜并生成词云

约 4 分钟SIKUAI

起因

某天闲来无事,想着看看现在大家每天都在关注些什么,遂打开浏览器,查找热搜,偶然间看到下面这个网站,于是心生一计,打算用python爬取网站生成词云,看看关注最多的事情是什么。

https://tophub.today/c/ent

需要工具

python3环境(会pip安装包)
会ctrl CV的手
~~脑子~~ (不用也行)

开整

简单浏览一下,发现网页为动态加载,可能是加载框架+接口获取数据(参考 zoomeye白嫖万条数据),也可能是获取页面,这里直接打开bp抓包,重放器看一眼发现请求参数是(/c/ent?p=N),很明显是动态加载页面,那么我们可以使用selenium模拟浏览器下滑加载所有网页,也可以使用requests请求网页获取,此处我们选择requests的方法。

Burpsuit请求参数

GET /c/ent?p=24 HTTP/2
Host: tophub.today
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36

只需要带上UA 就可以请求到网页,用python简单写一下就是

import requests
url = 'https://tophub.today/c/ent?p=2'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36',
}
res = requests.get(url=url,headers=headers)
print(res.text)

确定页数

因为get的参数只有一个p(ent为娱乐,此处只爬取该页面),所以肯定是要确定页数,这里我们可以检测为空就跳出循环,也可以计算页数,根据xpath获取到个数(右键->检查,右键->复制完整xpath)

# res.text为获取的网页,此处确定编码并etree处理方便下面解析
res.encoding = "utf-8"
html = etree.HTML(res.text)
num = html.xpath("/html/body/div[1]/div[4]/div/div[1]/div[1]/small")[0].text
print(num,type(num))
# print一下确定是想要的数据和类型
290个 <class 'str'>

此处含有“个”以及类型是str,所以我们使用replace去掉不需要的字符,int()转换类型.

# //在python3里指整除,有余数所以在后面+1捕捉所有页面
page = (int(num.replace("个","")) // 12 ) + 1
print(page)

25

同理我们通过xpath可以获取热点来源和热点的列表以及作者
此处我们只需要列表即热搜内容,所以右键复制xpath进行分析,懒得贴出来了,简单对比一下就知道哪些参数对应不同的列表。
使用try是为了遍历所有的msg,list参数为1到12(因为每个p只返回12个结果)

try:
	for i in range(1,100):
		msg = html.xpath("/html/body/div[1]/div[4]/div/div[2]/div["+str(list)+"]/div/div[2]/div[1]/a["+str(i)+"]/div/span[2]")[0].text
		with open('娱乐.txt','a',encoding='utf-8') as f:
			f.write(msg+'\n')
			f.close()
except:
	continue

简单记了一下时间大概50秒跑完这26个页面,获取9500条数据。
代码有一点点长,放在了GitHub上 点这