Loading... # 启动webdriver的参数 ```python chrome_options = webdriver.ChromeOptions() chrome_options.add_argument( 'blink-settings=imagesEnabled=false') #不加载图片,提升速度,还有另一种方法 chrome_options.add_experimental_option( 'excludeSwitches', ['enable-automation']) #隐藏【受到自动化测试软件的控制】提示 driver = webdriver.Chrome(options=chrome_options) ``` 每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器。 selenium启动配置参数接收是ChromeOptions类,创建方式如下: ```python from selenium import webdriver option = webdriver.ChromeOptions() 创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目。 设置 chrome 二进制文件位置 (binary_location) from selenium import webdriver option = webdriver.ChromeOptions() # 添加启动参数 option.add_argument() # 添加扩展应用 option.add_extension() option.add_encoded_extension() # 添加实验性质的设置参数 option.add_experimental_option() # 设置调试器地址 option.debugger_address() 常用配置参数: from selenium import webdriver option = webdriver.ChromeOptions() # 添加UA options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"') # 指定浏览器分辨率 options.add_argument('window-size=1920x3000') # 谷歌文档提到需要加上这个属性来规避bug chrome_options.add_argument('--disable-gpu') # 隐藏滚动条, 应对一些特殊页面 options.add_argument('--hide-scrollbars') # 不加载图片, 提升速度 options.add_argument('blink-settings=imagesEnabled=false') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 options.add_argument('--headless') # 以最高权限运行 options.add_argument('--no-sandbox') # 手动指定使用的浏览器位置 options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #添加crx插件 option.add_extension('d:\crx\AdBlock_v2.17.crx') # 禁用JavaScript option.add_argument("--disable-javascript") # 设置开发者模式启动,该模式下webdriver属性为正常值 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 禁用浏览器弹窗 prefs = { 'profile.default_content_setting_values' : { 'notifications' : 2 } } options.add_experimental_option('prefs',prefs) driver=webdriver.Chrome(chrome_options=chrome_options) 浏览器地址栏参数: 在浏览器地址栏输入下列命令得到相应的信息 about:version - 显示当前版本 about:memory - 显示本机浏览器内存使用状况 about:plugins - 显示已安装插件 about:histograms - 显示历史记录 about:dns - 显示DNS状态 about:cache - 显示缓存页面 about:gpu -是否有硬件加速 chrome://extensions/ - 查看已经安装的扩展 ``` ![image.png](http://type.zimopy.com/usr/uploads/2023/02/1680793840.png) # **其他配置项目参数** ```python –user-data-dir=”[PATH]” # 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区 –disk-cache-dir=”[PATH]“ # 指定缓存Cache路径 –disk-cache-size= # 指定Cache大小,单位Byte –first run # 重置到初始状态,第一次运行 –incognito # 隐身模式启动 –disable-javascript # 禁用Javascript --omnibox-popup-count="num" # 将地址栏弹出的提示菜单数量改为num个 --user-agent="xxxxxxxx" # 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果 --disable-plugins # 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果 --disable-javascript # 禁用JavaScript,如果觉得速度慢在加上这个 --disable-java # 禁用java --start-maximized # 启动就最大化 --no-sandbox # 取消沙盒模式 --single-process # 单进程运行 --process-per-tab # 每个标签使用单独进程 --process-per-site # 每个站点使用单独进程 --in-process-plugins # 插件不启用单独进程 --disable-popup-blocking # 禁用弹出拦截 --disable-plugins # 禁用插件 --disable-images # 禁用图像 --incognito # 启动进入隐身模式 --enable-udd-profiles # 启用账户切换菜单 --proxy-pac-url # 使用pac代理 [via 1/2] --lang=zh-CN # 设置语言为简体中文 --disk-cache-dir # 自定义缓存目录 --disk-cache-size # 自定义缓存最大值(单位byte) --media-cache-size # 自定义多媒体缓存最大值(单位byte) --bookmark-menu # 在工具 栏增加一个书签按钮 --enable-sync # 启用书签同步 ``` # selenium实战爬取百度搜索 ```python import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.expected_conditions import title_contains driver = Chrome() driver.get('https://baidu.com') driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('python自动化报表') driver.find_element(By.XPATH,'//*[@id="su"]').click() WebDriverWait(driver,10).until(title_contains('python')) while True: h3_list = driver.find_elements(By.CSS_SELECTOR,'h3.t') for h3 in h3_list: print(h3.text) # 获取下一页标签 driver.find_element(By.XPATH,'//*[@id="page"]/div/a[last()]').click() time.sleep(3) ``` # 实战百度搜索 ```python import re # 正则表达式,进行文字匹配 from lxml import etree import pandas as pd from time import sleep import os def save_excekl(all_data): if not os.path.exists("huoyu.xlsx"): # 创建表头 df = pd.DataFrame( columns=["链接", "标题", "时间"]) # print(df, len(df)) else: df = pd.read_excel("huoyu.xlsx") # 添加一行内容 for i in all_data: # print(i) # print(pd.Series(i)) row_index = len(df) + 1 df.loc[row_index] = i df.to_excel("huoyu.xlsx", index=False) import time from selenium.webdriver import Chrome, ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.expected_conditions import title_contains driver = Chrome() driver.get('https://baidu.com') try: driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys('“广东”+“在线支付”') driver.find_element(By.XPATH, '//*[@id="su"]').click() sleep(2) # print(driver.page_source) driver.find_elements(By.XPATH, '//*[@class="c-icon icons_2hrV4"]')[1].click() sleep(2) driver.find_element(By.XPATH, '//*[@id="timeRlt"]').click() sleep(2) driver.find_element(By.XPATH, '//*[@class="input_from_1ITZ- input_1umpX"]').clear() driver.find_element(By.XPATH, '//*[@class="input_from_1ITZ- input_1umpX"]').send_keys('2010-02-02') sleep(2) driver.find_elements(By.XPATH, '//*[@class="input_from_1ITZ- input_1umpX"]')[1].clear() driver.find_elements(By.XPATH, '//*[@class="input_from_1ITZ- input_1umpX"]')[1].send_keys('2020-02-02') sleep(2) driver.find_element(By.XPATH, '//*[@id="su"]').click() # driver.refresh() sleep(3) # WebDriverWait(driver, 10).until(title_contains('广东')) open("huo.html", "w", encoding="utf-8").write(driver.page_source) # driver.quit() # exit() stute = "1" while True: page_source = driver.page_source tree = etree.HTML(page_source) all_lis = [] for index, i in enumerate(tree.xpath('//*[@class="c-title t t tts-title"]')): lis = [] try: title_times = ''.join( tree.xpath(f'//*[@class="result c-container xpath-log new-pmd"][{index + 1}]//text()')) time_re = re.compile('(\d+)年(\d+)月(\d+)日') title_time = re.findall(time_re, title_times) print(title_time[0][0]) # print(title_time[0]) title_time = title_time[0][0][-4:] + "年" + title_time[0][1] + "月" + title_time[0][2] + "日" print(title_time) except Exception as e: print(e, e.__traceback__.tb_lineno) title_time = "" title_url = i.xpath("./a/@href")[0] title = ''.join(i.xpath("./a//text()")) lis.append(title_url) lis.append(title) lis.append(title_time) all_lis.append(lis) print(title_url, title, title_time) save_excekl(all_lis) try: if stute == "1": driver.execute_script('document.getElementsByClassName("n")[0].click()') sleep(3) stute = "0" else: driver.execute_script('document.getElementsByClassName("n")[1].click()') except Exception as e: print("获取完毕", e, e.__traceback__.tb_lineno) driver.quit() break time.sleep(3) # 鼠标悬浮 # ActionChains(driver).move_to_element(driver.find_element(By.XPATH, '//*[@id="page"]/div/a[last()]')).perform() # 不改变时间或者别的参数时使用 [last()]这个取标签的最后一个标签 # driver.find_element(By.XPATH,'//*[@id="page"]/div/a[last()]').click() except Exception as e: print(e, e.__traceback__.tb_lineno) driver.quit() ``` # 过反爬 ```python from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.chrome.options import Options url = "http://scxk.nmpa.gov.cn:81/xk/" options = Options() options.add_argument("--incognito") # 配置隐私模式 # option.add_argument('--headless') # 配置无界面 options.add_experimental_option('excludeSwitches', ['enable-automation']) driver = webdriver.Chrome(executable_path=r'D:\chrome driver\chromedriver',options=options) driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator,'webdriver',{ get: () => undefined }) """ }) ``` ## 主要通过3个翻检测叠加 基本上可以解决大多数的selenium检测 ### 1,隐私页面的开启 **options.add_argument("--incognito") # 配置隐私模式** ### 2.自动化控制的隐藏 **options.add_experimental_option('excludeSwitches', ['enable-automation'])** ### 3.属性特征的修改 ```js driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator,'webdriver',{ get: () => undefined }) """ }) ``` 这样就解决了 检测 selenium一些特征的反爬虫问题 # 继续设置参数 ## 谷歌 火狐 浏览器设置参数 ```python from selenium import webdriver import os # 进入浏览器设置 options = webdriver.ChromeOptions() # 谷歌无头模式 options.add_argument('--headless') options.add_argument('--disable-gpu') # 设置页面大小 options.add_argument('window-size=1200x600') # 设置中文 options.add_argument('lang=zh_CN.UTF-8') # 更换头部 options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"') # 设置代理 options.add_argument('proxy-server=' + proxy) # 不加载图片 options.add_experimental_option('prefs', {"profile.managed_default_content_settings.images": 2}) # 设置下载路径 options.add_experimental_option('prefs', {"download.default_directory": os.path.abspath('数据\\')}) # 除去“正受到自动测试软件的控制”提示框 options.add_argument('disable-infobars') # 打开开发者模式 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 不使用自动化扩展 options.add_experimental_option('useAutomationExtension', False) # 去除selenium的一个指纹 browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) # 导入当前py文件目录下的chromedriver executable_path = os.path.abspath('chromedriver.exe') browser = webdriver.Chrome(executable_path=executable_path, chrome_options=options) url = "https://httpbin.org/get?show_env=1" browser.get(url) # 设置浏览器窗口大小 browser.set_window_size(1552, 800) # 删除原来的cookie browser.delete_all_cookies() # 添加cookie browser.add_cookie({'name':'ABC','value':'DEF'}) # 刷新当前页面 browser.refresh() # 通过js新打开一个窗口 page_js='window.open("https://www.baidu.com");' browser.execute_script(page_js) # 用js点击元素 button = browser.find_element_by_xpath('//*[@class="button"]') browser.execute_script("$(arguments[0]).click()",button) # 用js滑动滑动条 js = "var q=document.documentElement.scrollTop=" for i in range(1, 15): browser.execute_script(js + str(i * 100)) # 切换浏览器最新页面窗口 browser.switch_to.window(browser.window_handles[-1]) # 切换浏览器至第一个iframe框架 browser.switch_to.frame(1) # 切换浏览器的弹出框 并点击同意 self.browser.switch_to.alert.accept() # 浏览器窗口对象 browser.window_handles: list # 关闭当前窗口 browser.close() # 关闭浏览器 browser.quit() ``` 利用Chrome DevTools协议。它允许客户检查和调试Chrome浏览器。 打开cmd,在命令行中输入命令: ```sh chrome.exe --remote-debugging-port=9222 --user-data-dir="D:\selenum\AutomationProfile" ``` 对于-remote-debugging-port值,可以指定任何打开的端口。 对于-user-data-dir标记,指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。 还有,不要忘了在环境变量中PATH里将chrome的路径添加进去。 此时会打开一个浏览器页面,我们输入淘宝网址,我们把它当成一个已存在的浏览器: selenium通过设置代理,来监听该浏览器,从而控制浏览器,接管浏览器例子: ```python from selenium import webdriver options = webdriver.ChromeOptions() options.debugger_address = "127.0.0.1:9222" browser = webdriver.Chrome(options=options) ``` ## 火狐浏览器 ```python from selenium import webdriver from selenium.webdriver.common.proxy import * ''' #这种方法在py3好像有点问题隐藏了 # 代理 myProxy = '202.202.90.20:8080' # 代理格式 proxy = Proxy({ 'proxyType': ProxyType.MANUAL, 'httpProxy': myProxy, 'ftpProxy': myProxy, 'sslProxy': myProxy, 'noProxy': '' }) profile = webdriver.FirefoxProfile() profile = get_firefox_profile_with_proxy_set(profile, proxy) ''' ip = '27.44.221.62:4213' ip_ip = ip.split(":")[0] ip_port = int(ip.split(":")[1]) profile = webdriver.FirefoxProfile() profile.set_preference('network.proxy.type', 1) # 默认值0,就是直接连接;1就是手工配置代理。 profile.set_preference('network.proxy.http', ip_ip) profile.set_preference('network.proxy.http_port', ip_port) profile.set_preference('network.proxy.ssl', ip_ip) profile.set_preference('network.proxy.ssl_port', ip_port) profile.update_preferences() driver = webdriver.Firefox(profile) profile.set_preference("general.useragent.override", user_agent) # firefox无头模式 options = webdriver.FirefoxOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('window-size=1200x600') executable_path = os.path.abspath('geckodriver.exe') driver=webdriver.Firefox(proxy=proxy, profile=profile, options=options, executable_path=executable_path) driver.get('https://www.baidu.com') driver.quit() ``` ```python options = webdriver.FirefoxOptions() # 不加载图片,加快访问速度 #options.set_preference('permissions.default.image',2) # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium 火狐好像不用设置 #options.add_experimental_option('excludeSwitches', ['enable-automation']) # 添加本地代理 ## 第二步:开启“手动设置代理” options.set_preference('network.proxy.type', 1) ## 第三步:设置代理IP options.set_preference('network.proxy.http', '221.180.170.104') ## 第四步:设置代理端口,注意端口是int类型,不是字符串 options.set_preference('network.proxy.http_port', 8080) # 添加UA #ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' #options.add_argument('user-agent=' + ua) driver = webdriver.Firefox(options=options) ``` 最后修改:2023 年 09 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