スクレイピング初心者向けです。netkeiba.com をスクレイピングする機会があって、ちょっと面倒だったのでまとめときます。ポイントはPOSTリクエストとエンコーディングです。GETリクエストとは違い、POSTリクエストはURLだけで情報を取得するわけではないので、裏に隠れてるパラメータをブラウザの開発者ツールを使って探し出さなければいけません。submit()
する感じだったらヘッダーにcontent-type: application/x-www-form-urlencoded
をつけてリクエストbodyにurlencodeしたパラメータを入れてPOSTします。
また、このサイトはエンコーディングがちょっと変わっててeuc-jp
だったので、これはハマりポイントです。レスポンスをeuc-jp
でデコードするのはいいとして、urllib.parse.urlencode
はデフォルトがutf-8
なのでこれもeuc-jp
にする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import requests import bs4 import urllib.parse
req = requests.post( url='https://db.netkeiba.com/', headers={ 'content-type': 'application/x-www-form-urlencoded', }, data=urllib.parse.urlencode({ 'pid': 'race_list', 'word': '', 'track[]': '1', 'start_year': 'none', 'start_mon': 'none', 'end_year': 'none', 'end_mon': 'none', 'jyo[]': '01', 'kyori_min': '', 'kyori_max': '', 'sort': 'date', 'list': '20' }) )
req.encoding = 'euc-jp' search_result = req.text search_result_doc = bs4.BeautifulSoup(search_result, 'lxml')
data = { input_elem['name']: input_elem['value'] for input_elem in search_result_doc.select('form[name=sort] > input') } data['page'] = '2'
req = requests.post( url='https://db.netkeiba.com/', headers={ 'content-type': 'application/x-www-form-urlencoded', }, data=urllib.parse.urlencode(data, encoding='euc-jp') )
req.encoding = 'euc-jp' search_result_page2 = req.text
with open('result.html', 'wt', encoding='utf-8') as f: f.write(search_result_page2)
|
面倒くさいレベルは中ですかね。Pythonの標準的な知識、HTMLに関する詳しい知識、HTTP通信に関する基礎的な知識、あとはエンコーディングに関する知識が少し必要です。