質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

7711閲覧

urllib3のhtml取得エラー

bunks

総合スコア30

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/12/20 12:43

python3でurllib3を使ってhtmlを取得しているのですが、サイトによって正しく取得できる場合と取得できない場合があります。

クロームの開発者ツールを使ってhtmlを見てみるとタグ内のテキストも正しく表示されるのですが、urllib3を使って取得したhtmlではタグ内のテキストが開発者ツールと同様のものではないです。

import urllib3 from bs4 import BeautifulSoup url = "" http = urllib3.PoolManager() response = http.request('GET', url) soup = BeautifulSoup(response.data.decode('utf-8'), "html5lib") print(soup)

以上のようなコードを実行したところ、以下のような文章が出たので最後のURLに書いてある処理を行いました。しかし、それでも正しいhtmlが表示できません。

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

例えば、Qiitaなどでは正しく表示されますが,Locariなどでは正しく表示されません。

どのようにすれば正しいhtmlを得られるでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Cloudflareなるものによりアクセス制御されているようですね。
より高機能なRequests: 人間のためのHTTPを利用することにより、おそらくブラウザで表示されるものと同じ結果が得られるようです。

Python

1import urllib3 2import requests 3#from bs4 import BeautifulSoup 4 5urllib3.disable_warnings() 6http = urllib3.PoolManager() 7 8for idx, url in enumerate(['https://www.example.com','https://locari.jp/']): 9 10 # urllib3 11 res = http.request('GET', url) 12 dat = res.data.decode('utf-8') 13 with open('dat_url%d.html'%idx, 'w', encoding='utf8') as f: 14 f.write(dat) 15 16 # requests 17 res = requests.get(url) 18 dat = res.text 19 with open('dat_req%d.html'%idx, 'w', encoding='utf8') as f: 20 f.write(dat)

投稿2017/12/21 00:59

can110

総合スコア38268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bunks

2017/12/23 04:15

ご回答のようにrequestsを用い、 res = requests.get(url) soup = BeautifulSoup(res.text, "html5lib") とすることでfindAllなどのメソッドも使え、スクレイピングがうまくいきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問