Python_Selenium使用

Selenium(from selenium import webdriver)
1、安装
2、基本使用
  • Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。
  • 以下代码运行:会自动弹出一个Chrome浏览器。浏览器首先会跳转到百度,然后在搜索框中输入Python,接着就会跳转到搜索结果页。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()  # 声明浏览器对象
try:
    browser.get("https://www.baidu.com")  # get()方法请求网页
    input_item = browser.find_element_by_id('kw')# 查找百度搜索框节点
    input_item.send_keys('Python')  # 输入文字
    input_item.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser, 10)  # 显式等待,指定加载等待最长时间
    wait.until(ec.presence_of_element_located((By.ID, 'content_left')))  # 代表节点出现的意思
    print(browser.current_url)  # 输出当前URL
    print(browser.get_cookies)  # 输出当前Cookies
    print(browser.page_source)  # 输出网页源代码
finally:
    browser.quit()  # 关闭浏览器
3、声明浏览器对象
  • 以下代码完成了浏览器对象的初始化并将其赋值为browser对象,接下来就是调用browser对象,让其执行各个动作以模拟浏览器操作
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
4、访问页面
  • get():请求网页;参数:传入链接URL
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')  # get()方法请求网页
print(browser.page_source)  # 打印出源代码
browser.quit()  # 关闭浏览器
5、查找节点
  • (1)find_element():查找单个节点,返回的是WebElement类型;所有方法如下表,其中方法1和方法2是等价的,但方法2需要导库方可使用:from selenium.webdriver.common.by import By:
方法1方法2
find_element_by_id()find_element(By.ID,)
find_element_by_name()find_element(By.NAME,)
find_element_by_xpath()find_element(By.XPATH,)
find_element_by_link_text()find_element(By.LINK_TEXT,)
find_element_by_partial_link_text()find_element(By.PARTIAL_LINK_TEXT,)
find_element_by_tag_name()find_element(By.TAG_NAME,)
find_element_by_class_name()find_element(By.CLASS_NAME,)
find_element_by_css_selector()find_element(By.CSS_SELECTOR,)
  • (1) 查找单个节点例子:如下代码使用3种方式获取输入框,分别是ID/CSS选择器/XPath,它们返回的结果一致。
    browser.find_element(By.ID,‘q’)等价于
    input_first = browser.find_element_by_id(‘q’)
from selenium import webdriver
# from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
# input_first = browser.find_element(By.ID,'q')
input_first = browser.find_element_by_id('q')  # 根据ID获取
input_second = browser.find_element_by_css_selector('  # q')  # 根据CSS选择器获取
input_third = browser.find_element_by_xpath('//*[@id="q"]')  # 根据Xpath获取
print(input_first)
print(input_second)
print(input_third)
browser.close()
#运行结果:
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
  • (2)find_elements():查找多个节点方法如下:
方法1方法2
find_elements_by_id()find_elements(By.ID,)
find_elements_by_name()find_elements(By.NAME,)
find_elements_by_xpath()find_elements(By.XPATH,)
find_elements_by_link_text()find_elements(By.LINK_TEXT,)
find_elements_by_partial_link_text()find_elements(By.PARTIAL_LINK_TEXT,)
find_elements_by_tag_name()find_elements(By.TAG_NAME,)
find_elements_by_class_name()find_elements(By.CLASS_NAME,)
find_elements_by_css_selector()find_elements(By.CSS_SELECTOR,)
  • (2)查找多个节点例子,返回的是列表类型,列表中的每个节点都是WebElement类型:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()
