スクレイピング初心者向けです。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', # 1=芝, 2=ダート, 3=障害
'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' # エンコーディングは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',
},
# euc-jpでURLエンコード(デフォルトはutf-8)
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通信に関する基礎的な知識、あとはエンコーディングに関する知識が少し必要です。