免登陆账号快速大批量获取微博发布者的身份标签(代码可复用免费自取)
来自: poet
用前必读
声明:代码主要是个人原创,经反复重构、修改而来,转发请注明来源。另外,我是一个社科背景的学生,代码基础很差,此代码为chatgpt、个人、网友三者代码的合力之作,“能跑就行”是我的宗旨,本文面向几乎无爬虫基础的小白,请各位大佬对代码提意见手下留情。如果你是小白,要大胆利用Chatgpt,以下的代码随时间流逝很可能会出现不适配的情况而报错,希望有点耐心用AI帮你debug。
本代码能解决的问题
如果你已经爬取到了N条的微博,想要获取这N条微博发布者属于什么身份,比如政府机关、高校、媒体、普通个人、大V等。那么,参考我的这段代码,大概率可以帮你完成目标,或者通过简单的修改也可以实现。
代码的原理是运用Selenium控制浏览器模拟人的搜索动作,所以优势在于三点:1、不会像request方法一样那么容易触发反爬;2、不用登陆你的账号,不用放Cookies,这样也防止被封IP;3、经过本人利用Chatgpt改进代码,速度已经非常快了,短时间可获取大批量数据;4、免费
使用此代码的必备条件(数据、工具)
这一部分请务必仔细阅读,否则无法运用代码!
必备条件1(数据):你必须拥有一个csv格式的文件,列名是:“weibo_link”,然后是像如下格式(PC而非手机端)微博的链接。
如果你没有上述数据,那么我建议你参考我之前写的这篇文章,利用他人写好的工具爬取即可,亲测全网最好用的爬虫代码之一: 分享一位博主,可解决微博、小红书、B站等多平台多功能爬虫(亲测好用) (douban.com)
必备条件2(专用工具):你必须安装了ChromeDriver,安装教程可通过浏览器搜索,比较简单。
必备条件3(基础工具):你必须安装了能运行python代码的程序,并且具备代码中需要具备的库。
代码部分
代码原理(必看)
这一部分必须仔细阅读,这样才能会用代码,知道你在做什么!
你首先需要读懂微博的链接。下面这是一个微博的链接,是你需要准备的数据。
https://weibo.com/1739574804/IocxJdu3X
其中,第一个/后面的数字,如 1739574804这一段,就是微博发布者的个人ID码。
下面这个链接,就是上面这个微博所属发布者的个人信息界面
https://weibo.com/ajax/profile/info?uid=1739574804
如果你把上面的链接输入网址,就会出现以下界面:
看一些关键字段,screen_name是用户名, followers_count代表粉丝数,等等,可以自己去琢磨,也可以批量爬取很多其他信息。
verified为false代表用户没有认证, verified为true代表用户认证加V了 。verified type是关键,每一个对应的数字代表着一个不同的身份。
大概是: verified type为-1代表未认证加V的个人普通用户,verified type为0代表是个人身份的大V,verified type为1代表是政府机关事业单位等, verified type为2一般代表企业和民间社会组织, verified type为3一般代表媒体, verified type为7一般是新浪自己的账号如新浪新闻、新浪影视这些......还有一些如220我也不知道代表啥,感觉就是普通个人
至于每一个 verified type的数字代表什么含义,是我自己归纳出来的,并没有一个官方的手册,但是大概是这样的,基本可用,不放心可以自己多调几个微博发布者自己看看。
其实,代码原理很简单,就是把你获取到的每个微博链接中间“/”里的一串数字,放到“https://weibo.com/ajax/profile/info?uid=”后面,出来一个代表这个微博发布者信息的一个网页,再进一步解析网页提取数据就好。只是这个过程,通过你安装了ChromeDriver之后,就可以让电脑代替你的手自动化打开一个个链接了。
代码第一部分
这一部分为导入库,定义几个关键函数,为代码主体部分。可根据你的需要修改。
import time
import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
import os
import csv
def get_verified_type(url, uid, driver):
try:
# 打开网页
driver.get(url)
# 等待页面加载
time.sleep(0.1)
# 获取页面源代码
html = driver.page_source
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html, 'html.parser')
# 检查是否触发了反爬机制
if '个人注册' in soup.text:
print(f"触发了反爬机制,被反爬用户的id:{uid},请求的网址url:{url}")
time.sleep(1)
return 'skipped', None
if '该账号内容存在风险' in soup.text or '该账号因被投诉违反' in soup.text:
print(f"该用户可能已不存在,用户id:{uid}")
return 'skipped', None
# 从HTML中提取JSON字符串
json_str = soup.body.pre.string
# 解析JSON数据
try:
data = json.loads(json_str)
except json.JSONDecodeError:
print("无法解析JSON")
return 'error', None
# 查找并返回verified_type字段
if 'verified_type' in data['data']['user']:
verified_type = data['data']['user']['verified_type']
else:
verified_type = None
return verified_type, html
except Exception as e:
print(f"发生错误: {e}")
return 'error', None
def process_url(row, driver):
user_verification_type = row['用户认证类型']
#将'error'值替换为空字符串
if user_verification_type == 'error':
row['用户认证类型'] = ''
if user_verification_type in ['']:
uid = row['wid']
url = f'https://weibo.com/ajax/profile/info?uid={uid}' # 将uid添加到url中
verified_type, html = get_verified_type(url, uid, driver)
if verified_type == 'skipped':
return row
row['用户认证类型'] = verified_type
if html is not None:
row['html'] = html # 新增的html列
return row
def process_csv(input_file):
max_errors = 100 # 你可以根据需要修改这个值
errors = 0
while errors < max_errors:
try:
with open(input_file, encoding='utf-8_sig') as f:
reader = csv.DictReader(f)
rows = [row for row in reader] # 获取数据
# 初始化计数器
count = 0
# 获取输入文件的文件名和目录
input_dir, input_filename = os.path.split(input_file)
# 创建输出文件的文件名
output_filename = input_filename
# 创建输出文件的完整路径
output_file = os.path.join(input_dir, output_filename)
# 静默运行webdriver
chrome_options = Options()
chrome_options.add_argument("--headless") # 使用无头模式
driver = webdriver.Chrome(service=Service(r'C:\\Users\\12297\\chromedriver-win64\\chromedriver.exe'), options=chrome_options)
for i, row in enumerate(rows):
user_verification_type = row['用户认证类型']
if user_verification_type == '' :
uid = row['wid']
url = f'https://weibo.com/ajax/profile/info?uid={uid}' # 将uid添加到url中
row = process_url(row, driver)
# 更新计数器
count += 1
print(f"\r正在处理第{count}个URL。", end="")
# 每处理50个数据,就将结果写入CSV文件
if count % 50 == 0:
with open(output_file, 'w', newline='', encoding='utf-8_sig') as f:
fieldnames = reader.fieldnames + ['html'] #在fieldnames中添加'html'
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(rows) # 将结果写入CSV文件
# 处理完所有的URL后,将所有结果写入CSV文件
with open(output_file, 'w', newline='', encoding='utf-8_sig') as f:
fieldnames = reader.fieldnames + ['html'] #在fieldnames中添加'html'
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(rows) # 将结果写入CSV
print("你的代码正在运行...")
driver.quit()
break # 如果代码成功运行,跳出循环
except Exception as e:
errors += 1
print(f"出现错误: {e},正在重新运行...")
if errors == max_errors:
print(f"错误次数已达到最大值({max_errors}次),代码已停止运行。")
注意!这里使用了静默模式运行 webdriver ,如果不想静默,对相应段落注释代码利用Chatgpt修改即可。
代码第二部分
输入前文必备条件的CSV文件,即可运行代码。将你的文件路径在下面代码第一行替换掉。
filename0=r'C:/Users/12297/python学习/python数据分析/非典项目/新毕业论文代码及文件储存位置/解析微博详情/2020/转发节点爬取/split_0.csv'
process_csv(filename0)
运行出来的结果是,html所有的信息都被存在了csv文件新的html列里,找到 verified type 后面的结果即可。这一步可以进一步运用代码批量提取出来,也可以利用excel函数自己提取出来。
代码在两个月前跑起来是没问题的,如果大家实在解决不了问题,可以后台私戳我!重申一遍,我是菜鸡,纯文科生鼓捣代码,代码是东拼西凑出来的,但是思路可参考。
祝大家学业顺利!!!
你的回应
回应请先 登录 , 或 注册相关内容推荐
最新讨论 ( 更多 )
- 找到了!最全的民国期刊报纸数据库汇编 (苏格拉底大王)
- 免登陆账号快速大批量获取微博发布者的身份标签(代码可复用... (poet)
- 远程办公,效率高了还是低了? (苏格拉底大王)
- LDA主题聚类详细实现步骤 (南山不语)
- patchwork: 使用R语言排列多个图片 (苏格拉底大王)