selenium+chromdriver 动态网页的爬虫

# 获取加载更多的数据有 2 种方法
# 第一种就是直接找数据接口, 点击'加载更多' 在Network看下, 直接找到数据接口

 

# 第二种方法就是使用selenium+chromdriver

# selenium

from selenium import webdriver
import time

driver_path = r"G:\Crawler and Data\chromedriver.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 Data\chromedriver.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 Data\chromedriver.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 Data\chromedriver.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 Data\chromedriver.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 Data\chromedriver.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 Data\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')

 

转载于:https://www.cnblogs.com/kenD/p/11123663.html

你可能感兴趣的:(selenium+chromdriver 动态网页的爬虫)