天天看點

python簡易爬蟲練習:搜狐網新聞爬取

python爬蟲:搜狐網新聞爬取

python爬蟲練習:搜狐網新聞爬取

幫朋友寫了一個課程設計,目的是獲得新聞頁面的标題、時間以及正文内容。

寫的很簡單,并沒有很複雜的知識,應該很好了解。

首先是導入我們需要的各種庫,其中requests是第三方庫,記得用pip安裝一下

import requests
    import re
    import os      

首先要從搜狐首頁面上獲得所需要的所有html代碼

# 獲得搜狐頁面的内容
def get_all_url(url):
    try:
        # 擷取總的html内容
        html = getHTMLText(url)
        return html
    except:
        print("failed connect")


# 獲得html内容,套路内容
def getHTMLText(url):
    try:
        # requests爬蟲的正常操作,通路獲得傳回
        r = requests.get(url)
        # 判斷是否成功?
        r.raise_for_status()
        # 改變編碼方式,轉為UTF-8
        r.encoding = r.apparent_encoding
        # 傳回html正文内容
        return r.text
    except:
        return ''      

然後我們需要分析出html中所有的超連結,這裡需要調用一下re庫。

如果不會正規表達式的話,自己去學,這裡不多講了。

需要注意的是,這裡獲得的是所有的url連結,并沒有分析該url是否是新聞的url。當然,後面有判斷

# 分析内容,獲得我需要的連結們
def parsePage(html):
    plt = []
    try:
        # findall函數的意思:(pattern, string),将所有比對項組成一個清單,并傳回該清單
        # 比對符合url連結格式的所有内容
        plt = re.findall('http://www\.sohu\.com(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', html)

    except:
        print("介個地方出錯了")
    print(plt)
    return plt      

這裡同樣用re庫分析出新聞的标題,發出時間以及新聞正文内容。

注意不同的網站有不同的html習慣寫法,寫爬蟲的時候肯定是要花一些時間來分析網頁,按F12就可以檢視所有的html代碼了。

由于我不确定圖檔之類的算不算正文,是以我就把正文的一大坨東西全部拿了進來。

# 正則分析獲得時間與标題,嘻嘻
def title_and_time(html):
    tat = []
    try:
        # findall函數的意思:(pattern, string),将所有比對項組成一個清單,并傳回該清單
        # 獲得時間,若無法比對就傳回空清單
        time = re.findall('dateUpdate" content="(.*)" />', html)
        # 獲得标題,若無法比對就傳回空清單
        title = re.findall("title>(.*)</title", html)
        # 文章正文内容,若無法比對就傳回空清單
        article = re.findall('<article class="article" id="mp-editor">([\s\S]*)</article>', html)
        # 三者組成一個清單,傳回去嘻嘻
        # 若其中有的為空清單,則不占用位置
        # 是以如果是正規的新聞頁面,tat的長度len應該是3
        tat = title + time + article
    except:
        print("捏個地方出錯了")
    return tat      

以上就是我們所需要的所有方法了,下面我把全部代碼放出來,供大家參考。

# code="utf-8"
# 人生苦短,我用python
# 轉行不易,請多鼓勵


import requests
import re
import os


# 剛過完61兒童節的二十多歲的小朋友們上車啦,here we go



# 獲得搜狐頁面的内容
def get_all_url(url):
    try:
        # 擷取總的html内容
        html = getHTMLText(url)
        return html
    except:
        print("failed connect")


# 獲得html内容,套路内容
def getHTMLText(url):
    try:
        # requests爬蟲的正常操作,通路獲得傳回
        r = requests.get(url)
        # 判斷是否成功?
        r.raise_for_status()
        # 改變編碼方式,轉為UTF-8
        r.encoding = r.apparent_encoding
        # 傳回html正文内容
        return r.text
    except:
        return ''

# 分析内容,獲得我需要的連結們
def parsePage(html):
    plt = []
    try:
        # findall函數的意思:(pattern, string),将所有比對項組成一個清單,并傳回該清單
        # 比對符合url連結格式的所有内容
        plt = re.findall('http://www\.sohu\.com(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', html)

    except:
        print("介個地方出錯了")
    print(plt)
    return plt



# 正則分析獲得時間與标題,嘻嘻
def title_and_time(html):
    tat = []
    try:
        # findall函數的意思:(pattern, string),将所有比對項組成一個清單,并傳回該清單
        # 獲得時間,若無法比對就傳回空清單
        time = re.findall('dateUpdate" content="(.*)" />', html)
        # 獲得标題,若無法比對就傳回空清單
        title = re.findall("title>(.*)</title", html)
        # 文章正文内容,若無法比對就傳回空清單
        article = re.findall('<article class="article" id="mp-editor">([\s\S]*)</article>', html)
        # 三者組成一個清單,傳回去嘻嘻
        # 若其中有的為空清單,則不占用位置
        # 是以如果是正規的新聞頁面,tat的長度len應該是3
        tat = title + time + article
    except:
        print("捏個地方出錯了")
    return tat




# 以下是正式開始操作主函數

def main():
    # 開始通路搜狐網,并獲得對應html代碼
    html = get_all_url("http://www.sohu.com/")
    # 正規表達式分析取出新聞url連結
    sp_url = parsePage(html)
    # 設定一個清單,用于存儲新聞标題以及時間
    answer = []

    # 判斷儲存的路徑存在不 不存在就建立一個呗嘻嘻嘻嘻
    path = "新聞//"
    # 如果路徑存在則傳回True,否則傳回false
    isExists = os.path.exists(path)

    # 判斷結果
    if not isExists:
        # 如果不存在則建立目錄
        # 建立目錄操作函數
        os.makedirs(path)

        print(path + ' 建立成功')
    else:
        # 如果目錄存在則不建立,并提示目錄已存在
        print(path + ' 目錄已存在')

    # 周遊每一個新聞url連結
    for url in sp_url:
        # 獲得每個新聞頁面的html代碼
        html_sp = get_all_url(url)
        # 獲得每個頁面的标題以及時間
        title_time = title_and_time(html_sp)

        # 設定一個臨時變量
        tt=0
        # 如果是正常新聞的話,則len==3,即可對tt重新指派
        if(len(title_time) == 3):
            tt = title_time[0] + "\n" + title_time[1] + "\n" + title_time[2] + "\n"

        # 判斷一下是正常新聞,即可寫入answer
        if tt != 0:
            print(tt)  # 程式運作期間随便輸出點東西,不然就很無聊
            answer.append(tt)   # 将這個新聞作為一個字元串element添加到answer最後


            # 寫入檔案
            try:
                # 每個新聞的題目自動生成一個txt檔案
                with open("新聞//" + title_time[0] + ".txt", "w+") as f:
                    # 參數為清單,writelines可以将每一個元素寫入txt
                    f.writelines(answer)
                    # 關閉檔案,其實不寫也一樣的
                    f.close()
            except:
                pass


# 主程式運作
if __name__ == '__main__':
    main()


# 輸出一句話,告訴我結束了
print("搜狐網新聞爬取已完成")

# 完工