之前在python環境下selenium 主要用的是chromdriver,此次發現總是報錯(Timeout), 實際又是正確的, 多是和chrome版本不正確,再加上我程序蹦來就在windows環境下。javascript
IE瀏覽器驅動下載連接:http://selenium-release.storage.googleapis.com/index.html,我這裏安裝的是v3.0(擔憂最新的有問題),運行代碼發現成功。html
Firefox 瀏覽器下載連接:https://github.com/mozilla/geckodriver/releases/, 我這裏安裝的是 java
geckodriver-v0.24.0-win64.zip ,Firefox 是最新的68.0\python
若是是在linux(ubuntu)下, 首先下載文件,而後切換到下載目錄 執行如下語句:linux
tar -xvzf geckodriver* chmod +x geckodriver sudo mv geckodriver /usr/local/bin/
能夠參考 https://blog.csdn.net/qq_23926575/article/details/77268924git
把下載文件放在python的安裝目錄的Scripts下比較方便(這樣就能夠不用指定路徑了)
github
咱們在爬網的時候常常須要用到requests(發送http請求)和BeautifulSoup 分析網頁的返回內容web
csdn:chrome
from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.common.exceptions import TimeoutException import requests from bs4 import BeautifulSoup import time opts = Options() #opts.headless =True opts.add_argument("--headless") #br = webdriver.Ie(r'D:/python/IEDriverServer.exe') url="https://blog.csdn.net/xxx/article/list/" for i in range(60): try: #br = webdriver.Firefox(firefox_options=opts) br = webdriver.Firefox(options=opts) #br = webdriver.Ie(r'D:/python/IEDriverServer.exe') r = requests.get(url+str(i)) soup = BeautifulSoup(r.text,"lxml") s= soup.find_all("div",class_ ="article-item-box csdn-tracking-statistics") for item in s: temp=item.h4.a.get("href") if temp.startswith("https://blog.csdn.net/xxx"): try: print(temp) br.get(temp) time.sleep(60) except TimeoutException: br.execute_script("window.stop()") except Exception as et: print("Error detail:",et) except Exception as e: print("Error:",e) finally: br.quit()
cnblogs:ubuntu
from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.common.exceptions import TimeoutException import requests from bs4 import BeautifulSoup import time opts = Options() opts.add_argument("--headless") url="https://www.cnblogs.com/xxx/default.html?page=" for i in range(9): try: #br = webdriver.Firefox(firefox_options=opts) br = webdriver.Firefox(options=opts) r = requests.get(url+str(i)) soup = BeautifulSoup(r.text,"lxml") soup = soup.find(id='content') s= soup.find_all("h2") for item in s: temp=item.a.get("href") if temp.startswith("https://www.cnblogs.com/xxx/"): try: print(temp) br.get(temp) time.sleep(60) except TimeoutException: br.execute_script("window.stop()") except Exception as et: print("Error detail:",et) except Exception as e: print("Error:",e) finally: br.quit()
而後運行 pyinstaller -F xxx.py來打包成exe文件
在windows用以下語句
opts.headless =True
br = webdriver.Firefox(options=opts)
在ubuntu須要改成
opts.add_argument("--headless")
br = webdriver.Firefox(firefox_options=opts)
若是windows下會有以下提示:
可是在處理https的時候須要注意了:
調用IE來打開對應的網頁問題,可是在實際測試中,有些網站是採用https協議的,這時候IE瀏覽器會彈出以下窗口,通常手動選擇後,纔可進入登陸界面,而在webdriver調用瀏覽器後,沒法繼續操做,那麼該如何解決呢?
方法一:代碼增長配置
首先,咱們能夠能夠查看該網頁的源碼,分析下代碼,能夠看到下面部分信息:
<h4 id="continueToSite">
<img src="red_shield.png" ID="ImgOverride" border="0" alt="不推薦圖標" class="actionIcon">
<A href='' ID="overridelink" NAME="overridelink" >繼續瀏覽此網站(不推薦)。 </A>
</h4>
述標記部分的,則是上圖標記的地方,通常咱們點擊該圖標後便可進入登陸窗口,下面代碼中經過調用javascript來操做瀏覽器的提示框,來跳過該提示便可:
#coding=utf-8 from selenium import webdriver driver=webdriver.Ie() firsturl='https://172.172.110.8/Terminal/logon.do' driver.get(firsturl) driver.get("javascript:document.getElementById('overridelink').click();")#解決IE提示問題 driver.close()
方法二:瀏覽器配置
方法二則是經過配置瀏覽器的方法,解決證書問題,方法以下:
一、點擊【繼續瀏覽此網頁】後進入登陸窗口,此時地址欄後面會出現【證書錯誤】提示
二、點擊證書錯誤——查看證書,提示證書無效,則是由於證書不被信息,須要安裝證書
三、彈出證書界面,選擇安裝證書
四、按嚮導操做,注意在下列步驟中須要選擇證書位置
五、配置完成後,此時依然是沒法登錄的,點擊繼續瀏覽後,彈出的錯誤提示爲:不匹配的地址,以下,還須要繼續配置
六、Internnet選項——高級下,去除下圖中標記項的勾,而後保存
七、從新打開地址,此時仍然會彈出提示,選擇繼續瀏覽後,會發現上方的地址欄變爲一個小鎖,如右圖,說明已經配置OK,後續在打開該地址就不會彈出錯誤選項了。
八、若仍是沒法登錄,能夠在Internet選項—安全中:設置安全等級爲低等級,並在高級選項下,將下屬五項所有勾選後重啓瀏覽器便可
關於調用IE瀏覽器的錯誤處理
運行過程當中若是出現錯誤:WebDriverException: Message: u'Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.
解決方法
更改IE的internet選項->安全,將Internet/本地Internet/受信任的站定/受限制的站點中的啓用保護模式所有去掉勾,或者所有勾上