零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版


Posted in Python onNovember 06, 2014

百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键数据,然后将其存储到本地txt文件。

项目内容:

用Python写的百度贴吧的网络爬虫。

使用方法:

新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行。

程序功能:

将贴吧中楼主发布的内容打包txt存储到本地。

原理解释:

首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了:
http://tieba.baidu.com/p/2296712428?see_lz=1&pn=1
可以看出来,see_lz=1是只看楼主,pn=1是对应的页码,记住这一点为以后的编写做准备。
这就是我们需要利用的url。
接下来就是查看页面源码。
首先把题目抠出来存储文件的时候会用到。
可以看到百度使用gbk编码,标题使用h1标记:

<h1 class="core_title_txt" title="【原创】时尚首席(关于时尚,名利,事业,爱情,励志)">【原创】时尚首席(关于时尚,名利,事业,爱情,励志)</h1> 

同样,正文部分用div和class综合标记,接下来要做的只是用正则表达式来匹配即可。
运行截图:

零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版

生成的txt文件:

零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版

# -*- coding: utf-8 -*-  

#---------------------------------------  

#   程序:百度贴吧爬虫  

#   版本:0.5  

#   作者:why  

#   日期:2013-05-16  

#   语言:Python 2.7  

#   操作:输入网址后自动只看楼主并保存到本地文件  

#   功能:将楼主发布的内容打包txt存储到本地。  

#---------------------------------------  

   

import string  

import urllib2  

import re  

  

#----------- 处理页面上的各种标签 -----------  

class HTML_Tool:  

    # 用非 贪婪模式 匹配 \t 或者 \n 或者 空格 或者 超链接 或者 图片  

    BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)")  

      

    # 用非 贪婪模式 匹配 任意<>标签  

    EndCharToNoneRex = re.compile("<.*?>")  

  

    # 用非 贪婪模式 匹配 任意<p>标签  

    BgnPartRex = re.compile("<p.*?>")  

    CharToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)")  

    CharToNextTabRex = re.compile("<td>")  

  

    # 将一些html的符号实体转变为原始符号  

    replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(" "," ")]  

      

    def Replace_Char(self,x):  

        x = self.BgnCharToNoneRex.sub("",x)  

        x = self.BgnPartRex.sub("\n    ",x)  

        x = self.CharToNewLineRex.sub("\n",x)  

        x = self.CharToNextTabRex.sub("\t",x)  

        x = self.EndCharToNoneRex.sub("",x)  

  

        for t in self.replaceTab:    

            x = x.replace(t[0],t[1])    

        return x    

      