6、节点交互
  • Selenium驱动浏览器执行一些动作,比较常见的方法有:
  • send_keys():输入文字方法
  • clear():清空文字
  • click():点击按钮
  • 更多操作见:文档
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
input_item = browser.find_element(By.ID, 'q')  # 获取输入框
input_item.send_keys('iPhone')  # 输入文字
time.sleep(1)
input_item.clear()  # 清空文字
input_item.send_keys('iPad')
button = browser.find_element(By.CLASS_NAME, 'btn-search')  # 获取搜索按钮
button.click()  # 点击按钮
browser.close()
7、动作链
  • 上面实例中,一些交互动作都是针对某个节点执行的。比如:对于输入框,我们就调用它的输入文字和清空文字方法;对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象,比如鼠标拖拽、键盘按键灯,这些动作用另一种方式来执行,那就是动作链。
  • 实现节点拖拽操作,将某个节点从一处拖拽到另外一处,
  • -更多操作见:文档
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)  # 声明ActionChains对象,并将其赋值为actions变量
actions.drag_and_drop(source, target)
actions.perform()
# 解释:首先,打开网页中的一个拖拽实例,然后依次选中要拖拽的节点和拖拽到的目标节点,接着声明ActionChains对象并将其赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法,再调用perform()方法执行动作,此时就完成了拖拽操作
8、执行JavaScript
  • execute_script():可以直接模拟运行JavaScript,比如下拉进度条;基本上API没有提供的所有功能都可以用执行JavaScript的方式来实现;
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('alert("To Bottom")')  # 将进度条下拉到最底部,然后弹出alert提示框
9、获取节点信息
  • (1)page_source属性可以获取网页的源代码,也可以使用解析库(如正则表达式、BeautifulSoup、pyquery等)来提取信息
  • (2)Selenium已经提供了选择节点的方法,返回的是WebElement类型,那么它也有相关的方法和属性来直接提取节点信息,如属性、文本等。这样的话,我们就可以不用通过解析源代码来提取信息了,非常方便。
  • (2)get_attribute():获取节点的属性,但是其前提是先选中这个节点,示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')  # 选中节点
print(logo)
print(logo.get_attribute('class'))  # 获取属性
# 运行结果:
# <selenium.webdriver.remote.webelement.WebElement (session="443b6d01e40e71a44ca68db090f83460", element="0.6351879991034697-1")>
# zu-top-link-logo
  • (2).text:获取文本值,每个WebElement节点都有text属性,直接调用这个属性就可以得到节点内部的文本信息,示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')  # 选中节点
print(input.text)  # 获取文本值
# 运行结果:
# 提问
  • (2).id .location .tag_name .size;id属性可以获取节点id,location属性获取节点在页面中的相对位置,tag_name属性可以获取标签名称,size属性可以获取节点大小,也就是宽高,示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)  # 获取节点id
print(input.location)  # 获取该节点在页面中相对位置
print(input.tag_name)  # 获取标签名称
print(input.size)  # 获取节点大小

# 运行结果:
# 0.9816205696610512-1
# {'x': 758, 'y': 7}
# button
# {'height': 32, 'width': 66}
10、切换Frame
  • switch_to.frame():获取子Frame里面的节点,子Frame相当于页面的子页面
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
try:
	logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
	print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
# NO LOGO
# <selenium.webdriver.remote.webelement.WebElement (session="f937bd0cfe18c16040c91d18450b754c", element="0.3997722652889779-2")>
# RUNOOB.COM
11、延时等待
  • 在selenium中,get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源代码中也不一定能成功获取到。所以,这里需要延时等待一定时间,确保节点已经加载出来。
  • 等待的方式有两种:一种是隐式等待,一种是显式等待。
  • 隐式等待implicily_wait():当使用隐式等待执行测试的时候,如果selenium没有在DOM中找到节点,将继续等待,超出设定时间后,则抛出找不到节点的异常。换句话说,当查找节点而节点并没有立即出现的时候。隐式等待将等待一段时间再查找DOM,默认的时间是0。示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('http://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
# 运行结果:
# <selenium.webdriver.remote.webelement.WebElement (session="e5c098be220c423b28fa0a26534821f1", element="0.12832245097008865-1")>
  • 显式等待wait = WebDriverWait(browser,10),隐式等待的效果其实并没有那么好,因为我们只规定了一个固定的时间,而页面加载时间会受到网络条件的影响。这里还有一种更合适的显式等待方法,它指定要查找的节点,然后指定一个最长等待时间。如果在规定时间内加载出来了这个节点,就返回查找的节点;如果到了规定时间依然没有加载出该节点,则抛出超市异常。示例如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input)
print(button)

