ホームページ >バックエンド開発 >Python チュートリアル >新浪ニュースの詳細ページからのデータキャプチャの例

新浪ニュースの詳細ページからのデータキャプチャの例

PHP中文网
PHP中文网オリジナル
2017-06-21 15:23:291374ブラウズ

前の記事「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 を直接呼び出してコメント数を取得するだけです。

最後に、関数 getNewsDetail にキャプチャする必要がある 6 つのデータを整理します。次のように:

 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['title'] はニュースのタイトルを取得します。
  • resul[ 'comments'] は、最初に定義したコメント数関数 getCommentsCount を直接呼び出すことができます。
  • result['dt'] は取得時間です。 source'] は取得元です;
  • result ['article'] は本文を取得します;
  • result['editor'] は担当編集者を取得します。
  • 次に、データを取得したいニュースリンクを入力し、この関数を呼び出します。

結果の一部:

{'title': '浙江大学付属高校の詠春拳の「先生」はイップ・マンの三代目弟子', 'comments': 618, ' dt': datetime.datetime(2017 , 5, 14, 7, 22), 'source': 'China News Network', 'article': '原題: 浙江大学付属高校が詠春拳「講師」の指導を開始イップ・マン...出典: Qianjiang Evening News、'editor': 'Zhang Di'}

以上が新浪ニュースの詳細ページからのデータキャプチャの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。