微博爬虫

本文介绍了一个使用Python实现的微博爬虫类,能够模拟登录并抓取微博评论数据。通过设置不同的参数,可以针对PC端或移动端微博链接进行数据抓取,支持自定义最大页数或抓取所有页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import re
import time
import copy
import pickle
import requests
import argparse

'''微博爬虫类'''
class weibo():
	def __init__(self, **kwargs):
		self.login_headers = {
								'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
								'Accept': '*/*',
								'Accept-Encoding': 'gzip, deflate, br',
								'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
								'Connection': 'keep-alive',
								'Origin': 'https://passport.weibo.cn',
								'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttps%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt='
							}
		self.login_url = 'https://passport.weibo.cn/sso/login'
		self.home_url = 'https://weibo.com/'
		self.headers = {
						'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
						}
		self.session = requests.Session()
		self.time_interval = 1.5
	'''获取评论数据'''
	def getComments(self, url, url_type='pc', max_page='all', savename=None, is_print=True, **kwargs):
		# 判断max_page参数是否正确
		if not isinstance(max_page, int):
			if max_page != 'all':
				raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> or <all>')
		else:
			if max_page < 1:
				raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> or <all>')
		# 判断链接类型
		if url_type == 'phone':
			mid = url.split('/')[-1]
		elif url_type == 'pc':
			mid = self.__getMid(url)
		else:
			raise ValueError('[url_type] error, weibo.getComments -> [url_type] should be <pc> or <phone>')
		# 数据爬取
		headers = copy.deepcopy(self.headers)
		headers['Accept'] = 'application/json, text/plain, */*'
		headers['MWeibo-Pwa'] = '1'
		headers['Referer'] = 'https://m.weibo.cn/detail/%s' % mid
		headers['X-Requested-With'] = 'XMLHttpRequest'
		url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'.format(mid, mid)
		num_page = 0
		comments_data = {}
		while True:
			num_page += 1
			print('[INFO]: Start to get the comment data of page%d...' % num_page)
			if num_page > 1:
				url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'.format(mid, mid, max_id, max_id_type)
			res = self.session.get(url, headers=headers)
			comments_data[num_page] = res.json()
			if is_print:
				print(res.json())
			try:
				max_id = res.json()['data']['max_id']
				max_id_type = res.json()['data']['max_id_type']
			except:
				break
			if isinstance(max_page, int):
				if num_page < max_page:
					time.sleep(self.time_interval)
				else:
					break
			else:
				if int(float(max_id)) != 0:
					time.sleep(self.time_interval)
				else:
					break
		if savename is None:
			savename = 'comments_%s.pkl' % str(int(time.time()))
		with open(savename, 'wb') as f:
			pickle.dump(comments_data, f)
		return True
	'''模拟登陆'''
	def login(self, username, password):
		data = {
				'username': username,
				'password': password,
				'savestate': '1',
				'r': 'https://weibo.cn/',
				'ec': '0',
				'pagerefer': 'https://weibo.cn/pub/',
				'entry': 'mweibo',
				'wentry': '',
				'loginfrom': '',
				'client_id': '',
				'code': '',
				'qq': '',
				'mainpageflag': '1',
				'hff': '',
				'hfp': ''
				}
		res = self.session.post(self.login_url, headers=self.login_headers, data=data)
		if res.json()['retcode'] == 20000000:
			self.session.headers.update(self.login_headers)
			print('[INFO]: Account -> %s, login successfully...' % username)
			return True
		else:
			raise RuntimeError('[INFO]: Account -> %s, fail to login, username or password error...' % username)
	'''获取PC端某条微博的mid'''
	def __getMid(self, pc_url):
		headers = copy.deepcopy(self.headers)
		headers['Cookie'] = 'SUB=_2AkMrLtDRf8NxqwJRmfgQzWzkZI11ygzEieKdciEKJRMxHRl-yj83qhAHtRB6AK7-PqkF1Dj9vq59_dD6uw4ZKE_AJB3c;'
		res = requests.get(pc_url, headers=headers)
		mid = re.findall(r'mblog&act=(\d+)\\', res.text)[0]
		return mid


if __name__ == '__main__':
	import argparse
	parser = argparse.ArgumentParser(description="weibo comments spider")
	parser.add_argument('-u', dest='username', help='weibo username', default='')
	parser.add_argument('-p', dest='password', help='weibo password', default='')
	parser.add_argument('-m', dest='max_page', help='max number of comment pages to crawl(number<int> larger than 0 or all)', default=100)
	parser.add_argument('-l', dest='link', help='weibo comment link', default='')
	parser.add_argument('-t', dest='url_type', help='weibo comment link type(pc or phone)', default='pc')
	args = parser.parse_args()
	wb = weibo()
	username = args.username
	password = args.password
	try:
		max_page = int(float(args.max_page))
	except:
		pass
	**加粗样式**url = args.link
	url_type = args.url_type
	if not username or not password or not max_page or not url or not url_type:
		raise ValueError('argument error')
	wb.login(username, password)
	wb.getComments(url, url_type, max_page)

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值