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

本文实例讲述了基于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综合标记,接下来要做的只是用正则表达式来匹配即可。

运行截图:

生成的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程序设计有所帮助。

(0)

相关推荐

  • Python网络爬虫实例讲解

    聊一聊Python与网络爬虫. 1.爬虫的定义 爬虫:自动抓取互联网数据的程序. 2.爬虫的主要框架 爬虫程序的主要框架如上图所示,爬虫调度端通过URL管理器获取待爬取的URL链接,若URL管理器中存在待爬取的URL链接,爬虫调度器调用网页下载器下载相应网页,然后调用网页解析器解析该网页,并将该网页中新的URL添加到URL管理器中,将有价值的数据输出. 3.爬虫的时序图 4.URL管理器 URL管理器管理待抓取的URL集合和已抓取的URL集合,防止重复抓取与循环抓取.URL管理器的主要职能如下图

  • python3使用urllib模块制作网络爬虫

    urllib urllib模块是python3的URL处理包 其中: 1.urllib.request主要是打开和阅读urls 个人平时主要用的1: 打开对应的URL:urllib.request.open(url) 用urllib.request.build_opener([handler, ...]),来伪装成对应的浏览器 import urllib #要伪装成的浏览器(我这个是用的chrome) headers = ('User-Agent','Mozilla/5.0 (Windows N

  • Python网络爬虫项目:内容提取器的定义

    1. 项目背景 在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中. 2. 解决方案 为了解决这个问题,我们把影响通用性和工作效率的提取器隔离出来,描述了如下的数据处理流程图: 图中"可插拔提取器"必须很强的模块化,那么关键的接口有: 标准化的输入:以标准的HTML DOM对象为输入 标准化的内容提取:使用标准的xslt模板提取网页内容 标准化的输出:

  • 使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚本语言,没有之一.Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等.总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他... 因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些

  • 详解Python网络爬虫功能的基本写法

    网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止.如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来.这样看来,网络爬虫就是一个爬行程序,一个抓取网页的

  • 以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法

    在这篇文章中,我们将分析一个网络爬虫. 网络爬虫是一个扫描网络内容并记录其有用信息的工具.它能打开一大堆网页,分析每个页面的内容以便寻找所有感兴趣的数据,并将这些数据存储在一个数据库中,然后对其他网页进行同样的操作. 如果爬虫正在分析的网页中有一些链接,那么爬虫将会根据这些链接分析更多的页面. 搜索引擎就是基于这样的原理实现的. 这篇文章中,我特别选了一个稳定的."年轻"的开源项目pyspider,它是由 binux 编码实现的. 注:据认为pyspider持续监控网络,它假定网页在一

  • Python网络爬虫出现乱码问题的解决方法

    关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换.还包括一些如日文.韩文 .俄文.藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明. 网络爬虫出现乱码的原因 源网页编码和爬取下来后的编码格式不一致. 如源网页为gbk编码的字节流,而我们抓取下后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码 即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码; 此时再进行统一的字符编码也就不会出现乱码了 注意区分 源网编码A. 程序直接使用的编码B. 统

  • python 网络爬虫初级实现代码

    首先,我们来看一个Python抓取网页的库:urllib或urllib2. 那么urllib与urllib2有什么区别呢? 可以把urllib2当作urllib的扩增,比较明显的优势是urllib2.urlopen()可以接受Request对象作为参数,从而可以控制HTTP Request的header部. 做HTTP Request时应当尽量使用urllib2库,但是urllib.urlretrieve()函数以及urllib.quote等一系列quote和unquote功能没有被加入urll

  • python网络爬虫采集联想词示例

    python爬虫_采集联想词代码 复制代码 代码如下: #coding:utf-8import urllib2import urllibimport reimport timefrom random import choice#特别提示,下面这个list中的代理ip可能失效,请换上有效的代理ipiplist  = ['27.24.158.153:81','46.209.70.74:8080','60.29.255.88:8888'] list1 = ["集团","科技&quo

  • python使用rabbitmq实现网络爬虫示例

    编写tasks.py 复制代码 代码如下: from celery import Celeryfrom tornado.httpclient import HTTPClientapp = Celery('tasks')app.config_from_object('celeryconfig')@app.taskdef get_html(url):    http_client = HTTPClient()    try:        response = http_client.fetch(u

随机推荐