【python爬虫案例】爬了上千条m端微博签到数据

news2024/12/23 8:51:36

一、爬取目标

大家好,我是@马哥python说,一枚10年程序猿。

今天分享一期python爬虫案例,爬取目标是新浪微博的微博签到数据,字段包含:

页码,微博id,微博bid,微博作者,发布时间,微博内容,签到地点,转发数,评论数,点赞数

经过分析调研,发现微博有3种访问方式,分别是:

  • PC端网页:https://weibo.com/
  • 移动端:https://weibo.cn/
  • 手机端:https://m.weibo.cn/

最终决定,通过手机端爬取。

这里,给大家分享一个爬虫小技巧。当目标网站既存在PC网页端,又有手机移动端,建议爬取移动端,原因是:移动端一般网页结构简单,并且反爬能力较弱,更方便爬虫爬取。

二、展示爬取结果

通过爬虫代码,爬取了“环球影城”这个关键字下的前100页微博,部分数据如下:
爬取结果
一共翻页了100页,大概1000条左右微博。

三、讲解代码

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

import os  # 判断文件存在
import re  # 正则表达式提取文本
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浏览器,在m端网址搜索"环球影城",选择地点,选择第一条搜索结果"北京环球影城",如下:
搜索地点

获取地点对应的containerid,后面会用到,爬虫代码如下:

def get_containerid(v_loc):
    """
    获取地点对应的containerid
    :param v_loc: 地点
    :return: containerid
    """
    url = 'https://m.weibo.cn/api/container/getIndex'
    # 请求参数
    params = {
        "containerid": "100103type=92&q={}&t=".format(v_loc),
        "page_type": "searchall",
    }
    r = requests.get(url, headers=headers, params=params)
    cards = r.json()["data"]["cards"]
    scheme = cards[0]['card_group'][0]['scheme']  # 取第一个
    containerid = re.findall(r'containerid=(.*?)&', scheme)[0]
    print('[{}]对应的containerid是:{}'.format(v_loc, containerid))
    return containerid

点击第一个地点"北京环球影城",跳转到它对应的微博签到页面:
微博签到页

首先打开开发者模式,然后往下翻页,多翻几次,观察XHR页面的网络请求:
开发者分析

根据分析结果,编写请求代码:

# 请求地址
url = 'https://m.weibo.cn/api/container/getIndex'
# 请求参数
params = {
    "containerid": containerid,
    "luicode": "10000011",
    "lcardid": "frompoi",
    "extparam": "frompoi",
    "lfid": "100103type=92&q={}".format(v_keyword),
    "since_id": page,
}

其中,since_id每次翻页+1,相当于页码数值。
请求参数,可以在Payload页面获取:
请求参数
下面开始发送请求并解析数据:

# 发送请求
r = requests.get(url, headers=headers, params=params)
print(r.status_code)  # 查看响应码
# 解析json数据
try:
    card_group = r.json()["data"]["cards"][0]['card_group']
except:
    card_group = []
定义一些空列表,用于后续保存数据:
time_list = []  # 创建时间
author_list = []  # 微博作者
id_list = []  # 微博id
bid_list = []  # 微博bid
text_list = []  # 博文
text2_list = []  # 博文2
loc_list = []  # 签到地点
reposts_count_list = []  # 转发数
comments_count_list = []  # 评论数
attitudes_count_list = []  # 点赞数

以"微博博文"为例,展示代码,其他字段同理,不再赘述。

# 微博博文
text = card['mblog']['text']
text_list.append(text)

把所有数据保存到Dataframe里面:

# 把列表数据保存成DataFrame数据
df = pd.DataFrame(
    {
        '页码': page,
        '微博id': id_list,
        '微博bid': bid_list,
        '微博作者': author_list,
        '发布时间': time_list,
        '微博内容': text2_list,
        '签到地点': loc_list,
        '转发数': reposts_count_list,
        '评论数': comments_count_list,
        '点赞数': attitudes_count_list,
    }
)

最终,把所有数据保存到csv文件:

# 表头
if os.path.exists(v_weibo_file):
    header = False
else:
    header = True
# 保存到csv文件
df.to_csv(v_weibo_file, mode='a+', index=False, header=header, encoding='utf_8_sig')
print('csv保存成功:{}'.format(v_weibo_file)))

说明一下,由于每次保存csv都是追加模式(mode=‘a+’),所以加上if判断逻辑:

如果csv存在,说明不是第一次保存csv,不加表头;
如果csv不存在,说明是第一次保存csv,加上表头。

如此,可避免写入多次表头的尴尬局面。

整个代码中,还含有:正则表达式提取博文、爬取展开全文、从博文中提取签到地点、数据清洗(删除空数据、去重复)等功能,详细请见原始代码。

四、同步视频

演示视频:https://www.bilibili.com/video/BV1Pj411K7Xr/

五、同步公号

首发公号:【python爬虫案例】爬了上千条m端微博签到数据!


您好,我是@马哥python说,全网累计粉丝数万,欢迎一起交流python技术!

各平台搜索 马哥python说,获取完整源码:知乎、哔哩哔哩、博客园、稀土掘金、51CTO、小红书、新浪微博。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sphinx——Python生成API文档

1、简介 Sphinx是Python文档生成器,它基于reStructuredText标记语言,可自动根据项目生成HTML,PDF等格式的文档,无数著名项目的文档均用Sphinx生成,如机器学习库scikit-learn、交互式神器Jupyter Notebook sphinx是一…

k8s ingress (二)

