

<https://www.coin-laundry.co.jp/userp/shop_detail/10000543.html>  
上記サイトから稼働状況のテーブルを抜き出したいと考えています。

テーブル部分がjavascriptで生成されているようなので、headlessブラウザ（Chrome)をseleniumから操作して取得しようとコードを書いてみました。

[code]

    import time
    
    from selenium import webdriver
    from bs4 import BeautifulSoup
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--disable-desktop-notifications')
    options.add_argument("--disable-extensions")
    options.add_argument('--allow-running-insecure-content')
    options.add_argument('--disable-web-security')
    options.add_argument('--no-sandbox')
    options.add_argument('--lang=ja')
    options.add_argument('--window-size=1200x600')
    driver = webdriver.Chrome(chrome_options=options)
    
    # URLを開く
    TARGET = 'https://www.coin-laundry.co.jp/userp/shop_detail/10000543.html'
    
    driver.get(TARGET)
    
    time.sleep(2)  # とりあえず適当に2秒待つ。
    
    page_source = driver.page_source
    html = BeautifulSoup(page_source, 'html.parser')
    print(html)
    
    driver.quit()  # ブラウザーを終了する。
    
[/code]

このコードを実行すると、最初に書いたサイトに限り

[code]

    <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
    
[/code]

としか返ってきません。  
javascriptをレンダリングする前のHTMLも取得できません。  
time.sleep()の時間も色々変えてみましたが、結果は同じ。  
TARGETの部分を他のURLにした場合は、ちゃんとHTMLコードが出力されます。

selenium + Phantomjs2.1.1 や casperjs +
Phantomjs2.1.1も試してみましたが、結果は同様でうまく取得できませんでした。

実行環境は  
サーバ AWS EC2  
OS Ubuntu 16.04  
Python 3.5.2  
selenium  
Google Chrome 60.0.3112.90  
BeautifulSoup4  
node 8.2.1

最初はPhantomjsを使ってやっていたのですが、上記サイトだけどうしても取得できませんでした。ブラウザの問題かと思い、リモートデスクトップでUbuntu上のChromeでアクセスしたところ、普通に表示ました。なのでChromeのHeadlessモードなら通常モードと同じように取得できると思ったのですが・・・。

八方塞がりで途方に暮れている次第です。  
よろしくお願いいたします。


CC BY-SA 3.0
2017-08-07T15:01:49.157
37004
2023-08-14T06:02:05.217
2017-08-07T15:06:16.890
19110
24771
question
google-chrome python3 selenium web-scraping phantomjs
python + selenium + chromeでHTMLを読み込みたい


https接続に失敗していないでしょうか。  
Seleniumで動かす前に、まずその環境のブラウザーと、Seleniumの実行ユーザーで、本当にエラー無く対象のページにアクセスできているか確認してみましょう。

> リモートデスクトップでUbuntu上のChromeでアクセスしたところ、普通に表示ました。

おそらくここに見落としがあります。  
件のサイトへのアクセス時には中間CA証明書が必要になりますが、これがUbuntuにインストールされていないので、httpsでの接続が失敗しているはずです。  
対応する中間CA証明書を、Linux版Chromiumでの管理手順にしたがいインストールしましょう。  
<https://chromium.googlesource.com/chromium/src/+/lkcr/docs/linux_cert_management.md>


CC BY-SA 3.0
2017-08-10T01:09:58.927
37081
2017-08-11T00:03:27.780
2017-08-11T00:03:27.780
13695
13695
37004
answer


Headless
Chromeを簡単に操作できるGoogle純正のNodeライブラリ「Puppeteer」が公開されています。それのPython移植版が「[pyppeteer](https://github.com/miyakogi/pyppeteer)」です。Seleniumを使うよりもかなり使いやすいと思います。

インストールは、pipでインストールできます。

[code]

    python3 -m pip install pyppeteer
    
[/code]

Chromium (~100MB)の方は、事前にインストールする必要はなく、実際にプログラムが動作するときに自動的にダウンロードされてインストールされます。

pyppeteerを使うとhtmlの取得は以下のようなコードでできています。このケースでも使えるのではないかと思います。Google
Chromeのインストールの必要がないので、サーバ環境でも使いやすいと思います。

[code]

    import asyncio
    from pyppeteer import launch
    
    
    async def main():
        TARGET = 'example.com'
        browser = await launch()
        page = await browser.newPage()
        await page.goto(TARGET)
        # スクリーンショットの取得
        await page.screenshot({'path': 'example.png'})
    
        html = await page.content()
        await browser.close()
    
    asyncio.get_event_loop().run_until_complete(main())
    
[/code]


CC BY-SA 3.0
2018-04-24T16:09:17.123
43533
2018-04-24T16:09:17.123
15171
37004
answer