【背景】
需要访问某个旧网址,仅支持IE浏览器访问。为了实现自动化,被迫采用python加selenium、加IE浏览器来做。
【实录】
selenium采用IE浏览器方式的资料不多,网上可供参考范例不多。以下实时记录整个过程,实现调通一个基本访问实例。
【第一步】安装正确版本的selenium、urllib3和IE driver。
经查阅资料,目前能找到的最高版本带IE driver支持的selenium是3.141.0版本
pip install selenium==3.141.0
pip uninstall urllib3pip install urllib3==1.26.2
【踩坑之一】注意,需要卸载自动安装的urllib3,因为自动安装版本为2.1.0,与selenium 3.141.0冲突,会导致如下运行报错:
IE driver从这里下载:http://selenium-release.storage.googleapis.com/index.html
将IEDriverServer.exe放置在py脚本程序的当前路径。
【第二步】上范例代码
from selenium import webdriver
iedriver = os.path.join(os.getcwd(), 'IEDriverServer.exe') print(iedriver) os.environ["webdriver.ie.driver"] = iedriver # 调用IE浏览器
driver = webdriver.Ie(iedriver, options=options) driver.get('https://www.baidu.com')
print('登陆成功')
踩坑之二:执行上面的范例代码,会出现如下报错,
selenium.common.exceptions.SessionNotCreatedException: Message: Unexpected error launching Internet Explorer. Browser zoom level was set to 125%. It should be set to 100%
将win10操作系统显示设置调回100%即可(chromedriver没这个问题,仅IE需要)
缩放比例调整为100%后,运行代码,可以执行了,但。。。执行不下去
【踩坑之三】在driver.get('https://www.baidu.com')一直执行,driver.get方法始终不返回,需要很久很久才会报错:
也就是说:网页可以load,但是系统得不到正确的响应,会stuck在起始url页面,无法继续。
【解决方案】调整一个options,调整启动后的IE浏览器“internet选项”两个地方参数才行,三者缺一不可。
(1)调整options,范例如下:
from selenium import webdriver options = webdriver.IeOptions() options.ignore_protected_mode_settings = True driver = webdriver.Ie(options=options) driver.get("https://www.baidu.com")
(2)调整internet选项-安全,框框中四个地方都必须调成一样的,不勾选“启用保护模式”。
(3)调整--Internet选项--高级,如下图,不勾选---启用增强保护模式。
【完整代码范例】
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time
iedriver = os.path.join(os.getcwd(), 'IEDriverServer.exe')
print(iedriver)
os.environ["webdriver.ie.driver"] = iedriver # 调用IE浏览器
options = webdriver.IeOptions()
options.ignore_protected_mode_settings = True
browser1 = webdriver.Ie(iedriver, options=options)
def exec_js(browser, js_str):
browser.execute_script(js_str)
def get_csdn_article_list(blog_url):
# url = 'https://blog.csdn.net/cdl3'
browser1 = webdriver.Ie(iedriver)
browser1.get(blog_url)
browser1.maximize_window()
time.sleep(2)
# 关闭各种登录弹窗
exec_js(browser1, '$(".login-box").css("display","none")')
exec_js(browser1, '$(".passport-login-tip-container").css("display","none")')
exec_js(browser1, '$(".csdn-toolbar-creative-mp").css("display","none")')
main_content = browser1.find_element(By.CLASS_NAME, 'mainContent')
article_link_list = []
if main_content:
article_list = main_content.find_elements(By.TAG_NAME, 'article')
for article in article_list:
url2 = article.find_element(By.TAG_NAME, 'a').get_attribute('href')
title = article.find_element(By.TAG_NAME, 'h4').text
detail = article.find_element(By.CLASS_NAME, 'blog-list-content').text
view_num = article.find_element(By.CLASS_NAME, 'view-num').text.replace('·', '')
dianzan_num = article.find_element(By.CLASS_NAME, 'give-like-num').text.replace('·',
'')
print(url2, title, detail, view_num, dianzan_num)
article_link_list.append((url2, title))
if len(article_link_list) > 0:
return article_link_list
return None
def test1():
blog_url = 'https://blog.csdn.net/cdl3'
get_csdn_article_list(blog_url)
browser1.quit()
if __name__ == '__main__':
test1()
【实现效果】如下:
【发文章不易,请多多关注、点赞、下载、支持!谢谢!】
好文推荐
发表评论