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()
糗事百科クローラーの実装取得結果の表示: