【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例
一、爬取目标
大家好,我是马哥。
今天分享一期python爬虫案例,爬取目标是新浪微博的微博数据,包含:
页码, 微博id, 微博bid, 微博作者, 发布时间, 微博内容, 转发数, 评论数, 点赞数
经过分析调研,发现微博有3种访问方式,分别是:
PC端网页:https://weibo.com/
最终决定,通过手机端爬取。
这里,给大家分享一个爬虫小技巧。当目标网站既存在PC网页端,又有手机移动端,建议爬取移动端,原因是:移动端一般网页结构简单,并且反爬能力较弱,更方便爬虫爬取。
二、展示爬取结果
我通过爬虫代码,爬取了“唐山打人”这个关键字下的前80页微博,部分数据如下:
一共635条数据,共80页,差不多每页不到10条的数据。
三、讲解代码
首先,导入需要用到的库:
import os
import re # 正则表达式提取文本
from jsonpath import jsonpath # 解析json数据
import requests # 发送请求
import pandas as pd # 存取csv文件
import datetime #
然后,定义一个转换时间字符串的函数,因为爬取到的时间戳是GMT格式(类似这种:Fri Jun 17 22:21:48 +0800 2022)的,需要转换成标准格式:
def trans_time(v_str):
"""转换GMT时间为标准格式"""
GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'
timeArray = datetime.datetime.strptime(v_str, GMT_FORMAT)
ret_time = timeArray.strftime("%Y-%m-%d %H:%M:%S")
return ret_time
定义一个请求头,后面发送请求的时候带上它,防止反爬:
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"accept-encoding": "gzip, deflate, br",
}
打开chrome浏览器,按F12进入开发者模式,按照下图操作,分析出目标请求地址:
根据分析结果,编写请求代码:
# 请求地址
url = 'https://m.weibo.cn/api/container/getIndex'
# 请求参数
params = {
"containerid": "100103type=1&q={}".format(v_keyword),
"page_type": "searchall",
"page": page
}
# 发送请求
r = requests.get(url, headers=headers, params=params)
直接用json格式,接收返回的数据:
# 解析json数据
cards = r.json()["data"]["cards"]
下面,通过jsonpath,快速解析出各个字段数据。
科普知识:jsonpath是一种快速解析json数据的方法,语法规则有点像xpath,这里就不展开讲了,
详细介绍,请见:
下面展示部分字段解析过程:
# 转发数
reposts_count_list = jsonpath(cards, '$..mblog.reposts_count')
# 评论数
comments_count_list = jsonpath(cards, '$..mblog.comments_count')
# 点赞数
attitudes_count_list = jsonpath(cards, '$..mblog.attitudes_count')
把所有的字段的list数据,拼装成DataFrame格式数据:
# 把列表数据保存成DataFrame数据
df = pd.DataFrame(
{
'页码': [page] * len(id_list),
'微博id': id_list,
'微博bid': bid_list,
'微博作者': author_list,
'发布时间': time_list,
'微博内容': text2_list,
'转发数': reposts_count_list,
'评论数': comments_count_list,
'点赞数': attitudes_count_list,
}
)
最后,通过to_csv,(记得加上参数 encoding='utf_8_sig')把数据持久化存储下来。
需要说明的是,微博数据爬取下来后,会存在少量重复数据,所以,去重处理一下:
# 删除重复数据
df.drop_duplicates(subset=['微博bid'], inplace=True, keep='first')
# 再次保存csv文件
df.to_csv(v_weibo_file, index=False, encoding='utf_8_sig')
print('数据清洗完成')
最终,数据保存完毕。
四、同步视频
4.1 演示视频
https://www.zhihu.com/zvideo/1521809935360385024
4.2 讲解视频
https://www.zhihu.com/zvideo/1521898658362155008
五、附:完整源码
附完整源码:点击这里完整源码
我是马哥,感谢您的阅读。
【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例的更多相关文章
- 简单python爬虫案例(爬取慕课网全部实战课程信息)
技术选型 下载器是Requests 解析使用的是正则表达式 效果图: 准备好各个包 # -*- coding: utf-8 -*- import requests #第三方下载器 import re ...
- [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...
- python爬虫实战---爬取大众点评评论
python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
- Python爬虫之爬取慕课网课程评分
BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...
- from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...
- Python爬虫之爬取站内所有图片
title date tags layut Python爬虫之爬取站内所有图片 2018-10-07 Python post 目标是 http://www.5442.com/meinv/ 如需在非li ...
- Python爬虫之爬取淘女郎照片示例详解
这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...
- python 爬虫之爬取大街网(思路)
由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...
- python爬虫项目-爬取雪球网金融数据(关注、持续更新)
(一)python金融数据爬虫项目 爬取目标:雪球网(起始url:https://xueqiu.com/hq#exchange=CN&firstName=1&secondName=1_ ...
- 初次尝试python爬虫,爬取小说网站的小说。
本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...
随机推荐
- Final Countdown 题解
Problem Link 简要题意 把一个数不断减一直到变成零,每个数位变化一次需要一秒. 比如 \(300\) 变成 \(299\) 需要 \(3\) 秒. 求把一个数变成零要多少秒. 思路 对于每 ...
- #三分,分治,计算几何,prim#JZOJ 3860 地壳运动
题目 \(q\)组询问查询最小生成树,边权为\(u*k1+v*k2\)(\(k1,k2\)每次询问都不同) \(n\leq 35,m\leq 25000,q\leq 200000\) 分析 纯\(\t ...
- #斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums
题目 已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示 分析 显然得到两条性质: \(f_{i+1}=f_{i-1}+f_i\) \(2f_i=f_{i+1}+f_{i-2}\) 那么 ...
- #Splay#洛谷 1486 [NOI2004]郁闷的出纳员
题目 分析 考虑加减工资直接打标记,查询第\(k\)多可以用平衡树, 删除有点恶心,这里考虑Splay,将需要删除的部分的后继splay到根节点并将左子树断边 代码 #include <cstd ...
- OpenHarmony创新赛|赋能直播第五期
OpenHarmony创新赛赋能直播课程即将再次与大家见面!本期基于之前的青蛙影院的UI界面设计的课程,介绍综合性APP的需求介绍和技术栈整合等内容.此外,课程同步赋能OpenHarmony创新赛, ...
- OpenHarmony 3.1 Release版本关键特性解析——OpenHarmony新音视频引擎——HiStreamer
OpenAtom OpenHarmony(以下简称"OpenHarmony")是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景 ...
- 战码先锋直播预告丨参与文档贡献,开启OpenHarmony社区贡献之旅
OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」(本期OpenHarmony开源贡献者计划以 ...
- Python 布尔类型
布尔值表示两个值之一:True(真)或False(假). 布尔值 在编程中,您经常需要知道一个表达式是否为True或False. 您可以在Python中评估任何表达式,并获得两个答案之一:True或F ...
- Python 中的数字类型与转换技巧
Python中有三种数字类型: int(整数) float(浮点数) complex(复数) 当您将值分配给变量时,将创建数字类型的变量: 示例:获取您自己的Python服务器 x = 1 # int ...
- 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...