用python爬取贴吧数据

用python爬取贴吧数据

有时会逛贴吧,看故事,看别人侃大山,
但是一页一页翻费劲啊;
又没有按回复量排序的功能(实验功能根本不能用!),ಥ_ಥ…

这促使我写了个python爬虫,爬取点击量超过某个阈值的帖子。
自身需求绝对是学习的第一动力。
虽然代码量不大,但有效地解决了问题,
看到成果出来,心中好像有泉水汩汩涌出~

spring


实现思路很简单,
用python模拟浏览器发送get请求,
从返回的信息中提取点击量高的帖子,
以上两步循环若干次,
再将最终结果转为pandas对象,
然后可以导出到Excel,
就完成啦~

用到的python包有requestsBeautifulSouppandas,官网有详细用例。

代码如下:

# 导入需要的包
import time

# 模拟http请求 和 解析内容 的包
import requests
from bs4 import BeautifulSoup

# 数据展示 的包
import numpy as np
import pandas as pd
# 设置点击量阈值
M = 3000

# get请求模版
template_url = "https://tieba.baidu.com/f?kw=%E5%BF%83%E7%90%86%E5%AD%A6&ie=utf-8&pn={}"

{ }为占位符,方便发送不同页面(第n页)的请求。

# 从一页中提取 帖子
def extra_from_one_page(page_lst):
    '''从一页中提取 帖子'''
    # 临时列表保存字典数据,每一个帖子都是一个字典数据
    tmp = []

    for i in page_lst:
        # 判断是否超过阈值
        if int(i.find(class_='threadlist_rep_num').text) > M:
            dic = {}
            # 点击量
            dic['num'] = int(i.find(class_='threadlist_rep_num').text)
            # 帖子名称
            dic['name'] = i.find(class_='threadlist_title').text
            # 帖子地址
            dic['address'] = 'https://tieba.baidu.com' + i.find(class_='threadlist_title').a['href']

            tmp.append(dic)

    return tmp

以上 class name 是基于对贴吧html页面结构的观察而定的。(方法:在浏览器中打开控制台仔细观察)

# 爬取n页的数据
def search_n_pages(n):
    '''爬取n页数据'''
    target = []

    # 发起n次的get请求
    for i in range(n):
        # 跟踪进度
        print('page:', i)

        # 按照浏览贴吧的自然行为,每一页50条
        target_url = template_url.format(50*i)
        res = requests.get(target_url)

        # 转为 bs 对象
        soup = BeautifulSoup(res.text, 'html.parser')

        # 获取该页帖子列表
        page_lst = soup.find_all(class_='j_thread_list')

        # 该页信息保存到target
        target.extend(extra_from_one_page(page_lst))

        # 休息0.2秒再访问,友好型爬虫
        time.sleep(0.2)


    return target

功能主体实现完毕,下面以十分活跃的心理学吧为例,进行展示。

# 爬取贴吧前200页数据
d = search_n_pages(200)

我电脑的运行时间:
CPU times: user 40.4 s, sys: 496 ms, total: 40.9 s
Wall time: 5min 5s

# 转化为pandas.DataFrame对象
data = pd.DataFrame(d)

# 导出到excel表格
data.to_excel('心理学-贴吧.xlsx')

这里写图片描述

得到结果之后就可以想个哪个点哪个了,节省了很多人工检索的时间~

猜你喜欢

转载自blog.csdn.net/guo_ya_nan/article/details/79996718