selenium基本使用
bro = webdriver.Chrome(executable_path='./chromedriver') 加载浏览器驱动
bro.get('https://www.baidu.com') 打开网页
定位
bro.find_element_by_xpath() 常用
…
不一一列举,在pycharm中输入find则会弹出提示
selenium基本函数
"""
#可以利用time库,设置等待时间,以防页面未完全加载就开始进行操作,造成错误
import time
time.sleep()
#也可以使用selenium库中的函数,这个方法可以在一个时间范围内智能等待
implicitly_wait()
#页面的前进和后退
driver.forward()
driver.back()
#生成页面快照,当浏览器设置为无界面时,可以使用该方法查看爬虫过程
save_screenshot("photo name")
#打印网页渲染后的源代码
driver.page_source
#接受页面中的警告信息
driver.switch_to_alert().accept()
#selenium还可以执行javascript脚本
execute_script("document.title")
#控制滚动条到底部
js = "var q = documentElement.scrollTop=10000000"
driver.execute_script(js)
#滚动屏幕
driver.execute_script("window.scrollBy(0, 700)")
#获得cookie
get_cookies()
#删除特定的cookie
delete_cookie("cookie_name")
#删除所有的cookie
delete_all_cookie()
#### 新开页面,切换句柄
next_click.click() # 模拟点击下一页的时候,会出现一个新窗口或者新标签
n = drive.window_handles # 这个时候会生成一个新窗口或新标签页的句柄,代表这个窗口的模拟driver
print('当前句柄: ', n) # 会打印所有的句柄
drive.switch_to_window(n[-1]) # driver切换至最新生产的页面
url = drive.find_element_by_xpath(').get_attribute('href') # 获取某一页中的,某个标签下某个属性的内容
drive.close() # 注: 当前drive的句柄是你需要关闭窗口、标签页的
"""
selenium的动作链
"""
from selenium.webdriver import ActionChains 动作链
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
"""
技巧
技巧一:
selenium 定位获取属性值
browser.find_element_by_xpath(’…’).get_attribute(‘TagName’)
selenium 定位获取文本
browser.find_element_by_xpath(’…’).text
find_element_by_xpath() 和 find_elements_by_xpath()的区别:
单复数,复数(即后者)返回的是列表
技巧二
selenium 通过值搜索对应的属性
比如:打开公司网页时,因为要搜索公司的联系人和联系方式,比如下图中要定位到联系我们(联系方式)的标签
因为联系我们的标签一般存放在a标签
代码如下:
找出所有的a标签,contact_list是个列表
regex = '联系方式.*?|联系我们.*?|联系.*?'
contact_list = browser.find_elements_by_xpath('//a')
for contact in contact_list:
通过正则表达式寻找每个a标签的文本内容是否能跟regex的内容匹配
如果能够匹配到,该标签则是目标标签
if re.findall(regex, contact.text):
pass
break
技巧三:
截取长屏
# 设置chrome开启的模式,headless就是无界面模式
# 一定要使用这个模式,不然截不了全页面,只能截到你电脑的高度
chrome_options = Options()
chrome_options.add_argument('headless')
# # 窗口最大化
browser.maximize_window()
# todo:截长图
# 接下来是全屏的关键,用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
# width = browser.execute_script("return document.documentElement.scrollWidth")
# height = browser.execute_script("return document.documentElement.scrollHeight")
browser.set_window_size(width=1200, height=1400)
# 获取body的size
# size = browser.find_element_by_xpath('//body').size
# # 将浏览器的宽高设置成刚刚获取的宽高
# browser.set_window_size(size.get('width'), size.get('height'))
规避检测
from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
import time, re, os
# 实现规避检测
options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
# 设置chrome开启的模式,headless就是无界面模式
# 一定要使用这个模式,不然截不了全页面,只能截到你电脑的高度
chrome_options = Options()
chrome_options.add_argument('headless')
browser = webdriver.Chrome(executable_path='./chromedriver.exe', options=options, chrome_options=chrome_options)
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})