使用python抓取天涯帖子,并实现“只看楼主”功能

2023-11-13

使用python抓取天涯帖子,并实现“只看楼主”功能

  在看天涯论坛时,有些帖子很有价值,想把它保存下来,可是好的帖子动辄几百页,其中又掺杂了很多灌水和撕逼,所以我编写了一个python小程序,将一个帖子中楼主所发的内容抓取下来,挺好用的。

  唯一的缺陷是图片还没法抓取,以后有空再改进。

  下面是程序代码,注释都在里面了:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 天涯帖子下载,“只看楼主”

from bs4 import BeautifulSoup
import codecs
import re
import requests
import time


# 主下载函数
def download_post(home_page, link_prefix):
    # 打开文件
    filename = 'D:/temp/post.txt'
    f = codecs.open(filename, 'w', 'utf-8')

    ########## 数据抓取 ##########
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36'}
    home_page_file = requests.get(home_page, headers=headers)
    home_page_file.encoding = 'utf-8'
    home_page_file = home_page_file.text
    soup = BeautifulSoup(home_page_file, 'html.parser')

    ########## 获取帖子总体信息,例如标题、作者、时间等 ##########
    # 帖子标题
    post_title = soup.select('h1.atl-title > span > span')[0].string.strip()
    post_info = soup.select('div.atl-info > span')
    # 帖子作者
    post_author = post_info[0].select('a')[0].string.strip()
    # 帖子时间
    post_time = post_info[1].string[3:].strip()
    f.write(u'帖子标题:' + post_title + '\r\n')
    f.write(u'帖子作者:' + post_author + '\r\n')
    f.write(u'帖子时间:' + post_time + '\r\n\r\n')
    f.write(u'#################### 我是分隔线 ####################\r\n\r\n')

    ########## 获取帖子的内容 ##########
    post_items = soup.select('div.atl-item')
    for i in range(len(post_items)):
        # 主帖,主帖和跟帖的区别是跟帖有js_username属性
        if not post_items[i].get('js_username'):
            post_content = unicode(post_items[i].select('div.bbs-content')[0])
            post_content = process_post_content(post_content)
            if post_content:
                f.write(u'  ' + post_content + '\r\n\r\n')
                f.write(u'#################### 我是分隔线 ####################\r\n\r\n')
        # 跟帖
        else:
            # 只看楼主
            if post_items[i].get('js_username') == post_author:
                post_time = post_items[i].select(
                    'div.atl-info > span')[1].string.strip()
                f.write(u'  ' + post_time + '\r\n\r\n')
                post_content = unicode(
                    post_items[i].select('div.bbs-content')[0])
                post_content = process_post_content(post_content)
                if post_content:
                    f.write(u'  ' + post_content + '\r\n\r\n')
                    f.write(
                        u'#################### 我是分隔线 ####################\r\n\r\n')

    ########## 处理翻页 ##########
    # 获取翻页链接
    next_page = soup.select('div.atl-pages > form > a.js-keyboard-next')
    while next_page:
        next_page_href = next_page[0].get('href')
        ########## 数据抓取 ##########
        home_page_file = requests.get(
            link_prefix + next_page_href, headers=headers)
        home_page_file.encoding = 'utf-8'
        home_page_file = home_page_file.text
        soup = BeautifulSoup(home_page_file, 'html.parser')
        ########## 获取帖子的内容 ##########
        post_items = soup.select('div.atl-item')
        for i in range(len(post_items)):
            # 只看楼主
            if post_items[i].get('js_username') == post_author:
                post_time = post_items[i].select(
                    'div.atl-info > span')[1].string.strip()
                f.write(u'  ' + post_time + '\r\n\r\n')
                post_content = unicode(
                    post_items[i].select('div.bbs-content')[0])
                post_content = process_post_content(post_content)
                if post_content:
                    f.write(u'  ' + post_content + '\r\n\r\n')
                    f.write(
                        u'#################### 我是分隔线 ####################\r\n\r\n')
        # 获取翻页链接
        next_page = soup.select('div.atl-pages > form > a.js-keyboard-next')

    # 关闭文件
    f.close()


# 帖子内容处理函数
def process_post_content(post_content):
    post_content = post_content.replace(
        '<div class="bbs-content clearfix">', '')
    post_content = post_content.replace('<div class="bbs-content">', '')
    post_content = post_content.replace('</div>', '')
    post_content = post_content.replace('<br/>', '\r\n')
    post_content = post_content.strip()
    return post_content


# 天涯帖子首页,每次抓取帖子前修改这个值
home_page = 'http://bbs.tianya.cn/post-worldlook-703166-1.shtml'
# 翻页时,各页面链接需要加上的前缀
link_prefix = 'http://bbs.tianya.cn'