# 运行结果
# <selenium.webdriver.remote.webelement.WebElement (session="7876fe90bff06066f71e76b32d8997aa", element="0.9458091009175342-1")> 
# <selenium.webdriver.remote.webelement.WebElement (session="7876fe90bff06066f71e76b32d8997aa", element="0.9458091009175342-2")>
# 解释:这里首先引入了WebDriverWait这个对象,指定最长等待时间,然后调用它的Until()方法,传入要等待条件expected_conditions。
# 比如,这里传入了presence_of_element_located这个条件,代表节点出现意思,其参数是节点的定位元组,也就是ID为q的节点搜索框。
# 这样可以做到的效果就是,在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点;如果超过10秒还没有加载出来,就抛出异常
# 对于按钮,可以更改一下等待条件,比如改为element_to_be_clickable,也就是可点击,所以查找按钮是查找CSS选择器为.btn-search的按钮,如果10秒内它是可点击的,也就是成功加载出来了,就返回这个按钮节点;如果超过10秒还不可点击,也就是没有加载出来,就抛出异常。
等待条件含义
title_is标题是某内容
title_contains标题包含某内容
presence_of_element_located节点加载出来,传入定位元组,如(By.ID,‘p’)
visibility_of_element_located节点可见,传入定位元组
visibility_of可见,传入节点对象
presence_of_all_elements_located所有节点加载出来
text_to_be_present_in_element某个节点文本包含某文字
text_to_be_present_in_element_value某个节点值包含某文字
frame_to_be_available_and_switch_to_it加载并切换
invisibility_of_element_located节点不可见
element_to_be_clickable节点可点击
staleness_of判断一个节点是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected节点可选择,传节点对象
element_located_to_be_selected节点可选择,传入定位元组
element_selection_state_to_be传入节点对象以及状态,相等返回true,否则返回False
element_located_selection_state_to_be传入定位元组以及状态,相等返回True,否则返回False
alert_is_present是否出现警告
12、前进与后退
  • back():后退
  • forward():前进
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.zhihu.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
13、Cookies
  • get_cookies():获取cookies
  • add_cookie():添加cookie
  • delete_all_cookies():删除cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
# 运行结果
# [{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'l_n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': 'www.zhihu.com', 'expiry': 1554003614.905896, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': 'a37704a413efa26cf3f23813004f1a3b'}, {'domain': '.zhihu.com', 'expiry': 1648610714.905946, 'httpOnly': False, 'name': 'q_c1', 'path': '/', 'secure': False, 'value': 'e87308b5d9a84bcdb918f94638911718|1554002714000|1554002714000'}, {'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'ac8081b936d04d7ce1119608047eb0ee'}, {'domain': '.zhihu.com', 'expiry': 1556594714.905979, 'httpOnly': False, 'name': 'r_cap_id', 'path': '/', 'secure': False, 'value': '"MjUzMTU5OTI3ZGFiNDkxOGJkMDEwOWYwN2MwYzU2NzY=|1554002714|f89bec3ebd6cb64efd48b3455de4903ae8f87ff7"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906004, 'httpOnly': False, 'name': 'cap_id', 'path': '/', 'secure': False, 'value': '"YTU4ZWU2MmVhNThiNDI3MmFhOGFmNTkwNzc5NTczMjE=|1554002714|9356efee24068ce6ecba8e66d4b2ba4dacc59b78"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906027, 'httpOnly': False, 'name': 'l_cap_id', 'path': '/', 'secure': False, 'value': '"Y2Y3NTBiYTk2MDI2NDEzMWJmZjQzMGUyZmZlYWUxNDI=|1554002714|ba74e0784fa2cb42d3acf482f45ad69414c06dde"'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.zhihu.com', 'expiry': 1648610716.890978, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AACnZJWFNA-PTnwYBa3m9gf3fKwMTE92eCA=|1554002716"'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'f458e0c8-f536-43a9-9136-d7deba07ff63'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utma', 'path': '/', 'secure': False, 'value': '51854390.523501187.1554002717.1554002717.1554002717.1'}, {'domain': '.zhihu.com', 'expiry': 1554004517, 'httpOnly': False, 'name': '__utmb', 'path': '/', 'secure': False, 'value': '51854390.0.10.1554002717'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': '__utmc', 'path': '/', 'secure': False, 'value': '51854390'}, {'domain': '.zhihu.com', 'expiry': 1569770717, 'httpOnly': False, 'name': '__utmz', 'path': '/', 'secure': False, 'value': '51854390.1554002717.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utmv', 'path': '/', 'secure': False, 'value': '51854390.000--|3=entry_date=20190331=1'}]
# [{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'l_n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': 'www.zhihu.com', 'expiry': 1554003614.905896, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': 'a37704a413efa26cf3f23813004f1a3b'}, {'domain': '.zhihu.com', 'expiry': 1648610714.905946, 'httpOnly': False, 'name': 'q_c1', 'path': '/', 'secure': False, 'value': 'e87308b5d9a84bcdb918f94638911718|1554002714000|1554002714000'}, {'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'ac8081b936d04d7ce1119608047eb0ee'}, {'domain': '.zhihu.com', 'expiry': 1556594714.905979, 'httpOnly': False, 'name': 'r_cap_id', 'path': '/', 'secure': False, 'value': '"MjUzMTU5OTI3ZGFiNDkxOGJkMDEwOWYwN2MwYzU2NzY=|1554002714|f89bec3ebd6cb64efd48b3455de4903ae8f87ff7"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906004, 'httpOnly': False, 'name': 'cap_id', 'path': '/', 'secure': False, 'value': '"YTU4ZWU2MmVhNThiNDI3MmFhOGFmNTkwNzc5NTczMjE=|1554002714|9356efee24068ce6ecba8e66d4b2ba4dacc59b78"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906027, 'httpOnly': False, 'name': 'l_cap_id', 'path': '/', 'secure': False, 'value': '"Y2Y3NTBiYTk2MDI2NDEzMWJmZjQzMGUyZmZlYWUxNDI=|1554002714|ba74e0784fa2cb42d3acf482f45ad69414c06dde"'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.zhihu.com', 'expiry': 1648610716.890978, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AACnZJWFNA-PTnwYBa3m9gf3fKwMTE92eCA=|1554002716"'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'f458e0c8-f536-43a9-9136-d7deba07ff63'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utma', 'path': '/', 'secure': False, 'value': '51854390.523501187.1554002717.1554002717.1554002717.1'}, {'domain': '.zhihu.com', 'expiry': 1554004517, 'httpOnly': False, 'name': '__utmb', 'path': '/', 'secure': False, 'value': '51854390.0.10.1554002717'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': '__utmc', 'path': '/', 'secure': False, 'value': '51854390'}, {'domain': '.zhihu.com', 'expiry': 1569770717, 'httpOnly': False, 'name': '__utmz', 'path': '/', 'secure': False, 'value': '51854390.1554002717.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utmv', 'path': '/', 'secure': False, 'value': '51854390.000--|3=entry_date=20190331=1'}, {'domain': 'www.zhihu.com', 'expiry': 2184722717, 'httpOnly': False, 'name': 'name', 'path': '/', 'secure': True, 'value': 'germey'}]
# []
14、选项卡管理
  • 在访问网页的时候,会开启一个选项卡。在Selenium中,我们可以对选项卡进行操作,实例如下:
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 调用execute_script()方法,传入window.open()这个javascript语句新开启一个选项卡
browser.execute_script('window.open()')
# 获取当前开启的所有选项卡,返回的是选项卡的代号列表
print(browser.window_handles)
# 调用switch_to.window()方法切换选项卡,参数是选项卡代号,跳转到第二个选项卡
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')#打开淘宝页面
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])#跳转到第一个选项卡
browser.get('https://python.org')
# 运行结果:
# ['CDwindow-84D5CA52848B2EE81B74BCAE18EE7D2B', 'CDwindow-17F0406037F745152EF0DF4937DA74F7']
15、异常处理
  • 在使用Selenium的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。用try except语句来捕获各种异常。
  • 更多异常类参考:https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser = webdriver.Chrome()
