目录
定位元素方法
爬取网站案例:
常用方法
判断节点是否存在
设置代理ip
tab页面切换
html转字符串:
对象转json:
python json.dumps() 中文乱码问题
python-selenium切换手机模式
selenium-TouchActions接口 行为控制、手势控制
Python控制鼠标点击
selenium-开启开发者工具(F12)
定位元素方法
selenium 安装方法:https://blog.csdn.net/qq_44695727/article/details/106083938
# 查找单个元素:find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector # 查找多个元素 find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector # 两个私有方法 find_element find_elements
find_element和find_elements用法:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button') XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
find_element_by_xpath用法:
绝对路径:login_form = driver.find_element_by_xpath("/html/body/form[1]") HTML中的第一个表单元素: login_form = driver.find_element_by_xpath("//form[1]") 属性id=loginForm的元素:login_form = driver.find_element_by_xpath("//form[@id='loginForm']") //div/* div下面的所有的元素 //div//p 查找div中的p节点,等于 css_selector里的('div p') //div/p 查找div的子节点p; 等价于 css_selector里的('div > p') //*[@style] 查找所有包含style的所有元素,所有的属性要加@,等于('*[style]'): //p[@spec='len'] 必须要加引号;等价于 css_selector里的("p[spec='len']") //p[@id='kw'] xpath中对于id,class与其他元素一视同仁,没有其他的方法 //div/p[2] 选择div下的第二个p节点 ;等价于css_selector里的div>p:nth-of-type(2) 符合p类型的第二个节点 //div/*[2] 选择div下第二个元素 //div/p[position()=2] position()=2 指定第二个位置; 等价于上面的 //div/p[2] position()>=2 位置大于等于2 position()<2 位置小于2 position()!=2 位置不等于2 //div/p[last()] 选择div下的倒数第一个p节点; last()倒数第一个 //div/p[last()-1] 选择div下的倒数第二个p节点; //div/p[position()=last()] 倒数第一个 //div/p[position()=last()-1] 倒数第二个 //div/p[position()>=last()-2]倒数第一个,第二个,第三个 //p | //button 选择所有的p和button,等价于css_selector里的 p, button //input[@id='kw' and @class='su'] 选择id=kw 并且 class=su的input元素 //p[@spec='len']/.. 选择p节点的上层节点 此方法在css_selector中没有 //p[@spec='len']/../.. 上层节点的上层节点
爬取网站案例:
from selenium import webdriver url = 'http://xxxxxxx' driver = webdriver.Chrome() # 隐式等待页面加载完 driver.implicitly_wait(20) # 设置窗口大小 # driver.set_window_size(10, 10) driver.get(url) aList = driver.find_elements_by_xpath('//*[@id="list"]//a') driver.close()
常用方法
- driver.page_source 获取整个网页源代码
- get_attribute("outerHTML") 输出当前标签的本身和标签内的文本内容,如果有子标签,那么子标签本身和标签内的文本内容也将一起输出
- get_attribute('innerHTML') 获取当前标签的文本内容,如果标签内有子标签,会连子标签本身和子标签内的文本内容一起输出
- get_attribute('textContent') == .text
get_attribute:这个标签的某个属性的值。 screentshot:获取当前页面的截图。这个方法只能在driver上使用。 获取所有的cookie: for cookie in driver.get_cookies(): print(cookie)
# 获取标签内的属性值 aList[i].get_attribute('src') # 获取标签下的文本 aList[i].text # 关闭页面 driver.close() # 操作输入框:分为两步。第一步:找到这个元素。 # 第二步:使用send_keys(value),将数据填充进去 inputTag = driver.find_element_by_id('kw') inputTag.send_keys('python') # 清除输入框中的内容 inputTag.clear() # 操作checkbox # 要选中checkbox标签,在网页中是通过鼠标点击的。因此想要选中checkbox标签,那么先选中这个 # 标签,然后执行click事件 rememberTag = driver.find_element_by_name("rememberMe") rememberTag.click() # 选择select,select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门 # 为select标签提供了一个类,示例: from selenium.webdriver.support.ui import Select # 选中这个标签,然后使用Select创建对象 selectTag = Select(driver.find_element_by_name("jumpMenu")) # 根据索引选择 selectTag.select_by_index(1) # 根据值选择 selectTag.select_by_value("http://www.95yueba.com") # 根据可视的文本选择 selectTag.select_by_visible_text("95秀客户端") # 取消选中所有选项 selectTag.deselect_all() # 按钮点击 inputTag = driver.find_element_by_id('su') inputTag.click() # 行为链: # 有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。 # 比如现在要将鼠标移动到某个元素上并执行点击事件。那么示例代码如下: inputTag = driver.find_element_by_id('kw') submitTag = driver.find_element_by_id('su') actions = ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag,'python') actions.move_to_element(submitTag) actions.click(submitTag) actions.perform() # 还有更多的鼠标相关的操作: click_and_hold(element):点击但不松开鼠标。 context_click(element):右键点击。 double_click(element):双击。
更多方法请:http://selenium-python.readthedocs.io/api.html
判断节点是否存在
def isElementPresent(driver, path): #从selenium.common.exceptions 模块导入 NoSuchElementException类 from selenium.common.exceptions import NoSuchElementException try: element = driver.find_element_by_xpath(path) #原文是except NoSuchElementException, e: except NoSuchElementException as e: #打印异常信息 # print(e) #发生了NoSuchElementException异常,说明页面中未找到该元素,返回False return False else: #没有发生异常,表示在页面中找到了该元素,返回True return True res = isElementPresent(driver, "/html/div") if res is True: # -----
设置代理ip
有时候频繁爬取一些网页。服务器发现你是爬虫后会封掉你的ip地址。这时候我们可以更改代理ip。更改代理ip,不同的浏览器有不同的实现方式。这里以Chrome浏览器为例:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("--proxy-server=http://110.73.2.248:8123") driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options) driver.get('http://xxxxx')
tab页面切换
有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到。示例代码如下
# 打开一个新的页面 driver.execute_script("window.open('https://xxxxxxxx')") print(driver.window_handles) # 切换到这个新的页面中 driver.switch_to_window(self.driver.window_handles[1]) print(driver.current_url) #注意 #虽然在浏览器窗口中切换到了新的页面,但是driver中还没有切换 #如果想要在代码中切换到新的界面,那么应该使用driver.switch_to_window来切换到指定的窗口 #从driver.window_handles中取出具体第几个窗口 #driver.window_handles是一个列表,里面装的都是窗口句柄,它会按照打开的页面顺序来存储窗口的句柄。
更多python其他方法参考另一篇:
https://blog.csdn.net/qq_44695727/article/details/107461597#python%E5%A4%84%E7%90%86%E6%95%B0%E6%8D%AE%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95
html转字符串:
driver.find_element_by_xpath('/html/body').get_attribute("outerHTML").__str__().replace('"', "'")
对象转json:
import json json.loads() 将json转换为dict json.dumps() 将dict转换为json json.load() 将json文件转换为dict json.dump() 将dict转换为json文件 person.json # 类对象转换为json person_json = json.dumps(person.__dict__) # 或者 # 第二个参数传递转换函数,或者使用default=lambda o: o.__dict__ person_json = json.dumps(person, default=convert2json) # 将person转换为dict def convert2json(person): return { 'name': person.name, 'age': person.age, 'email': person.email } # dict/对象转换为json文件 with open('person.json', 'w') as f: json.dump(person, f) # 将json文件转换为dict/对象 import json with open('person.json', 'r') as f: print(json.load(f))
python json.dumps() 中文乱码问题
json.dumps 序列化时默认使用的ascii编码,想输出真正的中文需要指定ensure_ascii=False:更深入分析,是应为
dJSON
object 不是单纯的unicode实现,而是包含了混合的unicode编码以及已经用utf-8编码之后的字符串。写法:
Python2 :json.dumps(odata, ensure_ascii=False).decode('utf8') json.dumps(odata,ensure_ascii=False).decode('utf8').encode('gb2312') Python3 :json.dumps(odata, ensure_ascii=False)
python-selenium切换手机模式
# 手机模式 option = webdriver.ChromeOptions() option.add_argument('disable-infobars') mobile_emulation = {"deviceName": "iPhone 6"} option.add_experimental_option('mobileEmulation', mobile_emulation) driver = webdriver.Chrome(chrome_options=option)
selenium-TouchActions接口 行为控制、手势控制
# 行为控制 perform --- 执行所有准备好的Actio # 手势控制 tap --- 在指定元素上敲击 double_tap --- 在指定元素上双敲击 tap_and_hold --- 在指定元素上点击但不释放 move --- 手势移动指定偏移(未释放) release --- 释放手势 scroll --- 手势点击并滚动 scroll_from_element --- 从某个元素位置开始手势点击并滚动 long_press --- 长按元素 flick --- 手势滑动 flick_element --- 从某个元素位置开始手势滑动 例: from selenium.webdriver.common.touch_actions import TouchActions Action = TouchActions(driver) Action.double_tap(driver.find_element_by_xpath('//*[@id="bw"]/div[1]/a[2]')) flick_element(on_element, xoffset, yoffset, speed); on_element #操作元素定位 xoffset #x轴偏移量 yoffset #y轴偏移量 speed #速度 注意:向上滑动为负数,向下滑动为正数 Action = TouchActions(driver) """从button元素像下滑动200元素,以50的速度向下滑动""" Action.flick_element(button, 0, 200, 50).perform()
Python控制鼠标点击
import pyautogui # 用0.5 秒的时间把光标移动到x,y(437, 151) 位置,y竖向向下增加 pyautogui.moveTo(437, 151, duration=0.5) pyautogui.click() pyautogui.click(350, 190, button ='left')# 左击 pyautogui.click(350, 190, button ='right')# 右击
selenium-开启开发者工具(F12)
option = webdriver.ChromeOptions() # 开启开发者工具(F12) option.add_argument("--auto-open-devtools-for-tabs") driver = webdriver.Chrome(chrome_options=option)