基于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获得时间的实例说明
Mar 25 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python模拟事件触发机制详解
Jan 19 Python
解读python logging模块的使用方法
Apr 17 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
Python语法分析之字符串格式化
Jun 13 Python
python文本数据处理学习笔记详解
Jun 17 Python
python 实现图像快速替换某种颜色
Jun 04 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
python中的插入排序的简单用法
Jan 19 Python
Python扫描端口的实现
Jan 25 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python实现给数组按片赋值的方法
2015/07/28 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
python实现简单图书管理系统
2019/11/22 Python
python自动化办公操作PPT的实现
2021/02/05 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
企业金融服务方案
2014/06/03 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技