日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

經驗拾憶(純手工)=> Python版-Docker使用selenium簡單

系統 2087 0

Dockerfile內容如下

          
            FROM python
RUN pip install -i http://pypi.douban.com/simple \
    requests selenium retrying --trusted-host pypi.douban.com
          
        

docker-compose.yaml內容如下

          
            version: "3.7"
services:
  myspider:
    build: .
    volumes:  # 數據卷映射
      - /root/mycode:/root/mycode
    command: python /root/mycode/1.py
    # 依賴下方 selenium服務,注意此依賴僅僅能做到
    # selenium服務先啟動, myspider服務后啟動(有的服務內部程序啟動的快,有的慢)
    # 根本程度上還是解決不了 完全依賴 的 問題, 因此可以用延時處理等方法
    depends_on:
      - selenium
  selenium:
    image: selenium/standalone-chrome # 拉取鏡像完成自動化全套配置
    ports:
      - "4444:4444"
    shm_size: 2g  # 設置主機共享內存2g
    hostname: selenium    # 其他容器可以用此名來訪問 eg: http://selenium:4444/

          
        

爬蟲腳本代碼1.py如下

          
            import requests
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
from retrying import retry

# 注:docker-compose.yaml中的depends_on那里提到過:
# 服務可以起到先后依賴的效果。
# 而服務中的啟動程序,并不能達到完全的依賴(啟動速度相當的情況下,誰快誰慢運氣成分)

# 可以通過加延時來控制先后順序
# import time    
# time.sleep(3)    # 這種睡眠延時方式,或多或少不太精確,可以用下面的 retrying代替之

# 也可以通過 retrying模塊裝飾實現
# retrying用法,可參考  https://segmentfault.com/a/1190000019301761#articleHeader17
@retry(
    stop_max_attempt_number = 10000,
    stop_max_delay = 10*1000,
)
def verify_request():
    response = requests.get("http://selenium:4444", timeout=0.5)
    print(response)
verify_request()

# 下面基本上是連接Docker Selenium服務的固定寫法,可當作模板套
options = Options()
options.add_argument('--headless')
with webdriver.Remote(
    command_executor='http://selenium:4444/wd/hub',   # selenium為docker-compose的host名
    desired_capabilities=DesiredCapabilities.CHROME,
    options=options
) as driver:
    driver.get('http://www.baidu.com')
    # 這里使用絕對路徑, 否則數據卷映射失敗
    # 映射部分在上面 docker-compose.yaml 的 volumes部分
    with open('/root/mycode/test.html', 'w') as f:    
        f.write(driver.page_source)
        print('寫入成功')

          
        

踩坑

          
            selenium 因為有服務端程序,所以我們可以在遠程"云服務器用Docker容器部署"
容器部署后。。。。
"只能云服務器中訪問,
不能在遠程服務器訪問。
(
    其實根本不需要在遠程服務器訪問的,某種邪惡的念頭,讓我走了彎路。。。一根筋想要遠程訪問
    其實代碼同是部署在容器中的,容器互通是完全OK的。
    但如果你也想試試遠程訪問, 它卻真的無法訪問。。。。。。。。。。。
)"

(
    我的認知里,既然云服務器宿主機可以訪問容器內部 啟動的服務端程序 
    而遠程服務器不能訪問容器內部的  啟動的服務端程序。。。。那一定是容器和宿主機連通配置問題阿。
    帶著這個思路,找了很久很久, 然并卵。。。
)

實在沒辦法了。。科學上網,搜一下這個問題的解決方案吧。
后來無意中發現,客戶端現在居然可以連上了。。 
后來測試,哇, 果然是 需要科學上網才能 遠程訪問到,此服務端。。。

但我現在還沒有明白,為什么我云服務器宿主機, 不需要科學上網,也能成功訪問內部容器的服務端??
(雖然這個疑惑沒有必要)
          
        

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黎城县| 苏尼特右旗| 临西县| 金平| 庆阳市| 澳门| 天台县| 泰顺县| 滁州市| 二手房| 海晏县| 饶河县| 洱源县| 澳门| 扎鲁特旗| 大埔区| 金川县| 平潭县| 阿克| 邢台市| 余干县| 聂荣县| 卓尼县| 康马县| 宜兰县| 阿拉尔市| 阜新市| 宜都市| 湛江市| 子长县| 陕西省| 蓬溪县| 澄迈县| 外汇| 皮山县| 玛纳斯县| 天镇县| 唐山市| 浦城县| 固安县| 武定县|