zoukankan      html  css  js  c++  java
  • [Python自学] 爬虫(5)selenium

    一、准备工作

    1.安装selenium

    pip install selenium

    2.下载安装chromedriver.exe

    注意:如果Chrome在自动更新的话,可能会导致运行出现问题,我们应该去系统服务中禁用Chrome的自动更新服务。

    下载chromedriver.exe:

    http://chromedriver.storage.googleapis.com/index.html

    【除了该下载地址,还可以去淘宝镜像下载:https://developer.aliyun.com/mirror/NPM?from=tnpm

    其中提供了phantomjs,chromedriver,OperaDriver等镜像地址。】

    下载与自己Chrome浏览器版本接近的版本(大版本号一定要对应上)。

    可以按照以下方式查看版本是否能对应:

    下载完毕后,将chromedrive.exe拷贝到Chrome浏览器根目录:

    Chrome根目录:C:Program Files (x86)GoogleChromeApplication

    以上是我的路径。

    将Chrome根目录加到系统环境变量中:

    即保证selenium能够执行chromedriver.exe程序即可(所在目录添加在系统变量)。

    二、简单使用selenium

    1.打开baidu首页

    import time
    from selenium import webdriver
    
    # 创建一个Chrome浏览器实例
    driver = webdriver.Chrome()
    # 打开百度首页
    driver.get("http://www.baidu.com")
    
    # 睡眠5s观察效果
    time.sleep(5)
    # 退出浏览器
    driver.quit()

    2.在百度首页自动搜索"python"

    import time
    from selenium import webdriver
    
    # 创建一个Chrome浏览器实例
    driver = webdriver.Chrome()
    
    # 设置窗口大小为1920x1080
    # driver.set_window_size(1920,1080)
    # 设置窗口为全屏
    driver.maximize_window()
    
    # 打开百度首页
    driver.get("http://www.baidu.com")
    
    # 元素定位,找到百度的搜索输入框
    driver.find_element_by_id("kw").send_keys('python')
    # 点击搜索
    driver.find_element_by_id("su").click()
    
    # 睡眠5s观察效果
    time.sleep(5)
    # 退出浏览器
    driver.quit()

    这样我们就完成了一次使用selenium来自动打开百度首页,并输入python进行搜索的流程。

    3.获取cookie

    使用以下方式获取所有的cookie:

    import time
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    # 获取所有的cookie信息
    cookies = driver.get_cookies()
    # 只保留cookie的名称和值
    cookies = {i['name']: i['value'] for i in cookies}
    print(
        cookies)  # {'H_PS_PSSID': '31622_1457_31325_21104_31110_31594_31464_31321_30823_26350', 'BD_LAST_QID': '11445339033471882529', 'BAIDUID': '7D5178AD3B9D241D5B1877CE5E2F5383:FG=1', 'BIDUPSID': '7D5178AD3B9D241DC887CABE7DFF3DF4', 'PSTM': '1589774143', 'BD_UPN': '12314753', 'BD_HOME': '1'}
    
    time.sleep(3)
    driver.quit()  # 退出浏览器。另外driver.close()是关闭页面,当关闭了最后一个页面,则退出浏览器。

    4.获取其他信息

    driver.page_source  # 对应F12中Elements的内容
    driver.current_url  # 对应当前访问的URL,即当前代码所在位置对应浏览器所在url

    三、selenium页面元素定位

    1.使用xpath查找元素

    li_list = driver.find_elements_by_xpath("//ul[@id='detail-list']/li")  # 获取多个li标签
    for li in li_list:
        li.find_element_by_xpath(".//h1/p")  # 继续使用xpath获取其中的一个标签

    注意,find_elements_by_xpath是获取多个标签的列表,而find_element_by_xpath是获取一个标签(第一个)。并且使用find_element_**方法,只能获取标签元素,而不能用于获取文本,例如 ".//h1/p/text()" 就不是一个标签,会报错: ".//h1/p/text()" is: [object Text]. It Shoud be an element. 

    如果要获取标签的属性值:

    li.find_element_by_xpath(".//h1/p").text
    li.find_element_by_xpath(".//h1/a").get_attribute("href")

    2.使用link的text来查找连接的url

    例如页面上有一个按钮 下一页> ,我们想获取他对应的url连接:

    driver.find_element_by_link_text("下一页>").get_attribute("href")

    偏文本匹配(即局部包含文本):

    driver.find_element_by_partial_link_text("下一").get_attribute("href")

    3.其他

    除了以上查找元素的方式,selenium还支持其他的方式,例如:

    driver.find_elements_by_tag_name()
    driver.find_elements_by_class_name()
    driver.find_elements_by_css_selector()

    四、处理iframe标签

    1.切换到ifame标签

    我们知道,iframe标签是可以嵌入在html页面中的另一个页面,所以我们直接使用driver是无法拿到iframe中的元素的。需要进行一下操作:

    import time
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("https://mail.qq.com/cgi-bin/loginpage")
    
    # 对应登录框的标签为iframe id=login_frame
    driver.switch_to.frame("login_frame")
    # 找到iframe中的username的输入框
    username = driver.find_element_by_xpath("//input[@id='u']")
    # 输入数据
    username.send_keys("4774177")
    
    time.sleep(3)
    driver.quit()

    可以看到,我们以QQ邮箱登陆页面为例,将driver切换到iframe,然后找到输入框输入数据。

    2.切换回主页面

    driver.switch_to.default_content()

    五、设置标签获取等待时间

    在selenium中,只有请求第一个页面的时候,会自动等待页面加载完毕后再获取标签对象。

    但如果我们在流程中翻页(例如下一页),selenium则不会等待页面加载完毕,而直接去获取标签对象。有可能获取失败(标签还未加载出来)。

    这时我们需要设置一个等待时间,有三种方式:

    1.强制等待

    import time
    time.sleep(3)  # 强制等待3秒

    2.显式等待(了解)

    设置一个最长等待时间,如果在时间内未找到元素,则抛出异常:

    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"kw"),message="")

    3.隐式等待

    简单的设置一个最大等待时间,单位是秒

    driver.implicitly_wait(10) #隐式等待10秒

    关于以上三种等待方式的优缺点,参考:https://blog.csdn.net/sinat_41774836/article/details/88965281#WebDriverWait_17

    ===

  • 相关阅读:
    R-CNN学习笔记
    Numpy和Pandas
    用python解决打标签时将xml文件的标签名打错
    爬虫Ⅱ:scrapy框架
    爬虫Ⅰ:爬虫的基础知识
    Linux学习笔记
    MySql笔记Ⅱ
    MySql笔记Ⅰ
    Qt数据库报错:“Unable to execute statement”
    Qt数据库报错“out of memory Error opening database“
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/12903090.html
Copyright © 2011-2022 走看看