文档章节

Python实现获取百度贴吧主页的前十页回复数,帖子id,主题

鑢七花
 鑢七花
发布于 2016/11/17 15:57
字数 712
阅读 69
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

                                                     Python实现获取百度贴吧主页的前十页回复数,帖子id,主题

#!/usr/bin/python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import sys
reload (sys)
sys.setdefaultencoding('utf-8')
 
#处理页面标签类
class Tool:
    #去除img标签,7位长空格
    removeImg = re.compile('<img.*?>| {7}|')
    #删除超链接标签
    removeAddr = re.compile('<a.*?>|</a>')
    #把换行的标签换为\n
    replaceLine = re.compile('<tr>|<div>|</div>|</p>')
    #将表格制表<td>替换为\t
    replaceTD= re.compile('<td>')
    #把段落开头换为\n加空两格
    replacePara = re.compile('<p.*?>')
    #将换行符或双换行符替换为\n
    replaceBR = re.compile('<br><br>|<br>')
    #将其余标签剔除
    removeExtraTag = re.compile('<.*?>')
    def replace(self,x):
        x = re.sub(self.removeImg,"",x)
        x = re.sub(self.removeAddr,"",x)
        x = re.sub(self.replaceLine,"\n",x)
        x = re.sub(self.replaceTD,"\t",x)
        x = re.sub(self.replacePara,"\n    ",x)
        x = re.sub(self.replaceBR,"\n",x)
        x = re.sub(self.removeExtraTag,"",x)
        #strip()将前后多余内容删除
        return x.strip()
        
#百度贴吧爬虫类
class BDTB:

    def __init__(self,baseUrl):
        self.baseURL = baseUrl
        self.tool = Tool()
        self.floor = 1
        self.file = None
        
    #传入贴吧主页网址,获取贴吧主页的代码
    def getPage(self,pageNum):
        try:
            url = self.baseURL + '&pn=' + str(pageNum)
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            #print response.read()
            return response.read().decode('utf-8')
        except urllib2.URLError, e:
            if hasattr(e,"reason"):
                print u"连接百度贴吧失败,错误原因",e.reason
                return None
                
    #传入主页代码,获取帖子
    def getTitle(self,page):
        pattern = re.compile(r'<a href="/p/.*? title="(.*?)" .*? class="j_th_tit .*?>(.*?)</a>',re.S)
        result = re.findall(pattern,page)
        gettitles = []
        for item in result:            
            gettitle = "\n"+"标题:"+self.tool.replace(item[1])+"\n"
            gettitles.append(gettitle.encode('utf-8'))
        return gettitles

    #传入主页页码,获取帖子回复数
    def getReplay(self,page):
        pattern = re.compile(r'<span class="threadlist_rep_num center_text.*?>(.*?)</span>',re.S)
        result = re.findall(pattern,page)
        getreplays = []
        #print result
        for item in result:
            #print self.tool.replace(getreplay)
            getreplay = "\n"+"回复数:"+self.tool.replace(item)+"\n"
            getreplays.append(getreplay.encode('utf-8'))            
        #print getreplays
        return getreplays
        

    #传入主页页码,获取帖子作者
    #def getAuthor(self):
        #page = self.getPage()
        #pattern = re.compile(r'<a data-field=\'.*? class="frs-author-name.*? >(.*?)</a>',re.S)
        #result = re.findall(pattern,page)
        #for item in result:
            #print item
    
    #传入主页代码,获取帖子id
    def getId(self,page):
        pattern = re.compile(r'<a href="/p/(.*?)" title=".*?" class="j_th_tit .*?>.*?</a>',re.S)
        result = re.findall(pattern,page)
        getids = []
        #print result
        for item in result:
            #print self.tool.replace(getid)
            getid = "\n"+"帖子id:"+self.tool.replace(item)+"\n"
            getids.append(getid.encode('utf-8'))
        #print getids
        return getids            

    def writeDate(self,getreplays,getids,gettitles):
        reload(sys)
        sys.setdefaultencoding('utf-8')
        for (item, a, b) in zip(getreplays,getids,gettitles):
            self.file.write(item)
            self.file.write(a)
            self.file.write(b)
            c = "------------------------------------------------------------------------"
            self.file.write(c)  
            self.floor += 1
    def start(self,title):
        indexPage = self.getPage(0)
        gettitle = self.getTitle(indexPage)
        self.file = open(title + ".txt","a+")            
        print "写入文件名称成功!"
        if indexPage == None:
            print "URL已失效,请重试"
            return
        try:
            print "获取贴吧前十页帖子"
            for i in range(0,10):
                print "正在写入第" + str(i) + "页数据"
                page = self.getPage(i*50)
                getreplays = self.getReplay(page)
                getids = self.getId(page)
                gettitles = self.getTitle(page)
                self.writeDate(getreplays,getids,gettitles)
        except IOError,e:
            print "写入异常,原因" + e.message
        finally:
            print "写入任务完成"
            
        
print u"请输入贴吧名:"
baseURL = 'http://tieba.baidu.com/f?kw=' + raw_input(u'') + '&fr=ala0&tpl=5'
print u"请再一次输入贴吧名称" #输入的名称为保存数据的txt文件名称
title = raw_input(u'')
#title = "贴吧主页"
bdtb = BDTB(baseURL)
bdtb.start(title)

格式粘贴时有问题,直接拷贝可能会有问题,请注意。

鑢七花
粉丝 5
博文 15
码字总数 17605
作品 0
葫芦岛
运维
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
3.9K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.3K
16
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Java实现把图片上传到图片服务器(nginx+vsftp)

前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考《nginx + vsftp搭建图片服务器》),并且用vsftp的客户端工具filezilla测试过已经可用。但是在开发中应该是把用户...

贪挽懒月
2018/08/31
0
0
因为AI不是人,美国专利局拒绝认定TA的所有发明权

点击上方“迈微电子研发社”,选择“星标★”公众号 重磅干货,第一时间送达 「你不是人!」——美国专利局(USPTO)。 这句话是美国专利局,对所有人工智能说的。 4月27日,美国专利局出台一...

迈微Charmve
07/09
0
0
【演讲实录】AI智能诊断系统的设计思路 | DevFest 2019

校对:陈宏圆 排版:溪客 DevFest 2019在上海终落下帷幕 ❤️2500+ 参会者,60%+ 技术从业者参与了此次盛会 几十位演讲嘉宾倾囊相授的闭门技术 内容涵盖TensorFlow/机器学习、Android/Kotli...

JessieIsMe
01/15
0
0
手机版浏览器安装插件的方法!

在电脑端,浏览器的几乎一半以上的功能都是插件赋予的,比较受大众欢迎的Chrome就是一个典型例子,而我们身边常见的手机浏览器都没有支持安装插件的功能,手机版的Chrome也不例外,但有一款手...

zeroing1
2019/06/28
0
0
统计学知识——最强脑图

来源:TalkingData数据学堂(ID:TDUniversity) 用图表展示数据 数据的描述统计量 随机变量的概率分布 参数估计 假设检验 本文分享自微信公众号 - spss学习乐园(spssxp2018)。 如有侵权,...

Gently_s
2019/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部