class Baidu_Spider:  

    # 申明相关的属性  

    def __init__(self,url):    

        self.myUrl = url + '?see_lz=1'  

        self.datas = []  

        self.myTool = HTML_Tool()  

        print u'已经启动百度贴吧爬虫,咔嚓咔嚓'  

    

    # 初始化加载页面并将其转码储存  

    def baidu_tieba(self):  

        # 读取页面的原始信息并将其从gbk转码  

        myPage = urllib2.urlopen(self.myUrl).read().decode("gbk")  

        # 计算楼主发布内容一共有多少页  

        endPage = self.page_counter(myPage)  

        # 获取该帖的标题  

        title = self.find_title(myPage)  

        print u'文章名称:' + title  

        # 获取最终的数据  

        self.save_data(self.myUrl,title,endPage)  

  

    #用来计算一共有多少页  

    def page_counter(self,myPage):  

        # 匹配 "共有<span class="red">12</span>页" 来获取一共有多少页  

        myMatch = re.search(r'class="red">(\d+?)</span>', myPage, re.S)  

        if myMatch:    

            endPage = int(myMatch.group(1))  

            print u'爬虫报告:发现楼主共有%d页的原创内容' % endPage  

        else:  

            endPage = 0  

            print u'爬虫报告:无法计算楼主发布内容有多少页!'  

        return endPage  

  

    # 用来寻找该帖的标题  

    def find_title(self,myPage):  

        # 匹配 <h1 class="core_title_txt" title="">xxxxxxxxxx</h1> 找出标题  

        myMatch = re.search(r'<h1.*?>(.*?)</h1>', myPage, re.S)  

        title = u'暂无标题'  

        if myMatch:  

            title  = myMatch.group(1)  

        else:  

            print u'爬虫报告:无法加载文章标题!'  

        # 文件名不能包含以下字符: \ / : * ? " < > |  

        title = title.replace('\\','').replace('/','').replace(':','').replace('*','').replace('?','').replace('"','').replace('>','').replace('<','').replace('|','')  

        return title  

  

    # 用来存储楼主发布的内容  

    def save_data(self,url,title,endPage):  

        # 加载页面数据到数组中  

        self.get_data(url,endPage)  

        # 打开本地文件  

        f = open(title+'.txt','w+')  

        f.writelines(self.datas)  

        f.close()  

        print u'爬虫报告:文件已下载到本地并打包成txt文件'  

        print u'请按任意键退出...'  

        raw_input();  

  

    # 获取页面源码并将其存储到数组中  

    def get_data(self,url,endPage):  

        url = url + '&pn='  

        for i in range(1,endPage+1):  

            print u'爬虫报告:爬虫%d号正在加载中...' % i  

            myPage = urllib2.urlopen(url + str(i)).read()  

            # 将myPage中的html代码处理并存储到datas里面  

            self.deal_data(myPage.decode('gbk'))  

              

    # 将内容从页面代码中抠出来  

    def deal_data(self,myPage):  

        myItems = re.findall('id="post_content.*?>(.*?)</div>',myPage,re.S)  

        for item in myItems:  

            data = self.myTool.Replace_Char(item.replace("\n","").encode('gbk'))  

            self.datas.append(data+'\n') 
#-------- 程序入口处 ------------------  

print u"""#--------------------------------------- 

#   程序:百度贴吧爬虫 

#   版本:0.5 

#   作者:why 

#   日期:2013-05-16 

#   语言:Python 2.7 

#   操作:输入网址后自动只看楼主并保存到本地文件 

#   功能:将楼主发布的内容打包txt存储到本地。 

#--------------------------------------- 

"""  

# 以某小说贴吧为例子  

# bdurl = 'http://tieba.baidu.com/p/2296712428?see_lz=1&pn=1'  

  

print u'请输入贴吧的地址最后的数字串:'  

bdurl = 'http://tieba.baidu.com/p/' + str(raw_input(u'http://tieba.baidu.com/p/'))   

  

#调用  

mySpider = Baidu_Spider(bdurl)  

mySpider.baidu_tieba() 

以上就是改进之后的抓取百度贴吧的全部代码了,非常的简单实用吧,希望能对大家有所帮助

Python 相关文章推荐
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
Python中操作符重载用法分析
Apr 29 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
python基本语法练习实例
Sep 19 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
对python3中, print横向输出的方法详解
Jan 28 Python
python用for循环求和的方法总结
Jul 08 Python
python实现邮件自动发送
Aug 10 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 Python
零基础写python爬虫之抓取糗事百科代码分享
Nov 06 #Python
零基础写python爬虫之神器正则表达式
Nov 06 #Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 #Python
零基础写python爬虫之urllib2使用指南
Nov 05 #Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 #Python
零基础写python爬虫之HTTP异常处理
Nov 05 #Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 #Python
You might like
PHP的运行机制与原理(底层)
2015/11/16 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
详解python的四种内置数据结构
2019/03/19 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Django跨域请求原理及实现代码
2020/11/14 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
冰淇淋开店创业计划书
2014/02/01 职场文书
感恩的演讲稿
2014/05/06 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
远程教育培训心得体会
2016/01/09 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
使用Python解决图表与画布的间距问题
2022/04/11 Python