簡單的python 網絡爬蟲實現

  最近拉肚子三天了,晚上單位又聚餐,一不當心吃多了點,晚上跑廁所跑的頻繁,索性睡不着了,參照網上資料,敲了段python 爬蟲代碼,第一次學習除了shell 和js 外的腳本語言,無限的坑坑,都說python 的效率是 java 的3倍,因爲是新手,跌跌撞撞總算是寫了出來,仍是比較欣慰的。
    簡單介紹一下python :
    一、設計哲學: 
Python的設計哲學是「優雅」、「明確」、「簡單」。所以,Perl語言中「老是有多種方法來作同一件事」的理念在Python開發者中一般是難以忍受的。Python開發者的哲學是「用一種方法,最好是隻有一種方法來作一件事」。
     二、用途:(
1).運維:數據挖掘。java

       (2).抓取網頁比較多,生成報表,批量刪除某種文件等等小事。。。python

       (3).數據採集,服務器上小工具編寫
       (4).使用範圍廣,Linux和Windows、Mac OS等上都能用,也就是平臺無關性吧
web

       (5).不少自動化測試工具都支持Python腳本,因此才須要應聘者瞭解這方面shell

       (6).整理文檔,備份,監視服務器django

   三、常見的python web 框架 
         
Django: Python Web應用開發框架
         
Flask:一個用Python編寫的輕量級Web應用框架  
         
Web2py:全棧式Web框架
          
Dpark:Python版的Spark
言歸正傳:寫代碼第一個坑就是縮進,最近看一些個做者的代碼沒有縮進簡直沒法忍受,要是在python中沒有縮進,就是違背了自己的語法。第二個坑就是代碼調試。好歹都已經解決,下面是我爬了百度貼吧nba 的一個帖子,以下:
flask

__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))
相關文章
相關標籤/搜索