首页 > 编程语言 >【爬虫实战】用python爬今日头条热榜TOP50榜单!

【爬虫实战】用python爬今日头条热榜TOP50榜单!

时间:2023-09-21 10:25:20浏览次数:35  
标签:python list 爬取 url 热榜 头条 TOP50

目录

一、爬取目标

您好!我是@马哥python说,一名10年程序猿。

今天分享一期爬虫案例,爬取的目标是:今日头条热榜的榜单数据。

打开今日头条 首页,在页面右侧会看到头条热榜,如下:
爬取目标

爬取以上6个关键字段,含:

热榜排名,热榜标题,热度值,热榜标签,热榜分类,热榜链接。

开发者模式分析:
开发者分析

二、爬取结果

爬取结果截图:
部分数据

三、代码讲解

首先,导入需要用到的库:

import requests
import pandas as pd
import re

定义一个请求头:(爬取目标较简单,一个User-agent即可)

# 请求头
h1 = {
	'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15',
}

定义请求地址:

url = 'https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc'

用requests发送请求:

# 发送请求
response = requests.get(url, headers=h1)

查看响应码并以json方式接收返回数据:

# 查看响应码
print(r.status_code)
# 接收返回数据
json_data = r.json()

定义一些空列表,用于存放数据:

title_list = []  # 热榜标题
value_list = []  # 热度值
url_list = []  # 热榜链接
category_list = []  # 热榜分类
label_list = []  # 热榜标签

以"热榜标题"字段为例:

for data in json_data['data']:
	# 热榜标题
	title = data['Title']
	print('热榜标题:', title)
	title_list.append(title)

其中,热榜链接比较特殊,接口中返回的url很长,形如:
某个热榜链接

可以看到,url中从?往后,都是不必要的请求参数。

所以,用正则表达式把?后面的全部删掉,提取出id,再进行拼接url,如下:

# 正则表达式提取出链接id
url3 = re.search(r"(?<=https:\/\/www\.toutiao\.com\/trending\/)\d+", url2).group(0)
# 拼接链接
url4 = 'https://www.toutiao.com/trending/' + str(url3)

最后,把所有字段存放的列表数据组成Dataframe格式:

# 把列表数据组装成Dataframe数据
df = pd.DataFrame(
	{
		'热榜排名': range(1, data_num + 1),  # 一共50条
		'热榜标题': title_list,
		'热度值': value_list,
		'热榜标签': label_list,
		'热榜分类': category_list,
		'热榜链接': url_list,
	}
)

进一步保存到csv文件里:

# 保存到csv文件
df.to_csv(result_file, header=True, index=False, encoding='utf_8_sig')

以上,核心逻辑讲解完毕。

代码中还含有:解析热度值、热榜标签、热榜分类、热榜链接字段等,详见文末完整代码。

四、技术总结

爬取技术流程:

  1. requests 发送请求
  2. json 解析数据
  3. re 正则表达式提取文本
  4. pandas 保存csv

五、演示视频

演示视频:代码演示:用python爬头条热榜TOP50榜单!

六、附完整源码

本案例完整源码已上传微信公众号"老男孩的平凡之路",后台回复"爬头条热榜"即可获取。 点击直达:点这里


我是@马哥python说,一名10年程序猿,持续分享python干货中!

标签:python,list,爬取,url,热榜,头条,TOP50
From: https://www.cnblogs.com/mashukui/p/toutiao_hot.html

相关文章

  • Python基本数据类型
    原文链接:https://blog.csdn.net/u013355826/article/details/78761742字符串常用方法:分片str="string"str[1:3]#"tr"#获取从偏移为1到偏移为3的字符串,不包括偏移为3的字符替换str="ThisisATest"print(str.replace("is","was")) #Thwa......
  • vscode自动格式化python代码符合pep8
    vscode自动格式化python代码符合pep8 安装格式化工具打开命令行窗口安装以下工具$pipinstall-Uflake8$pipinstall-Uautopep812在VScode配置中打开首选项–>设置,搜索python.linting.flake8enabled如果右下角跳出来让你安装的提示,点yes就可以了安装完成后VisualStudio......
  • 在 Python 中,可以使用线程池(ThreadPoolExecutor)和 wait 方法来等待线程池中的所有任务
    importconcurrent.futures#创建一个线程池withconcurrent.futures.ThreadPoolExecutor()asexecutor:#提交任务给线程池task1=executor.submit(func1,arg1)task2=executor.submit(func2,arg2)task3=executor.submit(func3,arg3)#使......
  • Python-多线程调用计算请求时间
    使用多线程调用某个方法(请求),计算每个线程消耗时间importthreadingimporttimeimportrequestsimportjsonimportconcurrent.futuresdefinput_req():url="https://xxxxxxxxxxxx"approval_content="nullain"payload=json.dumps({&quo......
  • python文件打包成exe(pyinstaller)
    参数说明-F,–onefile|打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用-D,–onedir|打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码-w,–windowed,–noconsole|使用Windows子系统执行.当程序启动的时候不会打......
  • [880] Calculate Field in ArcGIS Pro (with python code)
    Firstly,weshoulddefineafunction.defIsFlood(join_count):ifjoin_count>0:return"Yes"else:return"No"Secondly,weshouldcallthisfunctionusingtheotherfieldslike IsFlood(!Join_Count!)Here......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 饮食节点
    目录饮食数据创建节点根据疾病、症状,判断出哪些饮食不能吃,哪些建议多吃饮食数据foods_data.csv建议值用“”引起来。避免中间有,号造成误识别饮食"辣椒""大蒜""芥末""海鲜""胡萝卜""核桃仁""菠菜""西红柿""香蕉"创建节点重构代码,将defexecute_write(sel......
  • mmap:Python内存映射文件操作
    前言内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户都能很方便的直接访问内存。本篇,将详细介绍Python内存映射库:mmap。mmap(读文件)使用mmap()函数可以创建一个内存映射文件。该函数的第1个......
  • python07
    2.字符串格式化字符串格式化,使用更便捷的形式实现字符串的拼接。2.1%2.1.1基本格式化操作name="张云嘉"age=18text="我叫%s,今年%s岁"%("张云嘉",18)text="我叫%s,今年%s岁"%(name,age)text="我叫%s,今年%d岁"%(name,age)text="我叫%(name)s,今年%d岁"......
  • Python
    扫雷importrandom#游戏设置board_size=10#游戏板尺寸num_mines=10#地雷数量#创建游戏板board=[[''for_inrange(board_size)]for_inrange(board_size)]mines=set()#随机布置地雷whilelen(mines)<num_mines:x=random.randint(0,boa......