download_post(home_page, link_prefix)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python抓取天涯帖子,并实现“只看楼主”功能 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐

  • 关于不同浏览器的内核与引擎--记录一下

    https www cnblogs com gdutbean archive 2012 02 21 2362003 html https www cnblogs com guanghe p 11719334 html js引擎介绍 几种JS
  • Docker: 改变容器化世界的革命性技术

    目录 1 1什么是虚拟化 1 2什么是Docker 1 3容器与虚拟机的比较 1 4Docker组建 2 Docker安装 2 2设置ustc的镜像 2 3Docker的启动与停止 3 docker常用命令 3 1镜像 3 2容器相关命令
  • Dockerfile参数详解

    FROM 功能为指定基础镜像 并且必须是第一条指令 如果不以任何镜像为基础 那么写法为 FROM scratch 同时意味着接下来所写的指令将作为镜像的第一层开始 语法 FROM
  • discuz 手机版伪静态

    前两天发布的这篇文章发现内容与实际情况不太相符特来更改 请多多包涵 网上有些现成的插件 价格却并不亲民 一个简简单单的伪静态插件居然标价三百 我也是醉了 我就在想 伪静态翻来覆去不就那么点东西吗 你能做我就做不了啦 在此帮各位仍有相同需求的
  • BP神经网络基本介绍

    1 主要解决的是什么问题 预测类 聚类分析 2 原理 思路是啥 什么是人工神经网络 ANN 模拟大脑对信号处理的一种算法 基本原理介绍 权关系是具体不清楚他们之间的关系 并未给出准确的对应关系 只是假设他们之间的关系可以用一组权来表示 阈值
  • 企业DevOps:实施过程中需要关注的各项要点

    作者 亚马逊云科技企业市场战略总监 Stephen Orban 经验并非凭空创造 而是依靠点滴积累所实现 阿尔贝 加缪 在此次的企业DevOps探索之旅系列文章当中 我将带大家一同探讨企业在具备一定DevOps经验之后又该如何处理下一步可能
  • BlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue原理分析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于 当队列是空的时 从队列中获取元素的操作将会被阻塞 或者当队列是满时 往队列里添加元素的操作会被阻塞 试图从空的阻塞队列中获取元素的线程将会被阻塞 直到其他的线程往空的队列插入新的元素 同样
  • MySQL数据库定时备份脚本

    bin bash 定义备份用户 密码 DbUser root DbPasswd NTQ12377 定义备份数据库 DbName zabbix jumpserver openfire n9e n9e v5 ibex 定义备份目录 Path d
  • 手把手带你编写微信公众号

    这是一个简单的项目 简单编写微信公众号 扫码关注 关注 即可提高学习效率 Peace 实时查询城市天气 回复 美女视频网站 观看美女视频 不定时推送小姐姐视频和图片合集 Docker线上部署SpringBoot 如果您不知道如何开始编写的话
  • ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候 刚开始向后台传递数据返回415 后来百度添加了 contentType application json 之后返回400 然后把传输的数据格式改为json字符串就传输成功了 现在我们来看看 contentType a
  • Keras-训练网络时的问题:loss一直为nan,accuracy一直为一个固定的数

    目录 问题描述 问题的解决 调整学习率后解决问题 其他可能导致此问题的原因 1 2 3 4 关于如何选择学习率 问题描述 在使用VGG19做分类任务时 遇到一个问题 loss一直为nan accuracy一直为一个固定的数 如下输出所示 即
  • ESP32-C3入门教程 网络 篇(三、 MQTT 协议基础介绍及测试)

    在前面 我们已经学会了 ESP32 C3 的WiFi 配置以及使用 为我们学习网络协议建立了基础 这篇文章我们就来学习测试一下ESP32 C3 的 MQTT 驱动 目录 前言 1 基础介绍 1 1 MQTT协议基本概念 1 2 ESP MQ
  • c#实现循环输入商品编号和购买数量,结账时应付金额并找零

    循环输入商品编号和购买数量 系统自动计算每种商品的价钱 单价X数量 并累加总金额 当输入n时结账 假设享受8折优惠 结账时 根据折扣计算应付金额 输入实付金额 并找零 下面展示一些 内联代码片 使用c 实现 代码如下 An highligh
  • 【数据压缩3】AVI文件格式分析及问题回答+WAV文件格式分析

    目录 AVI文件问题回答 1 AVI文件音频和视频的数据是如何放置的 交织放置还是连续放置 2 AVI文件一个视频帧大约占据多少字节 一个音频数据块大约占用多少字节 WAV文件格式分析 文件概述 文件格式 RIFF区块 FORMAT区块 D
  • 数据结构——根据后序遍历结果和中序遍历结果画出二叉树

    根据二叉树的中序和后序遍历结果画出二叉树 1 首先根据后序遍历结果判断根节点 最右边的元素 2 在中序遍历结果中找到该根节点 该节点的左边为根节点的左子树 节点右边为根节点的右子树 3 回到后序遍历中找点左子树在后序遍历中最右边的元素即为左
  • FPGA学习方向规划

    前言 仅以本帖 记录自己的学习历程及未来的方向 刚入职做FPGA研发1年 也不知道自己的发展方向 所以 从FPGA接口通信入手 慢慢学习和了解吧 希望自己逐步积累和掌握以下几个方向从业的基础知识 并具有一定的研发能力 主要方向分以下个方向
  • Binning模式缩小分辨率

    示例 640 480 NV12图像 提取Y部分数据 将Y数据做降采样 隔行隔列取值 保存成文件 include
  • React + antd实现嵌套可增减表单

    技术栈 React antd 接到需求 做一个form嵌套表单 刚开始想自己做一个 后来想着参数处理可能比较麻烦就直接用antd的Form吧 一 目标效果 先看一下效果图 其中点击新增标签及配置时可以加一个红色框里的内容 点击蓝框里的加号可
  • 将 VEDAI 遥感图像数据集转为 PASCAL VOC 格式

    PASCAL VOC 格式的 VEDAI 数据集 只有JPEGImages和Annotations 地址 所需积分 C币 0 VEDAI 数据集共有11类 类别和所对应的 label 如下表所示 类别 car truck tractor c
  • 使用python抓取天涯帖子,并实现“只看楼主”功能

    使用python抓取天涯帖子 并实现 只看楼主 功能 在看天涯论坛时 有些帖子很有价值 想把它保存下来 可是好的帖子动辄几百页 其中又掺杂了很多灌水和撕逼 所以我编写了一个python小程序 将一个帖子中楼主所发的内容抓取下来 挺好用的 唯