🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

613閲覧

スクレイピングでhtmlファイルを早く読み込みたい

kopo

総合スコア16

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/12/23 01:07

こんにちは。

pythonでスクレイピングをするプログラムを作っています。
スクレイピング対象のwebサイトに多数のスクリプトがあるため(だと思うのですが)、1回のgetリクエストに対し、レスポンスを得られるまで10秒弱かかっています。
htmlファイルだけが欲しいので、必要なものは0.5秒程度で得られることは分かっています。

受信が終わるまで通信するのではなく、htmlファイルが受信し終わったら通信をやめるためにはどのような処理をすれば良いか教えていただけませんか?

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

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

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

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

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

guest

回答1

0

requests_htmlなどを使えば、割と高機能なスクレイピングが可能です。pipで簡単にインストールして実行できます。以下のようにすれば、ページを取得する際にセレクタを指定して取り出せます。

from requests_html import HTMLSession session = HTMLSession() resp = session.get("hogehoge") title = resp.html.find('html',first=True) title.text

参考資料
https://blog.ikedaosushi.com/entry/2019/09/15/162445

投稿2019/12/23 04:17

bamboo-nova

総合スコア1408

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

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

kopo

2019/12/23 04:36

ありがとうございます。 楽天市場のようなサイトだと顕著なのですが、chromeのデベロッパーツールで見るとhtmlファイルがすでに得られている時間になってもプログラムでは受信終了待ちの状態になっています。 このような状態で本文のhtmlファイルを取り出したい、というのが質問の意図でした。 質問が大きくなってしまいますが、そもそもhtmlファイル自体の受信は極短時間で行われているし、なぜこんなに時間がかかるのだろうと素人考えでは思ってしまいます。 スクレイピング自体に関しては(参考が多いという理由で)現状beautifulsoupを使っています。
kopo

2019/12/23 04:56

[追記] 参考資料さらっと見ました。このライブラリ自体知りませんでしたが、非同期処理などやりたいことが相当できそうなので詳しく見てみます。
bamboo-nova

2019/12/23 06:53

beautifulsoupで非同期処理をしてスクレイピングを行う他の方法としてはasyncioなどがあります。使ったことがないですが...。以下のようにすれば、htmlタグの中身は取得できます。 import asyncio import aiohttp from bs4 import BeautifulSoup async def scraping(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: html = await response.text() soup = BeautifulSoup(html, 'html.parser') result = [] result = soup.find_all('html') return result if __name__ == "__main__": url = 'https://www.rakuten.co.jp/' loop = asyncio.get_event_loop() done, pending = loop.run_until_complete(asyncio.wait([scraping(url)])) result = [d.result() for d in done]
kopo

2019/12/26 16:06

遅レス申し訳ないです。 私の考えがあっているかわかりませんが、 bamboo-novaさんのスクリプトだとレスポンスの受信終了まで待ってからresultに代入していると思います。 非同期処理などの話は一旦置いて元の質問に戻りますが、 したいこと:htmlファイルだけをいち早く読み込みたい 現状:aiohttpとrequestsでgetリクエストを送信するスクリプトを書いた。chromeの開発者ツールで見ると、私が欲しいhtmlファイルは100ms時点で受信完了しているにもかかわらず、スクリプトを実行すると10秒弱時間がかかっている。 知りたいこと:requestsやaiohttpでgetリクエストを送信すると、関連するjsや画像ファイルなどすべてを受信するまで処理が終わらないのでしょうか?また、途中でhtmlファイルのみ取り出す方法はありますか? 何度も本当に申し訳ないです。 うまく聞けるよう精進します。
bamboo-nova

2019/12/27 06:07

https://steakrecords.com/ja/759220-enable-disable-javascript-using-selenium-webdriver-ruby-selenium-webdriver.html https://www.code-adviser.com/detail_1285917 https://chida09.com/selenium-javascript/ kopoさん 迅速に質問の意図を理解できなくて大変申し訳ありませんでした。自分もそちらに関しては経験がなかったので調べてみたのですが、上記のようなサイトを見つけました。 firefoxとseleniumを組み合わせれば、javascriptを無効にした状態でスクレイピングなどができて応用が効くみたいなので、こちらを試すと速度が向上すると思います...。あまりお力になれず、ご迷惑をお掛けします。
kopo

2019/12/27 06:43

早速ありがとうございます。 後ほどしっかり読んで、結果を報告します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問