码迷,mamicode.com
首页 > 编程语言 > 详细

简单的python 网络爬虫实现

时间:2015-09-21 19:51:39      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

  最近拉肚子三天了,晚上单位又聚餐,一不小心吃多了点,晚上跑厕所跑的频繁,索性睡不着了,参照网上资料,敲了段python 爬虫代码,第一次学习除了shell 和js 外的脚本语言,无限的坑坑,都说python 的效率是 java 的3倍,由于是新手,跌跌撞撞总算是写了出来,还是比较欣慰的。
    简单介绍一下python :
    1、设计哲学: 
Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。
     2、用途:(
1).运维:数据挖掘。

            (2).抓取网页比较多,生成报表,批量删除某种文件等等小事。。。

            (3).数据采集,服务器上小工具编写
            (4).使用范围广,Linux和Windows、Mac OS等上都能用,也就是平台无关性吧

            (5).很多自动化测试工具都支持Python脚本,所以才需要应聘者了解这方面

            (6).整理文档,备份,监视服务器

   3、常见的python web 框架 
            
Django: Python Web应用开发框架
         
Flask:一个用Python编写的轻量级Web应用框架  
            
Web2py:全栈式Web框架
         
Dpark:Python版的Spark
言归正传:写代码第一个坑就是缩进,最近看一些个作者的代码没有缩进简直无法忍受,要是在python中没有缩进,他能弄死你。第二个坑就是代码调试。好歹都已经解决,下面是我爬了百度贴吧nba 的一个帖子,如下:

__author__ = ‘CQC‘

# -*- coding:utf-8 -*-

#import urllib

import urllib2

import re



#处理页面标签类

class Tool:

    #去除img标签,7位长空格

    removeImg = re.compile(‘<img.*?>| {7}|‘)

    #删除超链接标签

    removeAddr = re.compile(‘<a.*?>|</a>‘)

    #把换行的标签换为\n

    replaceLine = re.compile(‘<tr>|<div>|</div>|</p>‘)

    #将表格制表<td>替换为\t

    replaceTD = re.compile(‘<td>‘)

    #把段落开头换为\n加空两格

    replacePara = re.compile(‘<p.*?>‘)

    #将换行符或双换行符替换为\n

    replaceBR = re.compile(‘<br><br>|<br>‘)

    #将其余标签剔除

    removeExtraTag = re.compile(‘<.*?>‘)

    def replace(self, x):

        x = re.sub(self.removeImg, "", x)

        x = re.sub(self.removeAddr, "", x)

        x = re.sub(self.replaceLine, "\n", x)

        x = re.sub(self.replaceTD, "\t", x)

        x = re.sub(self.replacePara, "\n    ", x)

        x = re.sub(self.replaceBR, "\n", x)

        x = re.sub(self.removeExtraTag, "", x)

        #strip()将前后多余内容删除

        return x.strip()



#百度贴吧爬虫类

class BDTB:


    #初始化,传入基地址,是否只看楼主的参数

    def __init__(self, baseUrl, seeLZ):

        print ‘_int_ 相当于这个累的构造函数‘

        self.baseURL = baseUrl

        self.seeLZ = ‘?see_lz=‘ + str(seeLZ)

        self.tool = Tool()

     

    def getPage(self, pageNum):

        print ‘获取百度贴吧地几页的帖子开始‘   

        try:

            url = self.baseURL + self.seeLZ + ‘&pn=‘ + str(pageNum)

            request = urllib2.Request(url)

            response = urllib2.urlopen(request)

            return response.read().decode(‘utf-8‘)

        except urllib2.URLError, e:

            if hasattr(e, "reason"):

                print u"连接百度贴吧失败.错误原因", e.reason

                return None

        print ‘获取百度贴吧地几页的帖子结束‘



    #获取帖子标题

    def getTile(self):

        print ‘获取帖子标题开始‘

        page = self.getPage(1)

        pattern = re.compile(‘<h1 class="core_title_txt.*?>(.*?)</h1>‘, re.S)

        result = re.search(pattern, page)

        if result:

            #print result.group(1)#测试输出

            return result.group(1).strip()

        else:

            return None

        print ‘获取帖子标题结束‘      

            

    #提取帖子页数

    #获取帖子一共有多少页

    def getPageNum(self):

        print ‘获取帖子页数一共有多少页开始‘

        page = self.getPage(1)

        pattern = re.compile(‘<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>‘, re.S)

        result = re.search(pattern, page)

        if result:

            #print result.group(1)#测试输出

            return result.group(1).strip()

        else:

            return None

        print ‘获取帖子页数一共有多少页结束‘

    

    def getContent(self, page):

        print ‘获取正文内容开始‘

        pattern = re.compile(‘<div id="post_content_.*?>(.*?)</div>‘, re.S)

        items = re.findall(pattern, page)

        #for item in items:

        #   print item

        #print items[1]

        print self.tool.replace(items[1])

        print ‘获取正文内容结束‘

baseURL = ‘http://tieba.baidu.com/p/3138733512

bdtb = BDTB(baseURL, 1)

bdtb.getContent(bdtb.getPage(1))

简单的python 网络爬虫实现

标签:

原文地址:http://my.oschina.net/u/2325281/blog/509292

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!