Pythonのrequestsライブラリを使って糗事百科の投稿を取得する

Pythonの標準ライブラリであるurllib2は多くの機能を提供しているが、APIの使い勝手が悪く感じられる場合がある。一方でRequestsライブラリは「HTTP for Humans」という名称を持ち、より簡潔で便利な使い方を提供する。Requestsはurllib2のすべての機能を継承しており、HTTP接続の維持やプーリング、Cookieによるセッション管理、ファイルアップロード、レスポンスの文字エンコーディング自動判定、国際化URLおよびPOSTデータの自動エンコードといった機能をサポートしている。

糗事百科サイト(https://www.qiushibaike.com/)から投稿データを収集するには、2つの処理ステップが必要である。まず全体のHTMLページをダウンロードし、その後正規表現を使って不要な文字列を除去する。

最初の解析処理:

re.compile('<div class="content">.*?</div>', re.S) # 投稿内容を含むタグを抽出

次の解析処理:

re.compile(r'<.*?>|&(.*?);|\s|  ') # 漢字以外のすべての文字を削除

全体のコードは以下の通り:

 1 # -*- coding:utf-8 -*-
 2 #  2018/9/13  12:00
 3 import requests
 4 import re
 5 import time
 6 from requests.packages.urllib3.poolmanager import PoolManager
 7 from requests.packages.urllib3.exceptions import InsecureRequestWarning,InsecurePlatformWarning
 8 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 9 requests.packages.urllib3.disable_warnings(InsecurePlatformWarning)
10 
11 class QiuBaiCrawler(object):
12     """糗事百科投稿クローラー"""
13 
14     def __init__(self):
15         self.target_url = "https://www.qiushibaike.com/hot/"
16         self.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
17         self.extract_pattern = re.compile('<div class="content">.*?</div>', re.S)
18         self.cleanup_pattern = re.compile(r'<.*?>|&(.*?);|\s|  ')
19     # 初回の解析 <div class ="content" >(.*?)</div>
20     def fetch_page(self, url):
21         """HTTPリクエストを送信"""
22         time.sleep(2)
23         try:
24             response = requests.get(url, headers=self.headers)
25             return response.content
26         except Exception, err:
27             print err
28 
29     def save_to_file(self, contents, page_num):
30         """データをファイルに保存"""
31         with open('qiushiduanzi1.txt', 'a') as file:
32             title = "第" + str(page_num) + "ページの投稿\n"
33             print  title
34             file.write(title)
35             for item in contents:
36                 cleaned_content = self.cleanup_pattern.sub('', item)
37                 file.write(cleaned_content)
38                 file.write("\n\n\n")
39 
40     def parse_content(self, html_data):
41         """HTMLからデータを抽出"""
42         extracted_list = self.extract_pattern.findall(html_data)
43         return extracted_list
44 
45     def run_crawling(self):
46         """クローリングプロセスを開始"""
47         for page in range(1, 10):
48             # URLを構築
49             url = self.target_url + "page/" + str(page) + '/' + '.html'
50 
50             # リクエストを送信
51             raw_data = self.fetch_page(url)
52 
52             # データを解析
53             parsed_data = self.parse_content(raw_data)
54 
54             # データを保存
55             self.save_to_file(parsed_data, page)
56 
57 if __name__ == '__main__':
58 
59     crawler = QiuBaiCrawler()
60     crawler.run_crawling()

糗事百科クローラーの実装取得結果の表示:

タグ: Python requests クローラー 正規表現 Webスクレイピング

5月17日 01:05 投稿