• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

requests

date: 2021-07-30 excerpt: requestsの使い方

tag: pythonrequests


requestsの使い方

  • pythonのライブラリである
  • http, https経由のコンテンツを取得できる

UserAgent情報を付加する

import requests

headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.136 Safari/537.36"}
with requests.get(url, headers=headers) as r:
    html = r.text

proxyを使用する

  • socks5がよいらしいが、http, httpsプロトコルも使える
  • この資料ではsocks5で使用した場合を記述する

インストール

$ python3 -m pip install requests[socks]

使用例

import requests

with requests.get(url, proxies=dict(http="socks5://user:pass@host:port", https="socks5://user:pass@host:port")) as r:
	html = r.text

取得したコンテンツの文字コードを推定する

with requests.get(url, headers=headers, proxies=proxies) as r:
	r.encoding = r.apparent_encoding
	html = r.text
  • たまに失敗するので明示的に指定できれば確実

取得したコンテンツの文字コードを指定する

sjisに指定する例

with requests.get(url, headers=headers, proxies=proxies) as r:
	r.encoding = "sjis"
	html = r.text

タイムアウトを用いる

proxies = {"https://": "http://miiyuane-rotate:wl7v2md2q5o4@" + random.choice(L)}
try:
    with requests.get(url, proxies=proxies, headers=headers, allow_redirects=False, timeout=10.0) as r:
        html = r.text
except requests.exceptions.Timeout as exc:
    print("timeout") # 何か処理を入れる
    return

マルチプロセスでrequestsを動作させるTIPS

  • マルチプロセスのスケジューラかrequestsの動作の不安定さかの影響で、1リクエストに1プロセスを割り当ててしまうとハングアップしてしまう
  • urlのチャンクを作ってチャンクをプロセスに割り当てるというスタイルを取ると安定する

streamで情報を取得する

  • twitter apiのstream sampleを利用する例
url = "https://api.twitter.com/2/tweets/sample/stream"
bearer_oauth = "..."

r = requests.request("GET", url, auth=bearer_oauth, stream=True)
for line in r.iter_lines():
    if line:
        json_response = json.loads(line)
        print(json.dumps(json_response, indent=4, sort_keys=True))

form submitをpostで再現する

  • シングルページの設計のサイトでポストでデータを送ることでコンテンツを変更する場合、formのデータをpostで送ることで再現できる
  • Google Chromeで事前になんの情報を送信するか調べておく
# postでpageFlg, page, order, limitの情報を送ってコンテンツを描画する仕様
with requests.post("https://xxx.xxx/index.php", data={"pageFlg": "1", "page": "1", "order": "1", "limit": "1000"}) as r:
    text = r.text


pythonrequests Share Tweet