1.背景介绍
随着社交媒体的广泛应用,微博上的海量数据成为了很多研究和分析的重要信息源。为了方便获取微博的相关内容,本文将介绍如何使用Python编写一个简单的爬虫脚本,从微博中抓取指定关键词的相关数据,并将这些数据保存为Excel文件。本文将以关键词“樊振东”为例,展示从微博抓取该关键词相关数据的全过程。
废话不多说,先上结果图。
2. 项目实现思路
该爬虫通过向微博的搜索接口发送HTTP请求,获取与指定关键词相关的微博数据,并使用BeautifulSoup进行网页解析,将解析后的数据存储到Pandas DataFrame中,最后保存为Excel文件。整个项目分为以下几个步骤:
- 设置请求头信息和cookie,模拟浏览器访问;
- 根据指定日期范围抓取每天的微博内容;
- 解析网页,提取发布者、内容、转发数、评论数、点赞数等信息;
- 将数据存储为Excel文件(可根据自己的需求更换保存格式)
3.代码
1.导入相关的包,设置headers参数(cookies参数需要更改成自己浏览器的cookies);
import datetime
from time import sleep
import pandas as pd
import requests
from bs4 import BeautifulSoup
import copyheaders
# 模拟请求头,设置cookie等信息
headers = copyheaders.headers_raw_to_dict(b"""
Cookie:SCF=AryfLlAySr5dtuzHiOK7FmpLA_PYzO6fAyNLqHX07u0nVChBj3WtMAFGmado-IlJWOnJkTquNJuxX8pMuh_x4Wk.;
SUB=_2A25LrZcaDeRhGeBH4lIV-SrLzzqIHXVowpbSrDV8PUNbmtB-LUTWkW9NQbWyO1B36EDQGBy28OXoMRu67OFLhiMO;
SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWQ9A123FRnzhjZaYxL0RDv5NHD95Qc1K.7Sh.XS0BcWs4Dqcjci--fi-2Xi-24i--RiK.0iKL2i--RiKn4i-zEi--NiKLWiKnXi--4iK.fiKLhi--fi-82iK.7;
ALF=02_1725002826;
WBPSESS=kp-mRCDleWeLlB7ocAtWjgJpLwY-7s0o28OfmKxGr-vVEN9zU_M04E2V7vR8bHNGUkdOr1fGGH2XEMAup-6R2PDUjOcXLxlhRMq6F6VcYF67rgcxegC8hR0n0X1josnpQ9N0k5rdHLY5-sDsM0MxWw==;
XSRF-TOKEN=CWIcgDBSCGTzTuU1RDrnF-lT
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0
""")
2.设置关键词以及爬取时间范围,并将日期转换为标准格式;
# 设置关键词、起始日期和截止日期
keywords = "樊振东"
initial_time = '2024-07-26'
deadline = '2024-08-06'
data = [] # 用于存储爬取到的数据
date_list = []
frequency = 0
# 生成日期列表
new_time = datetime.datetime.strptime(initial_time, "%Y-%m-%d")
date = initial_time
while date <= deadline:
date_list.append(date)
new_time = new_time + datetime.timedelta(1)
date = new_time.strftime("%Y-%m-%d")
3.解析数据并保存;
for page in range(1, int(pages) + 1):
sleep(1) # 防止被封禁,设置爬取间隔
new_url = f'https://s.weibo.com/weibo?q={keywords}&typeall=1&suball=1×cope=custom%3A{time}-0%3A{time}-23&Refer=g&page={page}'
new_th = requests.get(url=new_url, headers=headers).text
knapsack = BeautifulSoup(new_th, 'lxml')
data_list = knapsack.find_all('div', class_="card")
no = knapsack.find('div', class_="card card-no-result s-pt20b40")
# 解析每一条微博信息
if no is None:
for i in data_list:
dic = {}
try:
dic['发布者id'] = i.find('div', class_="info").find('a', target="_blank").text
itme = str(i.find('div', class_="from").text).replace('\n', '').replace(' ', '').replace('来自', '').split('\xa0')
dic['发布时间'] = itme[0]
dic['出处'] = itme[1]
dic['转发数'] = str(i.find_all('a', class_="woo-box-flex woo-box-alignCenter woo-box-justifyCenter")[-3].text).replace(' ', '')
dic['点赞数'] = str(i.find_all('span', class_="woo-like-count")[-1].text).replace(' ', '')
dic['评论数'] = str(i.find_all('a', class_="woo-box-flex woo-box-alignCenter woo-box-justifyCenter")[-2].text).replace(' ', '')
txt = str(i.find('p', class_="txt").text).replace('\n', '').replace(' ', '').replace('\u200b', '').replace('收起', '')
dic["内容"] = txt
frequency += 1
data.append(dic)
except Exception as e:
break
# 数据保存到Excel
df = pd.DataFrame(data)
df.to_excel(f'{keywords}.xlsx', index=False)
4.代码说明
大家给以根据自己的需求更改代码;
有问题联系zx_luckfe;
版权归原作者 才华是浅浅的耐心 所有, 如有侵权,请联系我们删除。