零基础写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爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
Python中对数组集进行按行打乱shuffle的方法
Nov 08 Python
python ddt数据驱动最简实例代码
Feb 22 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
Pytorch 实现权重初始化
Dec 31 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
python实现扫雷小游戏
Apr 24 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
python字符串的index和find的区别详解
Jun 20 Python
Python正则表达式中flags参数的实例详解
Apr 01 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.MVC的模板标签系统(一)
2006/09/05 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
js constructor的实际作用分析
2011/11/15 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
python实现学生管理系统开发
2020/07/24 Python
Noon埃及:埃及在线购物
2019/11/26 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
就业协议书范本
2014/04/11 职场文书
预防传染病方案
2014/06/14 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
旅行社计调工作总结
2015/08/12 职场文书
你会写请假条吗?
2019/06/26 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python
python的html标准库
2022/04/29 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技