基于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实现二维有序数组查找的方法
Apr 27 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
python基础之入门必看操作
Jul 26 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
django的ORM操作 增加和查询
Jul 26 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 Python
python实现银行实战系统
Feb 26 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
python定时截屏实现
Nov 02 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文件的实现方法
2007/03/19 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Python实现身份证号码解析
2015/09/01 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python 字符串和整数的转换方法
2018/06/25 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python global和nonlocal用法解析
2020/02/03 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
中职生自我鉴定范文
2013/10/03 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
高二英语教学反思
2014/01/19 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
PHP遍历数组的6种方式总结
2021/11/17 PHP