文档章节

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

鑢七花
 鑢七花
发布于 2016/11/17 16:15
字数 695
阅读 13
收藏 0

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

#!/usr/bin/python
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import MySQLdb
import MySQLdb.cursors
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
        self.floorTag = 1
        
    #传入贴吧主页网址,获取贴吧主页的代码
    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 = self.tool.replace(item[1])
            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 = self.tool.replace(item)
            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 = []
        for item in result:
            #print self.tool.replace(getid)
            getid = self.tool.replace(item)
            getids.append(getid.encode('utf-8'))            
        return getids            

    def writeDate(self,replay,id,title):
        for (replay, id, title) in zip(replay,                                                                                                                                                                                                                                                                       conn = MySQLdb.connect(host='192.168.1.181',user='root',passwd='redhat',db='tiebadata',por
t = 3306,charset = 'utf8')
            cur = conn.cursor()
            cur.execute('insert into zhuti(replay, id, title) values(%s, %s, %s)',(replay, id, title))
            print "success connect!"
            conn.commit()
            cur.close()
            conn.close()
    def start(self,title):
        indexPage = self.getPage(0)
        gettitle = self.getTitle(indexPage)
        if indexPage == None:
            print "URL已失效,请重试"
            return
        try:
            print "获取贴吧前十页帖子"
            for i in range(0,10):
                print "正在写入第" + str(i) + "页数据"
                page = self.getPage(i*50)
                replay = self.getReplay(page)
                id = self.getId(page)
                title = self.getTitle(page)
                self.writeDate(replay,id,title)
        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"请再一次输入贴吧名称:"
title = raw_input(u'')
bdtb = BDTB(baseURL)
bdtb.start(title)

目前不是很完善,后续将加入自动建表的功能

 

© 著作权归作者所有

共有 人打赏支持
鑢七花
粉丝 5
博文 14
码字总数 17605
作品 0
葫芦岛
运维
Python实现贴吧多线程网盘爬虫

大多数Python学习者都是冲着Python在爬虫领域有非常出色的表现才开始学习的,在学好Python的基本语法并会使用re、requests、BeautifulSoup4等模块后,很快就能写出一个简单的爬虫小程序(不要...

数据取经团
2017/11/29
0
0
在技术圈儿混,怎能不关注这几个公众号!

精品公众号订阅,总有几个适合你 AIOps智能运维 ID:AI_Ops ▲长按图片识别二维码关注 百度云智能运维团队官方公众号!我们利用大规模分布式、大数据和机器学习等技术为百度云用户和百度各产...

g2v13ah
03/30
0
0
ThinkOX 1.1.0 发布,新增资讯模块、同步登陆绑定站内账号等

如果出现升级提示,请关闭浏览器重新打开即可安装。 产品主页:tox.ourstu.com 版本号 1.1.0 包含了大量改进。 授权用户请联系我们升级至最新版(必须升级至1.1.0版才能使用手机客户端)。 ...

陈一枭
2014/08/27
3.3K
7
python3 爬虫实战之爬取网易新闻APP端

(一)使用工具 这里使用了火狐浏览器的user-agent插件,不懂的可以点这里火狐插件使用 (二)爬虫操作步骤: 百度 网易新闻并选择 步骤一: 步骤二: 步骤三: 步骤四: 最后一步: 注意点:...

徐代龙
05/24
0
0
python—爬虫

1.1 介绍 通过过滤和分析HTML代码,实现对文件、图片等资源的获取,一般用到: urllib和urllib2模块 正则表达式(re模块) requests模块 Scrapy框架 urllib库: 1)获取web页面 2)在远程htt...

huangzp168
01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 我居然在 osc 里追剧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @舆情风控小组 :分享王菲的单曲《笑忘书》 《笑忘书》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @艾尔库鲁斯:如果给大家一个选择的机...

小小编辑
42分钟前
57
6
rabbitMq的客户端使用笔记

1、channel声明队列的queueDeclare方法的参数解析 durable: 是否持久化, 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自...

DemonsI
50分钟前
0
0
“全新” 编程语言 Julia开箱体验

本文共 851字,阅读大约需要 3分钟 ! 概 述 Julia 是一个 “全新”的高性能动态编程语言,前两天迎来了其 1.0 正式版的重大更新。Julia集 Python、C、R、Ruby 之所长,感觉就像一种脚本语言...

CodeSheep
今天
12
0
软件自动化测试初学者忠告

题外话 测试入门 很多受过高等教育的大学生经常问要不要去报测试培训班来入门测试。 答案是否。 高等教育的合格毕业生要具备自学能力,如果你不具备自学能力,要好好地反省一下,为什么自己受...

python测试开发人工智能安全
今天
5
0
java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部