`
oaklet
  • 浏览: 107643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

文本处理学习笔记2

阅读更多
环境情况如下:
python-2.5.2

Python在文本处理方面很有特色,
用的时候书写自然,编写快速,处理速度也凑和。
下面是准备实现一个抓帖小工具,抓谁呢?
抓天涯吧,人气还行,只看楼主功能还收费。

python代码(CrawlerTianYa.py):
# coding:gbk

import os
import sys
import urllib
import sgmllib

escape_str = """!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\t\r\n"""

class TitleCrawler(sgmllib.SGMLParser):
    def __init__(self, url_str):
        sgmllib.SGMLParser.__init__(self)
        self.url_prefix = url_str.rsplit("/", 1)[0]
        self.url_dict = {}
        self.url_list = []
        self.url_pre = None
    def reset(self):
        sgmllib.SGMLParser.reset(self)
        self.writer_name = ""
        self.writer_reach = False
        self.topic_name = ""
        self.topic_reach = False
        self.vdata = []
    def start_a(self, attrs):
        for k, v in attrs:
            if k != "href":
                continue
            if not self.writer_name and "Listwriter.asp?vwriter=" in v:
                self.writer_reach = True
            if "ArticlesList.asp?stritem=" in v:
                self.topic_reach = True
                self.vdata.append(self.vdata_temp)
            if self.url_prefix in v and not self.url_dict.has_key(v):
                self.url_pre = v
    def start_br(self, attrs):
        if self.topic_reach:
            self.topic_reach = False
            self.topic_name = escapeTxt("".join(self.vdata))
            self.vdata = []
    def handle_data(self, text):
        self.vdata_temp = text
        if self.writer_reach:
            self.writer_reach = False
            self.writer_name = text
        if self.topic_reach:
            self.vdata.append(text)
        if self.url_pre:
            text = text.strip()
            if text.isdigit():
                self.url_dict[self.url_pre] = text
                self.url_list.append((self.url_pre, text))
            self.url_pre = None

class UserCrawler(sgmllib.SGMLParser):
    def __init__(self, writer):
        sgmllib.SGMLParser.__init__(self)
        self.writer_name = writer
        self.is_all = (self.writer_name=="ALL")
    def reset(self):
        sgmllib.SGMLParser.reset(self)
        self.writer_mayreach = False
        self.writer_reach = False
        self.topic_data = []
        self.vdata = []
    def start_a(self, attrs):
        for k, v in attrs:
            if k != "href":
                continue
            if "Listwriter.asp?vid=" in v or "Listwriter.asp?vwriter=" in v:
                self.writer_mayreach = True
    def start_table(self, attrs):
        self.writer_mayreach = False
        if self.writer_reach:
            self.writer_reach = False
            self.topic_data.extend(self.vdata)
            self.vdata = []
    def start_span(self, attrs):
        self.writer_mayreach = False
        if self.writer_reach:
            self.writer_reach = False
            self.topic_data.extend(self.vdata)
            self.vdata = []
    def start_br(self, attrs):
        if self.writer_reach:
            self.vdata.append("\n")
    def handle_data(self, text):
        if self.writer_mayreach:
            self.writer_mayreach = False
            if self.is_all or self.writer_name in text:
                self.writer_reach = True
                self.vdata.append(self.vdata_temp)
        if self.writer_reach:
            self.vdata.append(text)
        self.vdata_temp = text

def recursive(url_str, url_tag, dir_str, topic_name, writer_name, url_dict, url_list):
    # 递归最大页数判断:
    page_count = int(url_dict["page_count"])
    if page_count < 1:
        return
    url_dict[url_str] = url_tag
    url_list.append((url_str, url_tag))
    data_t = readUrl(url_str)
    tc_t = TitleCrawler(url_str)
    tc_t.feed(data_t)
    tc_t.close()
    if not topic_name:
        topic_name = tc_t.topic_name
        url_dict["topic_name"] = topic_name
    if not writer_name:
        writer_name = tc_t.writer_name
        url_dict["writer_name"] = writer_name
        if url_dict.has_key("user_name") and url_dict["user_name"]:
            writer_name = url_dict["user_name"]
            url_dict["writer_name"] = writer_name
    if not dir_str:
        dir_str = "tianya" + os.sep + topic_name
        url_dict["dir_str"] = dir_str
        if not os.path.exists(dir_str):
            print dir_str
            os.makedirs(dir_str)
    uc_t = UserCrawler(writer_name)
    uc_t.feed(data_t)
    uc_t.close()
    o_txt = "".join(uc_t.topic_data)
    o_txt = stripTxt(o_txt)
    file_name = dir_str + os.sep + url_tag + ".txt"
    print file_name
    file_cur = file(file_name, "w")
    file_cur.write(o_txt)
    file_cur.close()
    # 递归最大页数判断:
    page_count = int(url_dict["page_count"])
    page_count = page_count - 1
    url_dict["page_count"] = str(page_count)
    if page_count < 1:
        return
    # 递归取下一个链接
    for k, v in tc_t.url_list:
        if not url_dict.has_key(k):
            recursive(k, v, dir_str, topic_name, writer_name, url_dict, url_list)

def createUrlLog(dir_str, writer_name, url_list):
    result = ["writer_name = %s"%writer_name]
    for kv in url_list:
        result.append("%s = %s"%kv)
    file_name = dir_str + os.sep + "0.log"
    print file_name
    file_log = file(file_name, "w")
    file_log.write("\n".join(result))
    file_log.close()

def readUrl(url_str):
    print url_str
    socket_t = urllib.urlopen(url_str)
    data_t = socket_t.read()
    socket_t.close()
    return data_t

def escapeTxt(text_str):
    result = []
    for i in text_str:
        if i not in escape_str:
            result.append(i)
    return "".join(result)

def stripTxt(text_str):
    text_arr = text_str.splitlines()
    result = []
    for i in text_arr:
        line = i.replace("  ", "  ")
        result.append(line.strip())
    return "\n".join(result)

def usage():
    print "tianya -h"
    print "tianya -c http://www.tianya.cn/publicforum/content/free/1/1491738.shtml"
    print "tianya -a tianya/"
    print "tianya -n 10 -c http://www.tianya.cn/publicforum/content/free/1/1491738.shtml"
    print "tianya -n 10 -a tianya/『天涯杂谈』医行天下"
    print "  Options include:"
    print "    -h [help]   - 打印帮助"
    print "    -c [create] - 从帖子首页开始抓取"
    print "    -a [append] - 更新已经抓取过的帖子"
    print "    -n [number] - 抓取的最大页面数,防止中途断掉,默认32页"
    print "    -u [user]   - 抓取哪个用户的帖子,ALL代表全部,默认为楼主"
    if not os.path.exists("tianya"):
        return
    tianya_dir = os.listdir("tianya")
    if not tianya_dir:
        return
    print "  当前可更新:"
    for i in tianya_dir:
        print "tianya -a tianya/" + i

if __name__ == "__main__":
    if "-h" in sys.argv:
        usage()
    elif "-c" in sys.argv:
        page_count = "8"
        if "-n" in sys.argv:
            page_count = sys.argv[sys.argv.index("-n")+1]
        user_name = ""
        if "-u" in sys.argv:
            user_name = sys.argv[sys.argv.index("-u")+1]
        url_str = sys.argv[sys.argv.index("-c")+1]
        url_dict = {"page_count":page_count, "user_name":user_name}
        url_list = []
        recursive(url_str, "1", None, None, None, url_dict, url_list)
        createUrlLog(url_dict["dir_str"], url_dict["writer_name"], url_list)

    elif "-a" in sys.argv:
        page_count = "32"
        if "-n" in sys.argv:
            page_count = sys.argv[sys.argv.index("-n")+1]
        user_name = ""
        if "-u" in sys.argv:
            user_name = sys.argv[sys.argv.index("-u")+1]
        dir_str = sys.argv[sys.argv.index("-a")+1]
        topic_name = dir_str.split(os.sep)[-1]
        file_name = dir_str + os.sep + "0.log"
        file_log = file(file_name, "r")
        data_t = file_log.readlines()
        file_log.close()
        writer_name = None
        url_str = None
        url_tag = None
        url_dict = {"page_count":str(int(page_count)+1), "user_name":user_name}
        url_list = []

        entry_t = data_t[0].split("=")
        k = entry_t[0].strip()
        v = entry_t[1].strip()
        writer_name = v
        for i in data_t[1:-1]:
            entry_t = i.split("=")
            k = entry_t[0].strip()
            v = entry_t[1].strip()
            url_dict[k] = v
            url_list.append((k, v))
        entry_t = data_t[-1].split("=")
        k = entry_t[0].strip()
        v = entry_t[1].strip()
        url_str = k
        url_tag = v

        recursive(url_str, url_tag, dir_str, topic_name, writer_name, url_dict, url_list)
        createUrlLog(dir_str, writer_name, url_list)

    else:
        usage()



具体使用方法如下:
把文件放入一个目录,如
D:\Spider

命令行进入目录,输入 tianya 回车,
一些常用命令行将打印出来,
例如 一个帖子第一页如下:
http://www.tianya.cn/publicforum/content/free/1/1491738.shtml

抓取命令使用:
tianya -c http://www.tianya.cn/publicforum/content/free/1/1491738.shtml


复杂点的可以用
tianya -c http://www.tianya.cn/publicforum/content/free/1/1491738.shtml -n 3

先抓3页下来看看。

曾经抓过的帖子,再次向后跟进就不需要这么多了,
现在可以再输入 tianya 回车,命令有增加了类似于:
tianya -a tianya/『天涯杂谈』医行天下

现在只要使用这个命令就能继续抓了。
网速不好的,可能会断线报错什么的,不过不用怕,再输入再抓即可。


更特殊的选项:
    -n [number] - 抓取的最大页面数,防止中途断掉,默认32页
    -u [user]   - 抓取哪个用户的帖子,ALL代表全部,默认为楼主
这个-n是为网络状况不同的人而设置的,网络状况好的可以设置大点,网络状况不好就设置小一点。
-u 是为了专门查看某人的回帖而设置,当然不给这个参数默认就是楼主了,要是想把所有人都抓了呢(包括楼主和所有回帖),就这样:
tianya -c http://www.tianya.cn/publicforum/content/free/1/1491738.shtml -u ALL

tianya -a tianya/『天涯杂谈』医行天下 -u ALL


当初看孔二狗的东北往事:黑道风云20年没把我累死,
所以以后用工具,
希望大家在天涯看帖更轻松!(非广告)
分享到:
评论

相关推荐

    J2ME学习笔记 入门 学习经验

    j2me学习笔记【2】——利用Display类的isColor()方法获取设备是否支持彩色的信息 j2me学习笔记【3】——简单的在线帮助示例 j2me学习笔记【4】——Item类的学习 j2me学习笔记【5】——抛出异常处理的小例子 j2me学习...

    JSP_Servlet学习笔记(第2版).pdf

    《JSP & Servlet学习笔记(第2版)》涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 《JSP & Servlet学习笔记(第2版)》以“微博”项目贯穿全书,将JSP & Servlet技术应用...

    python文本数据处理学习笔记详解

    主要为大家详细介绍了python文本数据处理学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JSP_Servlet学习笔记(第2版)

    JSP & Servlet学习笔记(第2版)》是作者多年来教学实践经验的总结,汇集了学生在学习JSP&Servlet或认证考试时遇到的概念、操作、应用等各种问题及解决方案。 本书针对Servlet3.0的新功能全面改版,无论章节架构...

    自然语言处理学习笔记nlp-tutorial

    通过自然语言处理技术,可以实现机器翻译、问答系统、情感分析、文本摘要等多种应用。随着深度学习技术的发展,人工神经网络和其他机器学习方法已经在自然语言处理领域取得了重要的进展。未来的发展方向包括更深入的...

    JSP &amp; Servlet学习笔记(第2版)

    本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。  本书在讲解的过程中,以“微博”项目贯穿全书,随着每一章的讲述都在适当的时候将JSP &Servlet技术应用于...

    JSP&Servlet;学习笔记

    本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 本书在讲解的过程中,以“微博”项目贯穿全书,随着每一章的讲述都在适当的时候将JSP & Servlet技术应用于“微博...

    JSP & Servlet学习笔记

    本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。, 本书在讲解的过程中,以“微博”项目贯穿全书,随着每一章的讲述都在适当的时候将JSP & Servlet技术应用于...

    Pytorch、NLP学习笔记

    记录Pytorch、NLP学习笔记 NLP_indoor / 文本处理 tensorboard的使用 网络模型的保存与读取

    JSP&Servlet学习笔记.pdf

    本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。  本书在讲解的过程中,以“微博”项目贯穿全书,随着每一章的讲述都在适当的时候将JSP & Servlet技术应用于...

    人工智能学习笔记人工智能学习笔记

    人工智能学习笔记 nlp大语言模型基础框架:——10.30 实体命名识别:10.30——11.5 1698669295418 医疗任务-多层级,多粒度测试:11.6——11.9 文本分类:11.6——11.18

    Java/JavaEE 学习笔记

    Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...

    python自然语言处理-学习笔记(三)之文本相似度计算-附件资源

    python自然语言处理-学习笔记(三)之文本相似度计算-附件资源

    机器学习笔记-Transformer

    Transformer语言模型是一种基于注意力机制的深度学习模型,它是在2017年由Google提出的,被广泛应用于自然语言处理领域。 Transformer模型主要由编码器和解码器组成,其中编码器将输入的文本序列转换为一组向量,...

    Shell脚本学习笔记

    第1章 BashShell命令 6 1.1 Shell提示符 6 1.2 文件与目录Shell命令 7 1.2.1 更改目录命令(cd) 7 1.2.2 列表命令(ls) 7 1.2.3 操作文件命令 10 1.2.4 目录处理命令 14 ...7.3.4 插入和附加文本 129

    C++特征工程学习笔记.md

    接着,针对特征工程的不同方面,分别介绍了特征选择、特征转换、文本处理中的特征工程、图像处理中的特征工程以及时间序列分析中的特征工程。每个部分都伴随着示例代码,展示了不同情境下的特征工程实际操作。 适合...

Global site tag (gtag.js) - Google Analytics