k8s ingress (二) Ingress介绍 在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口&#xff0…

常见的时序数据库

1.概念 时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息…

【高危】Apache Airflow Spark Provider 任意文件读取漏洞 (CVE-2023-40272)

漏洞描述 Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spark作业。 受影响版本中,在JDBC连接时,由于没有对conn_prefix参数做验证,允许输入"?"来指定参数。攻击者…

uniapp微信小程序点击右上角菜单分享功能权限配置

个人项目地址: SubTopH前端开发个人站 (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站…

vite 项目搭建

1. 创建 vite 项目 npm create vite@latest 2. 安装sass/less ( 一般我使用sass ) cnpm add -D sasscnpm add -D less 3. 自动导入 两个插件 使用之后,不用导入vue中hook reactive ref cnpm install -D unplugin-vue-components unplugin-auto-import 在 vite.config.…

关闭浏览器窗口弹出提示框(vue项目)

<script> export default {name: App,mounted() { //开发环境不需要提示if (process.env.NODE_ENV development) returnthis.$nextTick(() > {window.addEventListener(beforeunload, this.beforeUnload)})},beforeDestroy() {if (process.env.NODE_ENV development…

手机自动无人直播,实景无人直播真的有用吗?

继数字人直播之后&#xff0c;手机自动直播开始火热了起来&#xff0c;因为其门槛低&#xff0c;成本低&#xff0c;一部手机一个账号就可以实现直播&#xff0c;一时深受广大商家的好评。那么&#xff0c;手机自动无人直播究竟是如何实现自动直播的呢&#xff1f; 在传统的直…

从零做软件开发项目系列之三——系统设计

前言 在与客户充分接触后取得需求调研结果&#xff0c;然后分析调研内容&#xff0c;撰写完成项目的需求规格说明书。这是一个正式的文件&#xff0c;需要供需双方签字确认。说明书中会明确需求方的要求和开发方实现的内容&#xff0c;依据需求规格说明书&#xff0c;开发方就…

uniapp踩坑合集

1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true&#xff0c;开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…

数据结构与算法:计算机科学的基石

文章目录 数据结构&#xff1a;构建数据的框架算法&#xff1a;问题的解决方案编程语言&#xff1a;实现数据结构的工具结论 &#x1f389;欢迎来到数据结构学习专栏~数据结构与算法&#xff1a;计算机科学的基石 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

Arduino之esp8266

今天&#xff0c;捣鼓了Arduino和esp8266,发现有两款比较好的软件&#xff08;Arduino IDE以及Mixly软件&#xff09;可以将程序下载至esp8266中&#xff0c;而且两者的编程语言都是一样的&#xff0c;都是基于Arduino编程语言&#xff0c;只不过一个Mixly更注重图形编程&#…

芯片验证板卡设计原理图:446-基于VU440T的多核处理器多输入芯片验证板卡

基于VU440T的多核处理器多输入芯片验证板卡 一、板卡概述 基于XCVU440-FLGA2892的多核处理器多输入芯片验证板卡为实现网络交换芯片的验证&#xff0c;包括四个FMC接口、DDR、GPIO等&#xff0c;北京太速科技芯片验证板卡用于完成甲方的芯片验证任务&#xff0c;多任务…

Pandas基础知识

文章目录 Pandas的数据结构Series --- 由数据和索引组成&#xff08;索引&#xff08;index&#xff09;在左&#xff0c;数据&#xff08;values&#xff09;在右&#xff09;DataFrame --- 索引包括行索引和列索引&#xff0c;每列数据可以是不同的类型 Pandas的索引操作 ---…

Vue路由(详解)

目录 路由原理 路由到底有什么作用&#xff1f; 路由安装和使用&#xff08;vue2&#xff09; 路由跳转 跳转实例&#xff1a; 路由的传值和取值 传值实例&#xff1a; 查询参和路由参的区别&#xff1a; 嵌套路由 嵌套实例&#xff1a; 路由守卫 守卫实例&#xff1…

计算机毕业设计源码-基于java+springboot+vue开发的短视频播放系统-lw

参考源码 文章目录 前言一、项目运行环境配置二、主要技术javaMysql数据库JSP技术B/S结构 三、系统设计四、功能截图总结 前言 随着社会的不断发展与进步&#xff0c;21世纪的今天&#xff0c;人们对信息科学的认识已由低层次向高层次发展&#xff0c;从感性认识逐渐提高到理…

【LeetCode】复写零

复写零 题目描述算法描述编程代码 链接: 复写零 题目描述 算法描述 编程代码 class Solution { public:void duplicateZeros(vector<int>& arr) {int n arr.size();int dest -1,cur 0;while(cur < n){if(arr[cur]){dest;}else{dest2;}cur;if(dest > n-1){…

【SpringSecurity】一、SpringSecurity入门

文章目录 1、背景2、相关概念3、Java安全框架的实现4、入门案例4、使用配置文件配置用户名和密码5、基于内存的多用户管理 1、背景 新建个SpringBoot工程&#xff0c;写三个controller&#xff0c;里面有三个接口&#xff1a; //学生 RestController RequestMapping("/s…

ORB-SLAM系列算法演进

ORB-SLAM算法是特征点法的代表&#xff0c;当前最新发展的ORB-SLAM3已经将相机模型抽象化&#xff0c;适用范围非常广&#xff0c;虽然ORB-SLAM在算法上的创新并不是很丰富&#xff0c;但是它在工程上的创新确实让人耳目一新&#xff0c;也能更好的为AR、机器人的算法实现落地。…