基于Python实现的百度贴吧网络爬虫实例


Posted in Python onApril 17, 2015

本文实例讲述了基于Python实现的百度贴吧网络爬虫。分享给大家供大家参考。具体如下:

完整实例代码点击此处本站下载。

项目内容:

用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文件:

基于Python实现的百度贴吧网络爬虫实例

# -*- 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 相关文章推荐
python将图片文件转换成base64编码的方法
Mar 14 Python
python实现的简单猜数字游戏
Apr 04 Python
python获取文件扩展名的方法
Jul 06 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
python存储16bit和32bit图像的实例
Dec 05 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python虚拟环境完美部署教程
Aug 06 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
python实现扫雷游戏的示例
Oct 20 Python
python 下载文件的几种方法汇总
Jan 06 Python
python中dir函数用法分析
Apr 17 #Python
python传递参数方式小结
Apr 17 #Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 #Python
python类继承与子类实例初始化用法分析
Apr 17 #Python
python中split方法用法分析
Apr 17 #Python
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 #Python
python字典get()方法用法分析
Apr 17 #Python
You might like
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
PHP 文件上传限制问题
2019/09/01 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
python处理圆角图片、圆形图片的例子
2014/04/25 Python
Python Selenium参数配置方法解析
2020/01/19 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
详解Python中import机制
2020/09/11 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
护士自我评价
2014/02/01 职场文书
停车场管理制度范本
2015/08/05 职场文书