前の記事「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 つのデータを取得し、結果に入力します。
結果の一部:
{'title': '浙江大学付属高校の詠春拳の「先生」はイップ・マンの三代目弟子', 'comments': 618, ' dt': datetime.datetime(2017 , 5, 14, 7, 22), 'source': 'China News Network', 'article': '原題: 浙江大学付属高校が詠春拳「講師」の指導を開始イップ・マン...出典: Qianjiang Evening News、'editor': 'Zhang Di'}
以上が新浪ニュースの詳細ページからのデータキャプチャの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。