在linux centos7上通過selenium、chromedriver實現(xiàn)網(wǎng)站(京東、西集、考拉)自動簽到
centos7安裝chrome
騰訊云服務(wù)器敏储,操作系統(tǒng)centos7.4,安裝chrome使用npm方式朋鞍。
步驟如下:
- 去https://www.chrome64bit.com/index.php/google-chrome-64-bit-for-linux下載包 https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
- 安裝rz sz命令: sudo yum install lrzsz -y
- 上傳安裝包已添,安裝以下依賴:
- yum -y install redhat-lsb
- yum install libXss* -y
- yum install libappindicator-gtk3
- 解壓安裝chrome:rpm -ivh google-chrome-stable_current_x86_64.rpm
chrome默認(rèn)安裝目錄/opt/google/chrome
可以用如下命令測試是否安裝成功:google-chrome-stable --no-sandbox --headless --disable-gpu --screenshot https://www.baidu.com/
安裝成功會在當(dāng)前目錄生成百度首頁截圖(會報一個錯,但沒什么影響滥酥,是個缺少UI的提示)更舞,將截圖下載到windows機(jī)器,打開看到字體都是亂碼恨狈。這個亂碼對后來的腳本運行造成了很大誤導(dǎo)疏哗。后面會詳說。
遇到的問題:
- 缺少相關(guān)依賴禾怠,逐個進(jìn)行安裝
- 現(xiàn)在chrome最低支持centos7。centos6上的一些安裝腳本或方案均已失效贝搁,本想在公司測試機(jī)6.9上安裝吗氏,搜了一些資料最后發(fā)現(xiàn)是徒勞。甚至之前在6上能繞過一些限制安裝chrome的腳本的作者在他網(wǎng)站上聲明雷逆,該腳本已死弦讽,不要再聯(lián)系他了。
- 7上的一些依賴都是無法在6上安裝的膀哲,yum找不到對應(yīng)的庫
- centos6可以考慮安裝chromium
安裝chromedriver
需要注意的是chromedriver必須要與chrome版本對應(yīng)往产,否則不能正常工作。我這里安裝的是chrome68某宪,對應(yīng)的是chromedriver版本是2.41
對應(yīng)關(guān)系和下載地址仿村,百度就可以看到。下面地址僅供參考兴喂,隨時失效
測試chromedriver:
[root@VM_0_11_centos chrome]# ./chromedriver
Starting ChromeDriver 2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706) on port 9515
Only local connections are allowed.
如上說明啟動成功蔼囊。這里./chromediver --help可以查看命令使用說明。如果有報錯信息衣迷,可以加上參數(shù)./chromedriver --verbose輸出詳細(xì)日志畏鼓。
我在這里遇到一個問題,查了很久壶谒,運行./chromedriver命令后云矫,一直報錯,報一個[SERVER]中間一長串英文(99)汗菜,記不住了让禀,查了很久無果挑社,最后打開verbose參數(shù),提示了一個IPV6什么的錯誤堆缘,就把系統(tǒng)的ipv6地址設(shè)置打開了滔灶,命令是:sysctl -w net.ipv6.conf.all.disable_ipv6=0,之后就不再報錯了吼肥。但后來通過selenium運行的時候發(fā)現(xiàn)录平,不必理會該報錯。
運行selenium程序
此處值得說明是缀皱,chromeDriver需要設(shè)置一些options斗这,代碼如下:
System.setProperty("webdriver.chrome.driver", "/opt/google/chrome/chromedriver");
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
options.addArguments("--disable-gpu");
options.addArguments("--window-size=1920,1080");
ChromeDriver driver = new ChromeDriver(options);
遇到的問題
現(xiàn)象:xiji網(wǎng)可以正常登錄,但kaola啤斗、jd就失敗表箭,登錄不成功
結(jié)論:某些網(wǎng)站有安全驗證機(jī)制,比如網(wǎng)易钮莲,如果登錄IP非常用IP免钻,會彈出驗證碼。京東則會有一個中間頁提示安全信息崔拥。
說說錯誤
考拉的問題:
因為xiji的成功极舔,加上截圖里的亂碼,一直以為是字符編碼的問題链瓦,導(dǎo)致用戶名密碼錯誤拆魏,服務(wù)器不認(rèn)。于是又是設(shè)置系統(tǒng)語言慈俯,又是安裝字體渤刃,設(shè)置java文件編碼,設(shè)置都沒有效果贴膘。
京東的問題:
京東登錄失敗的問題在于卖子,用用戶名登陸后跳到了一個中間頁,提示有安全風(fēng)險步鉴,要我去綁定手機(jī)揪胃,但我手機(jī)已經(jīng)綁定了,如果直接用手機(jī)號+密碼登錄就沒問題氛琢。估計也是IP變化造成的問題喊递。
下面我說說怎么定位問題的。
chrome remote debug
這是chrome的一個debug功能阳似,可以用來在別的機(jī)器或chrome里debug無頭chrome胡野。
輸入命令:
STEP1:在遠(yuǎn)程機(jī)器(云服務(wù)器)上執(zhí)行:
google-chrome-stable --no-sandbox --headless --disable-gpu --remote-debugging-port=9222 https://m.kaola.com/login.html
如此就在9222上監(jiān)聽了chrome的debug端口
STEP2:這里需要注意禁筏,上述操作只是chrome在本地暴露一個地址妆丘,遠(yuǎn)程是無法訪問的焰薄,在windows機(jī)器上打開http://ip:9222是無法訪問的察蹲,此時需要在云服務(wù)器上做一個端口映射,這里使用ssh命令
ssh -L 0.0.0.0:9223:localhost:9222 localhost -N
STEP3:
在chrome地址欄里輸入http://ip:9223 能看到當(dāng)前chrome debug信息,輸入http://ip:9223/json 能看到一些相信信息,這里暴露了一個websocket的調(diào)試地址
http://ip:9223/devtools/devtools.html?ws://ip:9223/devtools/page/ADE6C8375C62850FDD7C951260626600
這個地址是給websorcket用的户矢,可能需要一些開發(fā)才能使用,這里沒有深入殉疼。只作了解
STEP4:
在windows機(jī)器上打開chrome梯浪,地址欄輸入
chrome://inspect/#devices
先在第一個紅框處,配置服務(wù)器ip瓢娜,當(dāng)chrome檢測到的時候挂洛,就會在remote target里出現(xiàn)一個Target,點擊第二個紅框眠砾,inspect虏劲,就進(jìn)入debug模式了,就會打開一個窗口褒颈,里面就是在云服務(wù)上運行的chrome界面柒巫,地址是上面配置的https://m.kaola.com/login.html
這種方案的缺點主要有兩個:
- 網(wǎng)頁亂碼。但實際上并非亂碼谷丸,代碼完全跑的通吻育,用瀏覽器F12看源碼字體也不是亂碼,為什么網(wǎng)頁渲染亂碼淤井,更深入的原因查不到
- 操作延遲高,有的網(wǎng)站還算流暢摊趾,有的網(wǎng)站就很卡币狠,做一個 操作延遲很久,影像正常操作砾层。只能做一些基本驗證漩绵。
通過這種方案,我檢查到了為什么考拉總是登錄失敗的原因肛炮。我發(fā)現(xiàn)止吐,kaola登錄的時候總是提示滑動驗證碼,原來是ip不合法了侨糟,想必是第一次的時候就發(fā)現(xiàn)不是常用ip碍扔,讓輸入滑動驗證碼,之后一直嘗試登錄秕重,ip可能被拉黑了不同。
京東的問題是,點擊登錄,跳到了一個中間頁二拐,提示手機(jī)綁定安全之類的服鹅,后來改為手機(jī)號登錄就沒問題了。
通過remote debug方式百新,找到了登錄失敗的原因企软,下面看看怎么解決ip被封的問題。
使用squid代理
一般來說饭望,服務(wù)器拉黑ip的幾種情況
- 短時間頻繁訪問
- 密碼多次輸入錯誤
- 非常用ip登錄
如何讓ip解封仗哨?大概有幾種:
- 輸入正確密碼,等待服務(wù)器解封
- 換一個賬號試試
- 重新注冊賬號杰妓,并登錄
最糟糕的情況是藻治,整個ip被封,無論使用哪個賬號都需要驗證巷挥。這次還比較幸運桩卵,重新注冊了一個網(wǎng)易賬號,登錄后倍宾,該賬號就不再需要滑動驗證雏节。
那么問題來了,遠(yuǎn)程云服務(wù)器的IP怎么才能解封高职?云服務(wù)器沒有界面钩乍,破解滑動驗證碼,成本太高怔锌;使用remote debug寥粹,亂碼操作難度大,延遲太高埃元,效率低下涝涤。
這里使用squid代理,在云服務(wù)器上安裝squid岛杀,暴露8000端口阔拳,本機(jī)windows 通過java代碼,chromedriver設(shè)置chrome的proxy地址為云服務(wù)器地址类嗤,端口8000糊肠,具體操作如下:
yum install squid
1.vi /etc/squid/squid.conf, 在結(jié)尾處追加:
dns_nameservers 8.8.8.8
http_port 8000
cache_mem 60 MB
2.注釋掉默認(rèn)的http_access deny all
創(chuàng)建squid交換目錄:
cd /usr/sbin/
./squid -z
啟動squid:
./squid
查看端口狀態(tài):
netstat -ntl
停止squid:
./squid -k shutdown
此時,squid已經(jīng)安裝并啟動完畢遗锣,在windows本機(jī)货裹,java代碼里加入
ChromeOptions options = new ChromeOptions();
options.addArguments("--proxy-server=http://188.131.133.231:8000");
ChromeDriver driver = new ChromeDriver(options);
然后啟動程序,打開chrome瀏覽器黄伊,此時打開百度泪酱,在搜索欄輸入ip138,顯示已經(jīng)是云服務(wù)器的ip了,如此一來墓阀,本機(jī)chrome代理到云服務(wù)器上毡惜,可以手動輸入滑動驗證碼,進(jìn)行解鎖斯撮。
我在這里試驗了幾種方式经伙,老賬號多次滑動驗證通過,依然需要滑動驗證勿锅,可能時間還不到帕膜。
通過新注冊網(wǎng)易賬號,登錄溢十,不需要驗證碼垮刹。通過。
總結(jié)
至此张弛,考拉的驗證和京東的驗證都通過了荒典,幾個主要的難點及知識點
- chrome在linxu上界面亂碼原因?qū)е聠栴}查找走了很大彎路
- 通過chrome remote debug定位linux chrome問題
- 通過squid代理,將云服務(wù)器ip映射到本地吞鸭,本地手動滑動驗證碼解鎖ip