try:
	browser.get('https://www.baidu.com')
except TimeoutException:
	print('Time Out')
try:
	browser.find_element_by_id('hello')
except NoSuchElementException:
	print('No Element')
finally:
	browser.close()
# 运行结果
# No Element
16、其他浏览器退出
  • browser.close():关闭浏览器的一个标签页
  • browser.quit():关闭浏览器
  • linux环境下截屏需要安装中文库,否则中文字会全部显示方框
17、截图
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
import random
import logging


def selenium_screenshot(url, css_element: str, width, height):
    """
    快照截图
    :param url: url
    :param width:  窗口宽度
    :param height:
    :param css_element: css定位
    :return:
    """
    ua = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101Firefox/50.0"
    driver = ""
    ip = "xxx.xxx.xxx.xxx"
    try:
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument(f'user-agent={ua}')
        chrome_options.add_argument(f'--proxy-server=http://{ip}:port"')
        driver = webdriver.Chrome(options=chrome_options)
        driver.maximize_window()
        if width:
            driver.set_window_size(width, height)
        driver.get(url)
        wait = WebDriverWait(driver, 10)
        wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, css_element)))
        ele = driver.find_element_by_css_selector(css_element)
    except Exception as err:
        logging.warning(f"{url} selenium_screenshot false: {err} ")
        return
    else:
        save_file_path = f"{random.random()}.png"
        ele.screenshot(save_file_path)
        logging.info(f"selenium_screenshot success {url}")
        return save_file_path
    finally:
        if driver:
            driver.quit()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值