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("搜狐網新聞爬取已完成")
# 完工