爬虫之Selenium的使用

爬虫之Selenium和PhantomJS

一:Selenium

​ selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上的某些动作是否发生。只不过操作指令不是通过键盘和鼠标进行获取,而是以脚本中的命令代替了键盘和鼠标。比如说我们在浏览一个网站的时候,会通过键盘输入搜索内容,通过鼠标点击“搜索”来进行搜索操作,这些实现的原理其实是点击了一个<a>标签或是<button>标签后进行页面的跳转或提交。而selenium则可以在提取到这些标签内容后用代码来实现这些操作

​ selenium自己是不带浏览器的,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用,市面上的主流浏览器都可以与之结合,这里我们用一个叫PhantomJS工具来代替真实的浏览器。

二:PhantomJS

​ PhantomJS是一个基于Webkit的“无界面浏览器”,所谓无界面浏览器就是指它不会像Firefox,Google一样有一个界面,他会直接将网站加载到内存中并执行页面上javascript,因为不会展示图形界面,所以它的加载速度会很快,效率会很高,缺点就是我们无法直观的看到它的执行结果,需要我们进行打印才能看到。

​ 我们可以将selenimu和PhantomJS结合起来,这样我们就得到了一个功能强大的网络爬虫了,这个爬虫可以处理javascript、cookie、headers,以及任何我们真实用户需要做的事情

​ PhantomJS下载地址:https://phantomjs.org/download.html,下载后解压即可

​ 注:PHantomJS并不是python的一个库,但是我们可以通过Selenium调用PhantomJS来直接使用

三:Selenium和PhantomJS案例

以百度首页为例

  1. 安装selenium
    pip install selenium
    
  2. 导入webdriver
    from selenium import webdriver
    
  3. 调用浏览器
     # 路径写自己phantomjs.exe保存的路径,且要在路径前加r进行转义
    driver = webdriver.PhantomJS(executable_path=r'D:\PhantomJS\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe')
    
  4. 访问页面
    driver.get(url="https://www.baidu.com/")
    

    执行后不报错即为配置成功,出现的warnings可以忽略

  5. 属性

    5.1 title 获取标题

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

    5.2 page_source 查看页面内容

    print(driver.page_source)  # >>> 此处会获取到百度首页的html数据
    

    5.3 current_url 查看当前请求的url

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

    5.4 get_cookies() 获取当前页面的所有cookie

    print(driver.get_cookies())  # >>> 此处会获取当前页面的cookie信息,以列表列出
    
  6. 查找元素

    6.1 find_element_by_id(“id的值”) 根据id查找元素

    # 获取搜索框对象
    id_border = driver.find_element_by_id("kw")
    print(id_border)  # >>> <selenium.webdriver.remote.webelement.WebElement (session="b90fa750-2fe1-11eb-b0af-19e1fff2dd5d", element=":wdc:1606393209897")>
    

    6.2 find_elements_by_class_name(“class的值”) 根据class获取所有符合class值的元素,返回的是一个列表

    # 获取搜索框对象
    class_border = driver.find_element_by_class_name("s_ipt")  
    print(class_border)  # >>> [<selenium.webdriver.remote.webelement.WebElement (session="d781bb50-2fe2-11eb-81a4-f1588c639f66", element=":wdc:1606393689736")>]
    

    6.3 find_element_by_class_name(“class的值”) 根据class获取符合class值的第一个元素

    # 获取搜索框对象
    search_border = driver.find_element_by_class_name("s_ipt")  # >>> <selenium.webdriver.remote.webelement.WebElement (session="d781bb50-2fe2-11eb-81a4-f1588c639f66", element=":wdc:1606393689736")>
    

    6.4 find_element_by_xpath(“xpath路径”) 根据xpath路径查找元素

    # 获取搜索框对象
    xpath_border = driver.find_element_by_xpath('//*[@id="kw"]')
    print(xpath_border)  # >>> <selenium.webdriver.remote.webelement.WebElement (session="ccabb9a0-2fe3-11eb-b3c7-f19f57541366", element=":wdc:1606394101206")>
    
  7. text 获取标签之间的内容
    # 获取百度首页上面的新闻分类
    news_content = driver.find_element_by_xpath('//a[@class="mnav c-font-normal c-color-t"][1]').text
    print(news_content)  #  >>> 新闻
    
  8. get_attribute(“属性名”) 获取属性值
    # 获取搜索框的class属性的值
    id_attribut = driver.find_element_by_xpath('//*[@id="kw"]').get_attribute("class")
    print(id_attribut)  # >>> s_ipt
    
  9. 全屏截图
    driver.save_screenshot("baidu.png")
    
  10. 局部截图

    距离可以使用alt+a快捷键打开截屏工具,从截屏工具上进行距离选取

    from PIL import Image
    # 打开图片
    img = Image.open("baidu.png")
    
    # crop((左,上,右,下)),接受的是一个元组参数
    img = img.crop((300,180,980,240))
    
    # 保存图片
    img.save("截图.png")
    
  11. send_keys(“输入的内容”)

    先获取文本框,再输入内容

    # 输入内容
    driver.find_element_by_xpath('//input[@id="kw"]').send_keys("刺客伍六七")
    # 获取输入内容的截图进行验证
    driver.save_screenshot("输入.png")
    
  12. click() 点击

    需先输入内容,然后找到按钮对象进行点击操作

    import time
    # 输入内容
    driver.find_element_by_xpath('//input[@id="kw"]').send_keys("刺客伍六七")
    # 点击
    driver.find_element_by_xpath('//*[@id="su"]').click()
    # 让程序休眠3秒,因为页面响应需要时间,而程序运行很快
    time.sleep(3)
    # 获取搜索后页面的截图
    driver.save_screenshot("伍六七.png")
    
  13. 支持快捷键

    举例:全选和剪切

    # 导入模块
    from selenium.webdriver.common.keys import Keys
    
    # 先在搜索框中输入内容
    driver.find_element_by_xpath('//input[@id="kw"]').send_keys("刺客伍六七")
    # 截取全选前的页面截图
    driver.save_screenshot("全选前.png")
    # 对搜索框中内容进行全选,并获取全选时的页面截图
    driver.find_element_by_xpath('//input[@id="kw"]').send_keys(Keys.CONTROL, "a")
    driver.save_screenshot("全选时.png")
    # 对全选的内容进行截切,并获取当前页面的截图
    driver.find_element_by_xpath('//input[@id="kw"]').send_keys(Keys.CONTROL, "x")
    driver.save_screenshot("剪切后.png")
    
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页