首頁 >後端開發 >Python教學 >新浪新聞詳情頁的資料抓取實例

新浪新聞詳情頁的資料抓取實例

PHP中文网
PHP中文网原創
2017-06-21 15:23:291373瀏覽

上一篇文章《Python爬蟲:抓取新浪新聞數據》詳細解說瞭如何抓取新浪新聞詳情頁的相關數據,但代碼的構建不利於後續擴展,每次抓取新的詳情頁時都需要重新寫一遍,因此,我們需要將其整理成函數,方便直接呼叫。

詳情頁抓取的6個資料:新聞標題、評論數、時間、來源、內文、責任編輯。

首先,我們先將評論數整理成函數形式表示:

 1 import requests 2 import json 3 import re 4  5 comments_url = '{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20' 6  7 def getCommentsCount(newsURL): 8     ID = re.search('doc-i(.+).shtml', newsURL) 9     newsID = ID.group(1)10     commentsURL = requests.get(comments_url.format(newsID))11     commentsTotal = json.loads(commentsURL.text.strip('var data='))12     return commentsTotal['result']['count']['total']13 14 news = ''15 print(getCommentsCount(news))

第5行comments_url,在上一篇中,我們知道評論連結中有新聞ID,不同新聞的評論數透過該新聞ID的變換而變換,因此我們將其格式化,新聞ID處以大括號{}來替代;

#定義獲取評論數的函數getCommentsCount,透過正規尋找符合的新聞ID,然後將取得的新聞連結儲存進變數commentsURL中,透過解碼JS來得到最終的註解數commentsTotal;

然後,我們只需輸入新的新聞鏈接,便可直接呼叫函數getCommentsCount來取得評論數。

最後,我們將需要抓取的6個資料均整理到一個函數getNewsDetail中。如下:

 1 from bs4 import BeautifulSoup 2 import requests 3 from datetime import datetime 4 import json 5 import re 6  7 comments_url = '{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20' 8  9 def getCommentsCount(newsURL):10     ID = re.search('doc-i(.+).shtml', newsURL)11     newsID = ID.group(1)12     commentsURL = requests.get(comments_url.format(newsID))13     commentsTotal = json.loads(commentsURL.text.strip('var data='))14     return commentsTotal['result']['count']['total']15 16 # news = 'http://news.sina.com.cn/c/nd/2017-05-14/doc-ifyfeius7904403.shtml'17 # print(getCommentsCount(news))18 19 def getNewsDetail(news_url):20     result = {}21     web_data = requests.get(news_url)22     web_data.encoding = 'utf-8'23     soup = BeautifulSoup(web_data.text,'lxml')24     result['title'] = soup.select('#artibodyTitle')[0].text25     result['comments'] = getCommentsCount(news_url)26     time = soup.select('.time-source')[0].contents[0].strip()27     result['dt'] = datetime.strptime(time,'%Y年%m月%d日%H:%M')28     result['source'] = soup.select('.time-source span span a')[0].text29     result['article'] = ' '.join([p.text.strip() for p in soup.select('#artibody p')[:-1]])30     result['editor'] = soup.select('.article-editor')[0].text.lstrip('责任编辑:')31     return result32 33 print(getNewsDetail(''))

在函數getNewsDetail中,取得需要抓取的6個數據,放在result中:

  • result['title']是取得新聞標題;

  • resul['comments']是取得註解數,可以直接呼叫我們開頭定義的註解數函數getCommentsCount ;

  • result['dt']是獲取時間;result['source'] 是獲取來源;

  • result['article' ]是取得正文;

  • result['editor']是取得責任編輯。

而後輸入自己想要獲取數據的新聞鏈接,調用該函數即可。

部分運行結果:

{'title': '浙大附中開課教詠春「教頭」繫葉問第三代弟子', ' comments': 618, 'dt': datetime.datetime(2017, 5, 14, 7, 22), 'source': '中國新聞網', 'article': '原標題:浙大附中開課教詠春「教頭「系葉問......來源:錢江晚報', 'editor': '張迪'}

#

以上是新浪新聞詳情頁的資料抓取實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:物件導向進階下一篇:物件導向進階