python中怎么利用requests爬取百度贴吧用户信息

发布时间:2021-07-06 14:37:03 作者:Leah
来源:亿速云 阅读:288
# Python中怎么利用requests爬取百度贴吧用户信息

## 目录
1. [前言](#前言)
2. [准备工作](#准备工作)
   - [环境配置](#环境配置)
   - [分析目标](#分析目标)
3. [基础爬虫实现](#基础爬虫实现)
   - [获取网页内容](#获取网页内容)
   - [解析用户信息](#解析用户信息)
4. [高级技巧](#高级技巧)
   - [处理分页](#处理分页)
   - [应对反爬机制](#应对反爬机制)
5. [数据存储](#数据存储)
   - [CSV文件存储](#csv文件存储)
   - [数据库存储](#数据库存储)
6. [完整代码示例](#完整代码示例)
7. [注意事项](#注意事项)
8. [总结](#总结)

---

## 前言

百度贴吧作为中文互联网最大的社区平台之一,蕴含大量用户生成内容。通过Python的requests库爬取用户信息,可以帮助进行社交网络分析、用户行为研究等。本文将详细介绍如何从零开始构建一个贴吧用户信息爬虫。

---

## 准备工作

### 环境配置

```python
# 所需库安装
pip install requests beautifulsoup4 lxml pandas

分析目标

以”李毅吧”为例,我们需要获取: 1. 用户昵称 2. 发帖时间 3. 发帖内容 4. 用户等级 5. 发帖IP属地(2022年后新增字段)

打开浏览器开发者工具(F12),观察贴吧页面的网络请求:

python中怎么利用requests爬取百度贴吧用户信息

关键发现: - 数据通过异步接口加载 - 用户信息包含在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

应对反爬机制

  1. 请求头伪装
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
    "Referer": "https://tieba.baidu.com/",
    "Cookie": "你的登录Cookie(如需)"
}
  1. IP代理池
proxies = {
    'http': 'http://12.34.56.78:8888',
    'https': 'https://12.34.56.78:8888'
}
response = requests.get(url, headers=headers, proxies=proxies)
  1. 异常处理增强
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("请求超时")

数据存储

CSV文件存储

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. 法律合规性

    • 遵守《网络安全法》和《数据安全法》
    • 不爬取个人隐私信息
    • 控制请求频率(建议≥2秒/请求)
  2. 技术限制

    • 百度对未登录用户限制150页访问
    • 2023年后需要处理新版页面结构
    • 部分内容需要登录才能查看
  3. 道德规范

    • 不得将数据用于商业牟利
    • 尊重用户隐私权
    • 在显著位置声明数据来源

总结

通过本文我们实现了: 1. 使用requests获取贴吧页面 2. 用BeautifulSoup解析用户信息 3. 处理分页和反爬措施 4. 多种数据存储方式

进阶方向: - 使用Scrapy框架提高效率 - 结合Selenium处理动态内容 - 构建分布式爬虫系统 - 进行用户社交网络图谱分析

最后提醒:技术应当用于正当用途,请在法律和道德框架内合理使用爬虫技术。 “`

注:实际使用时需要: 1. 替换示例中的图片链接为真实截图 2. 根据最新贴吧页面结构调整解析逻辑 3. 添加更完善的异常处理 4. 建议先小规模测试再扩大爬取范围

推荐阅读:
  1. Python如何基于requests库爬取网站信息
  2. python3中requests库怎么实现多图片爬取

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python requests

上一篇:Python中怎么定时执行网站爬虫

下一篇:如何使用vue2.0实现级联选择器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》