python 爬蟲第二例--百度貼吧

来源:http://www.cnblogs.com/rcltocode/archive/2017/07/18/7200990.html
-Advertisement-
Play Games

python 第二例,爬取百度貼吧的帖子,獲取帖子的標題,內容,所在樓層,發佈時間 其中存在一個問題,當該帖子是手機端發佈的帖子,此時在頁面中會有標識,因此多一個span標簽,與樓層和發佈時間的標簽一樣 解決方法: 目潛想到的解決方法是通過判斷爬到的值來進行選擇,但解決方案效率肯定低,因此未使用,等 ...


python 第二例,爬取百度貼吧的帖子,獲取帖子的標題,內容,所在樓層,發佈時間

其中存在一個問題,當該帖子是手機端發佈的帖子,此時在頁面中會有標識,因此多一個span標簽,與樓層和發佈時間的標簽一樣

解決方法: 目潛想到的解決方法是通過判斷爬到的值來進行選擇,但解決方案效率肯定低,因此未使用,等知識體系豐富後再進行改進

附爬取的代碼:

# -*- coding: utf-8 -*-
import urllib2
import urllib
import re

class Tool:
    # 去除Img標簽
    removeImg = re.compile(r'<img.*?>| {0,100}|')
    # 刪除超鏈接標簽
    removeAddr = re.compile(r'<a.*?>|</a>')
    # 把換行標簽轉換為\n
    replaceLine= re.compile(r'<tr>|<div>|</div>|</p>')
    # 把表格製表轉換為\t
    replaceTD = re.compile(r'<td>')
    # 把段落開頭轉換為\n加兩個空格
    replacePara = re.compile('<br><br>|<br>|<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.removeExtraTag, "", x)
        # 使用strip() 方法將前後多餘內容刪除
        return x.strip()
class BDTB:
    #初始化變數,傳入基類地址,傳入是否只看樓主參數
    def __init__(self, baseUrl, onlyLz, floorTag):
        # 基地址
        self.baseUrl = baseUrl
        # 是否只看樓主
        self.onlyLz = '?see_lz=' + str(onlyLz)
        # 實例化替換去除標簽類
        self.tool = Tool()
        # 全局file變數,文件寫入操作對象
        self.file = None
        # 預設標簽,若沒有獲得標題,使用此標題
        self.defaultTitle = u"百度貼吧帖子"
        # 是否寫入樓層信息
        self.floorTag = floorTag
    # 傳入頁碼,獲取該帖子的代碼
    def getPage(self, pageNum):
        try:
            url = self.baseUrl + self.onlyLz + '&pn=' + str(pageNum)
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            return response.read().decode('utf-8')
        except urllib2.URLError,e:
            if hasattr(e, 'code'):
                print u"連接百度貼吧失敗,錯誤編碼:" + e.code
                return None
            if hasattr(e, 'reason'):
                print u"連接百度貼吧失敗,錯誤原因:" + e.reason
                return None

    # 獲取帖子的標題
    def getTitle(self, page):
        pattren = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  ".*?>(.*?)</h3>',re.S)
        items = re.search(pattren, page)
        if items:
            # print items.group(1).strip()
            return items.group(1).strip()
        else:
            return None

    # 提取帖子頁數
    def getPageNum(self, page):
        pattren = re.compile(r'<ul class="l_posts_num">.*?<span class="red">(.*?)</span>',re.S)
        items = re.search(pattren, page)
        if items:
            # print items.group(1)
            return items.group(1).strip()
        else:
            return None
    # 提取正文內容
    def getContent(self, page):
        pattren = re.compile(r'<div id="post_content_.*?>(.*?)</div>.*?<div class="core_reply_tail clearfix">.*?<span class="tail-info">(.*?)</span>.*?<span class="tail-info">(.*?)</span>',re.S)
        items = re.findall(pattren, page)
        contents = []
        for item in items:
            content = []
            title = "\n" + self.tool.replace(item[0]) + "\n"
            floor = item[1]
            writeTime = item[2]
            content.append(title.encode("utf-8"))
            content.append(floor.encode("utf-8"))
            content.append(writeTime.encode("utf-8"))
            contents.append(content)
        return contents
    # 設置文件名字
    def setFileTIltle(self, title):
        if title is not None:
            self.file = open(title + ".txt", "w+")
        else:
            self.file = open(self.defaultTitle + ".txt", "w+")
    # 將內容寫入文件
    def writeData(self, contents):
        for item in contents:
            if self.floorTag == '1':
                floorLineTime = "\n" + item[1] +"-----------------------------\n"+item[2]
                self.file.write(floorLineTime)
            self.file.write(item[0])
            # floorLine = "\n" + item['']
            # print "------------------%s--------------------%s-----------------"%(item[1],item[2])
            # print self.tool.replace(item[0])
        # print self.tool.replace(items[1])
        # print items[1]
    def start(self):
        indexPage = self.getPage(1)
        pageNum = self.getPageNum(indexPage)
        title = self.getTitle(indexPage)
        self.setFileTIltle(title)
        if pageNum == None:
            print "URL已經失效"
        try:
            print "該帖子一共有"+str(pageNum)+""
            for i in range(1, int(pageNum)+1):
                print "正在寫入第" + str(i) + "頁數據"
                page = self.getPage(i)
                contents = self.getContent(page)
                self.writeData(contents)
        except IOError,e:
            print "寫入異常,原因:"+e.message
        finally:
            print "寫入完成"

print u"請輸入帖子代號"
baseUrl = 'http://tieba.baidu.com/p/' + str(raw_input(u"http://tieba.baidu.com/p/"))
seeLZ = raw_input("是否只獲取樓主的帖子是輸入1,否輸入0\n")
floorTag = raw_input("是否寫入樓層與時間信息是輸入1,否輸入0\n")
bdtb = BDTB(baseUrl, seeLZ, floorTag)
bdtb.start()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (一) shiro的SecurityManager類結構為: 總結: 1.SecurityManager主要作用於登錄、登出用創建主題Subject,並繼承自Authenticator身份驗證器和許可權驗證器和sessionManager,這些介面不對外開放,shiro本身自己調用,客戶端使用應該使用 ...
  • http://blog.csdn.net/justmeh/article/details/5844650 ...
  • 工作3個月,第一次加入純後臺的程式改造,程式中,業務流程是有n個確定的對數據檢測項,檢測項有個開關,開了就檢測blablabla,每個檢測項為一個類,內方法不是static。 在原程式中流程為:對所有檢測項目用if判斷其是否為打開,然後實例化,調用方法。這樣的代碼重覆挺多的,能有上500行了,除了各 ...
  • 這是用於序列化的兩個模塊: • json: 用於字元串和python數據類型間進行轉換 • pickle: 用於python特有的類型和python的數據類型間進行轉換 Json模塊提供了四個功能:dumps、dump、loads、load pickle模塊提供了四個功能:dumps、dump、lo ...
  • 我們之前一直都在使用的urlopen,這是一個特殊的opener(也就是模塊幫我們構建好的)。 但是基本的urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高級功能。所以要支持這些功能: 1.使用相差的Handler處理器來創建特定功能的處理器對象; 2.然後通過urllib ...
  • 描述: 有配置文件address_relation.properties,記錄地址關係,有如下數據:ZSSS=ZS%,ZSPD, 封裝到Map代碼如下: 工具類請查看博文:讀取配置文件工具類地址 ...
  • 1.第一個下拉框代碼 <div class="btn-group col-sm-3 col-xs-6 util-btn-margin-bottom-5 quick-search"> <!--快速查詢--> <div class="input-group"> <span class="input-gr ...
  • { CentOS ping命令 分散式部署伺服器時用到ping命令 #ping -c 4 192.168.16.1 //ping4次後結束。 } 使用telnet 查看memcached 運行狀態 查看系統是否已安裝telnetrpm -qa | grep telnettelnet-0.17-48. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...