# 获取加载更多的数据有 2 种方法
# 第一种就是直接找数据接口, 点击'加载更多' 在Network看下, 直接找到数据接口
# 第二种方法就是使用selenium+chromdriver
# selenium from selenium import webdriver import time driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') time.sleep(5) driver.close() # 关闭页面 driver.quit() # 关闭整个浏览器
# selenium 定位元素 常用的6种 # find_element只获取满足条件的第一个, find_elements获取所有满足条件的 1.find_element_by_id 2.find_element_by_class_name 3.find_element_by_name 4.find_element_by_tag_name 5.find_element_by_xpath 6.find_element_by_css_selector ############################ from selenium import webdriver import time from lxml import etree driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') # 使用 xpath 方式获取 效率高 如果只是解析页面就使用这种 tree = etree.HTML(driver.page_source) li_lists = tree.xpath('xxxxxxxxxx') # 通过id 的方式获取 如果对元素进行操作时, # 比如要发送字符串, 点击按钮, 下拉操作 就使用这种方法 inputTag = driver.find_element_by_id('kw') inputTag.send_keys('python') time.sleep(3) driver.close() # 关闭页面 # driver.quit() # 关闭整个浏览器
# 常见的表单元素: # input标签 type='text/password/email/number' 属于文本框 # button、input type='submit' # checkbox type=‘checkbox’ # ############### # 操作表单元素 # 1. 操作输入框 inputTag = driver.find_element_by_id('kw') inputTag.send_keys('python') time.sleep(3) # 2. 操作checkbox标签 豆瓣为例 rememberBtn = driver.find_element_by_name('remember') rememberBtn.click() # 3. 操作select标签 要用Select类 from selenium import webdriver from selenium.webdriver.support.ui import Select selectBtn = Select(driver.find_element_by_name('jumpMenu')) selectBtn.select_by_index(1) # 通过index 选中下拉框里的选项 # selectBtn.select_by_visible_text('95秀客户端') 通过文本内容选中 # 4. 按钮的点击事件 inputTag = driver.find_element_by_id('kw') #拿到输入框按钮 inputTag.send_keys('python') submitTag = driver.find_element_by_id('su') #拿到点击按钮 submitTag.click()
# selenium 的行为链 简单介绍 有时候页面中的操作有很多步,需要一系列操作 # 在爬虫中用的不多, 在测试用的多 from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') # 拿到两个标签 inputTag = driver.find_element_by_id('kw') submitBtn = driver.finr_element_by_id('su') actions = ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag,'python') actions.move_to_element(submitBtn) actions.click(submitBtn) actions.perform()
# 在selenium中 cookies操作 # 1.获取所有的cookie for cookie in driver.get_cookies(): print(cookie) # 2.根据cookie的key获取value value = driver.get_cookie(key) # 3.删除所有的cookie driver.delete_all_cookies() # 4.删除某一个cookie driver.delete_cookie(key) ################################# from selenium import webdriver import time driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') for cookie in driver.get_cookies(): # 获取的是百度域名下的所有cookie print(cookie)
# 页面等待 重要 防止数据没有被加载就开始使用 # 因为页面很多用ajax技术,有时候要使用的数据没有加载出来,这时候使用就会报错.所以selenium提供两种等待方式 # 隐式等待: 调用driver.implicitly_wait. 那么获取不可用元素之前会先等待10秒时间. driver = webdriver.Chrome(executble_path=driver_path) driver.implicitly_wait(10) # 设置等待时间 driver.get('https://www.baidu.com/') #请求访问 # 显示等待:表明某个条件成立之后才执行获取元素的操作. # 也可以在等待的时候制定一个最大的时间,如果超过这个时间那么久跑出异常. # 显示等待使用selenium.webdriver.support.excepted_condition期望条件 和 selenium.webdriver.support.ui.webDriverWait配合完成 from selenium import webdriver import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') # 等待10秒后找这个对应的id标签, 因为是错误的所以等待10秒后报错 # 如果是正确的id 标签, 找到后直接继续执行, 不会等10 秒 WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID,'shjdkah')) )
# 打开多个窗口, 切换页面 重要 ****** from selenium import webdriver import time driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://www.baidu.com/') # 打开豆瓣 driver.execute_script('window.open("https://www.douban.com/")') # 但是当前的driver还是停留在baidu页面 print(driver.current_url) print(driver.window_handles) # 窗口句柄 看看现在打开的窗口有什么 driver.switch_to_window(driver.window_handles[1]) # 切换窗口 print(driver.current_url) # 虽然在窗口中切换到了新的页面,但是driver中还没有切换 # 如果想要在代码中切换到新的页面,并且做爬虫 # 那么应该使用dirver.switch_to_window来切换到指定的窗口 # 从dirver.window_handler中取出具体的第几个窗口 # driver.window_handlers是一个列表,里面装的都是窗口句柄 # 它会按照打开页面的顺序存储窗口句柄
# selenium 设置代理ip 主要是添加一个option参数就可以了 from selenium import webdriver # 设置代理 options = webdriver.ChromeOptions() options.add_argument("--proxy-server-http://112.247.176.104:8060") driver_path = r"G:Crawler and Datachromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options) driver.get('http://httpbin.org/ip')