使用selenium模拟浏览器进行数据抓取+搜索指定关键词+下拉滚动demo+selenium等待机制(Chrome Browser

0.安装selenium + Chrome Driver

安装selenium:
pip install selenium
安装Chrome Driver:

  • 下载:http://chromedriver.storage.googleapis.com/index.html
    • 版本要对应(chrome://version查看版本)
  • chromedriver.exe 添加到用户环境变量
1.使用selenium模拟浏览器操作demo
from selenium import webdriver
import time

# 0.创建浏览器对象
browser = webdriver.Chrome()

# 1.访问页面
browser.get('http://www.baidu.com')

print(browser.title)    # 百度一下,你就知道

# print(type(browser.find_element_by_class_name("s-top-left"))) # 

# 2.定位网页元素,可使用( Selenium自带API || 通过browser.page_source获取网页源码再结合BeautifulSoup等解析工具定位元素)

browser.find_element_by_link_text("新闻").click() # 模拟鼠标点击文本为“新闻”的链接

print(browser.current_url)  # https://www.baidu.com/

print(browser.page_source)  # 获取网页源码

time.sleep(5)
browser.quit()  # 浏览器关闭

效果:打开Chrome,点击新闻,等待5s浏览器关闭

2.selenium模拟在豆瓣中搜索框中搜索指定关键词
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('http://douban.com')
time.sleep(1)

search_box = browser.find_element_by_name('q')	# 搜索框
search_box.send_keys('Python')

bt1 = browser.find_element_by_class_name('bn')	#提交按钮
bt1.click()

time.sleep(5)
browser.quit()
3.selenium模拟页面下拉滚动

主要有两种方式

  • 模拟键盘输入(如输入PageDown
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time

browser = webdriver.Chrome()
browser.get('http://news.baidu.com/')

for i in range(20):
    # 模拟键盘输入方式向下滚动,perform()执行ActionChains存储的所有动作
    # 链式模型:ActionChains(browser).send_keys(x).click(y).move_to_element(z).perform()
    # 相当于执行三个动作( t = ActionChains(browser) , t.send_keys(x) , t.click(y)
    # t.move_to_element(z) , t.perform()
    ActionChains(browser).send_keys(Keys.PAGE_DOWN).perform()

    time.sleep(0.5)

browser.quit()
  • 执行JavaScript代码
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('http://news.baidu.com/')

for i in range(10):
    # scrollTo(x,y)方法:将内容滚动到指定坐标
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 滚动到页面底部
    time.sleep(0.5)

4.selenium等待机制

使用Selenium时也要注意等待机制,以保证浏览器被驱动时能够有寻找元素的缓冲时间
分为隐式等待显式等待

  • 隐式等待可以直接通过浏览器驱动对象implicitly_wait(x)调用(不灵活、写法简单
browser = webdriver.Chrome()

browser.implicitly_wait(x)     # 若下面的find_element_by_id()未能立即获得结果,则保持轮询并等待x秒
browser.get('a url')
browser.find_element_by_id('id_name')
  • 显式等待通过结合WebDriverWaitExpected Condition使用:(等待某一条件发生,较灵活
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('a url')

WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.LINK_TEXT, 'text'))).click()

其中,
WebDriverWait(driver=browser, timeout=10, poll_frequency=0.5, ignored_exceptions=None):

  1. driver:浏览器驱动
  2. timeout:最长超时时间,单位(秒)
  3. poll_frequency:轮询检测时间,也就是每隔多少时间检测一次,默认是0.5秒
  4. ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException

你可能感兴趣的:(爬虫,python)