您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python中怎么利用requests爬取百度贴吧用户信息
## 目录
1. [前言](#前言)
2. [准备工作](#准备工作)
- [环境配置](#环境配置)
- [分析目标](#分析目标)
3. [基础爬虫实现](#基础爬虫实现)
- [获取网页内容](#获取网页内容)
- [解析用户信息](#解析用户信息)
4. [高级技巧](#高级技巧)
- [处理分页](#处理分页)
- [应对反爬机制](#应对反爬机制)
5. [数据存储](#数据存储)
- [CSV文件存储](#csv文件存储)
- [数据库存储](#数据库存储)
6. [完整代码示例](#完整代码示例)
7. [注意事项](#注意事项)
8. [总结](#总结)
---
## 前言
百度贴吧作为中文互联网最大的社区平台之一,蕴含大量用户生成内容。通过Python的requests库爬取用户信息,可以帮助进行社交网络分析、用户行为研究等。本文将详细介绍如何从零开始构建一个贴吧用户信息爬虫。
---
## 准备工作
### 环境配置
```python
# 所需库安装
pip install requests beautifulsoup4 lxml pandas
requests
:网络请求库beautifulsoup4
:HTML解析库lxml
:解析器(比Python内置解析器更快)pandas
:数据存储处理以”李毅吧”为例,我们需要获取: 1. 用户昵称 2. 发帖时间 3. 发帖内容 4. 用户等级 5. 发帖IP属地(2022年后新增字段)
打开浏览器开发者工具(F12),观察贴吧页面的网络请求:
关键发现:
- 数据通过异步接口加载
- 用户信息包含在data-content
属性中
- 分页参数为pn
import requests
from bs4 import BeautifulSoup
def get_page(page_num):
url = f"https://tieba.baidu.com/f?kw=李毅&pn={(page_num-1)*50}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response.encoding = 'utf-8'
return response.text
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
def parse_user_info(html):
soup = BeautifulSoup(html, 'lxml')
posts = soup.find_all('div', class_='threadlist_bright')
user_data = []
for post in posts:
try:
author = post.find('a', class_='frs-author-name').text.strip()
level = post.find('span', class_='frs-author-level').text.strip()
content = post.find('div', class_='threadlist_abs').text.strip()
time = post.find('span', class_='threadlist_reply_date').text.strip()
# 2023年新增IP属地解析
ip_loc = post.find('span', class_='ip_loc').text if post.find('span', class_='ip_loc') else '未知'
user_data.append({
'author': author,
'level': level,
'content': content,
'time': time,
'ip_location': ip_loc
})
except AttributeError as e:
print(f"解析出错: {e}")
continue
return user_data
def crawl_multiple_pages(start_page, end_page):
all_data = []
for page in range(start_page, end_page+1):
print(f"正在爬取第{page}页...")
html = get_page(page)
if html:
page_data = parse_user_info(html)
all_data.extend(page_data)
time.sleep(2) # 礼貌性延迟
return all_data
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Referer": "https://tieba.baidu.com/",
"Cookie": "你的登录Cookie(如需)"
}
proxies = {
'http': 'http://12.34.56.78:8888',
'https': 'https://12.34.56.78:8888'
}
response = requests.get(url, headers=headers, proxies=proxies)
try:
response = requests.get(url, timeout=10)
if response.status_code == 403:
print("触发反爬,需要更换IP或Cookie")
elif '验证码' in response.text:
print("需要人工干预验证码")
except requests.exceptions.Timeout:
print("请求超时")
import pandas as pd
def save_to_csv(data, filename):
df = pd.DataFrame(data)
df.to_csv(filename, index=False, encoding='utf_8_sig')
import sqlite3
def save_to_db(data, db_name='tieba_users.db'):
conn = sqlite3.connect(db_name)
c = conn.cursor()
# 创建表
c.execute('''CREATE TABLE IF NOT EXISTS users
(author TEXT, level TEXT, content TEXT, time TEXT, ip_location TEXT)''')
# 批量插入
to_insert = [(d['author'], d['level'], d['content'], d['time'], d['ip_location'])
for d in data]
c.executemany("INSERT INTO users VALUES (?,?,?,?,?)", to_insert)
conn.commit()
conn.close()
# tieba_spider.py
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import sqlite3
class TiebaSpider:
def __init__(self, tieba_name):
self.tieba_name = tieba_name
self.base_url = f"https://tieba.baidu.com/f?kw={tieba_name}"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
def get_page(self, page_num):
url = f"{self.base_url}&pn={(page_num-1)*50}"
try:
response = requests.get(url, headers=self.headers)
response.raise_for_status()
return response.text
except Exception as e:
print(f"Error fetching page {page_num}: {e}")
return None
def parse_page(self, html):
# 解析逻辑同上
pass
def run(self, start_page=1, end_page=5):
all_data = []
for page in range(start_page, end_page+1):
print(f"Crawling page {page}...")
html = self.get_page(page)
if html:
all_data.extend(self.parse_page(html))
time.sleep(1.5)
return all_data
if __name__ == "__main__":
spider = TiebaSpider("李毅")
data = spider.run(1, 3)
pd.DataFrame(data).to_csv("liyi_users.csv", index=False)
法律合规性
技术限制
道德规范
通过本文我们实现了: 1. 使用requests获取贴吧页面 2. 用BeautifulSoup解析用户信息 3. 处理分页和反爬措施 4. 多种数据存储方式
进阶方向: - 使用Scrapy框架提高效率 - 结合Selenium处理动态内容 - 构建分布式爬虫系统 - 进行用户社交网络图谱分析
最后提醒:技术应当用于正当用途,请在法律和道德框架内合理使用爬虫技术。 “`
注:实际使用时需要: 1. 替换示例中的图片链接为真实截图 2. 根据最新贴吧页面结构调整解析逻辑 3. 添加更完善的异常处理 4. 建议先小规模测试再扩大爬取范围
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。