使用selenium与网页交互、嵌套网页爬取

x33g5p2x  于2021-09-19 转载在 其他  
字(3.5k)|赞(0)|评价(0)|浏览(362)

前进、后退、切换选项卡

  1. from selenium.webdriver import Chrome
  2. import time

创建浏览器对象

  1. driver = Chrome()

依次进入若干个网站

  1. driver.get('https://www.baidu.com')
  2. time.sleep(2)
  3. driver.get('https://www.jd.com')
  4. time.sleep(2)
  5. driver.get('https://www.runoob.com')
前进后退
  1. driver.back()
  2. time.sleep(2)
  3. driver.forward()
切换选项卡
  1. driver.get('https://movie.douban.com/')
  2. music = driver.find_element_by_css_selector('.global-nav-items > ul > li:nth-child(4)>a')
  3. url = music.get_attribute('href')
  4. print(url)
  5. music.click()
  6. time.sleep(2)
  7. # 切换选项卡
  8. driver.switch_to.window(driver.window_handles[0])
  9. time.sleep(2)
  10. driver.switch_to.window(driver.window_handles[1])
  11. driver.get(url)
  12. # driver.quit()

等待

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. from selenium.webdriver.common.by import By
  1. driver = Chrome()
  2. driver.get('https://music.douban.com/')
隐式等待

如果设置了隐式等待时间那么浏览器对象通过find_element相关方法获取标签时在找不到对应的标签时

不会马上报错而是在指定时间内不断尝试获取该标签若超过指定时间还是无法获取则报错

  1. # 设置隐式等待时间只需要设置一次,全局有效
  2. driver.implicitly_wait(2) #等待2秒(等待期间定时去查找)
显式等待 - 等到某个条件成立

1)、创建等待对象:WebDriverWait(浏览器对象,超时时间,检测时间间隔(默认 = 500ms))

2)、等待对象.until(条件) - 等到指定条件为True获取对应的标签或结果(布尔值)

​ 等待对象.until_not(条件) - 等到指定条件为False获取对应的标签或结果(布尔值)

  1. 常见的条件:
  2. wait = WebDriverWait(driver,5)
  3. # EC.presence_of_all_elements_located((By.标签获取方式,获取方式值)) --- 传一个元组 判断某个元素是否被加到dom树里(判断某个标签是否加载到网页里,不一定可见)
  4. wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'css选择器'))) #返回标签
  5. # EC.visibility_of_element_located() --- 判断某个标签是否可见(没有隐藏并且元素的高度与宽度不为0)
  6. wait.until(EC.visibility_of_element_located((By.ID,'id属性值'))) #返回标签
  7. # EC.text_to_be_present_in_element() --- 判断某个标签内容是否包含了预期的字符串
  8. wait.until(EC.text_to_be_present_in_element((By.ID,'id属性值'),'预期的字符串')) # 存在时获取,返回布尔值
  9. wait.until_not(EC.text_to_be_present_in_element((By.ID,'id属性值'),'预期的字符串')) #不存在时获取,返回布尔值
  10. # EC.text_to_be_present_in_element_value() --- 判断某个标签中的value属性是否包含了预期的字符串
  11. wait.until(EC.text_to_be_present_in_element_value()) #返回布尔值
  12. # EC.element_to_be_clickable() --- 判断某个标签是否可以点击,条件成立时返回对应的标签
  13. wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'css选择器')))

滚动

  1. from selenium.webdriver import Chrome,ChromeOptions
  2. from selenium.webdriver.common.keys import Keys
  3. import time
  1. options = ChromeOptions()
  2. # 1) 添加取消测试环境选项
  3. options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
  4. # 2) 取消图片加载
  5. options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

搜索

  1. browser = Chrome()
  2. browser.get('https://www.jd.com')
  3. search = browser.find_element_by_id('key')
  4. search.send_keys('电脑')
  5. search.send_keys(Keys.ENTER)

滚动

  1. max_height = 8400 #最大高度在浏览器具体页面获取
  2. height = 500
  3. while(1):
  4. browser.execute_script(f'window.scrollTo(0,{height})') #核心
  5. height += 500
  6. time.sleep(1)
  7. if(height > max_height):
  8. break

页面最大高度获取方式:

网页嵌套 - 网易邮箱自动登录

前端在实现网页功能的时候可能出现网页中嵌套网页的现象,如果要在一个网页中嵌套另外一个网页必须使用

iframe标签

selenium爬取的时候通过浏览器对象默认获取到的是最外层的HTML对应的网页,如果要获取嵌套网页中的内容

必须使用switch_to来切换frame

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.common.keys import Keys
  1. browser = Chrome()
  2. browser.get('https://mail.163.com/')

切换HTML页面

  1. frame = browser.find_element_by_css_selector('#loginDiv>iframe')
  2. browser.switch_to.frame(frame)
  1. user_name = browser.find_element_by_css_selector('.j-inputtext.dlemail.j-nameforslide')
  2. user_name.send_keys('zzx')
  3. password = browser.find_element_by_css_selector('.j-inputtext.dlpwd')
  4. password.send_keys('123456')
  5. enter = browser.find_element_by_css_selector('#dologin')
  6. enter.click()

爬虫流程

1、用requests + 网页地址

2、用requests + 网页地址 + user-agent

3、用requests + 网页地址 + user-agent + cookie

4、找json数据接口

​ json数据接口若请求方式为get则无请求体,若为post则有请求体需要给data参数赋值

json数据接口查询以及data:

5、使用selenium

相关文章