爬虫之Selenium,Phantomjs,Chrome handless


前言

对于有些网站,如果你访问,它会检查你的浏览器内核,如果发现你是程序,它会禁止你访问,当然程序也是可以模拟浏览器的,具体方法如下所示:


1. Selenium

1.1 Selenium介绍

  1. Selenium是一个用于Web应用程序测试的工具。
  2. Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
  3. 支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动 真实浏览器完成测试
  4. selenium也是支持无界面浏览器操作的。

之所以使用selenium是因为,有些网页发现是程序在进行访问,有些数据不会返回,使用selenium就可以 模拟浏览器功能,自动执行网页中的js代码,实现动态加载 ,(有检查浏览器反爬,就使用selenium,否则使用urllib)

1.2 安装selenium

  1. 安装浏览器驱动

    操作谷歌浏览器驱动下载地址 http://chromedriver.storage.googleapis.com/index.html ,要下载和自己谷歌浏览器版本相同的浏览器驱动,具体的查看方法如下所示:

在这里插入图片描述

下载完后把下载的东西放到你的代码区域

在这里插入图片描述

然后在终端输入:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/,或者你直接安装selenium包

1.3 Selenium访问京东

import urllib.request

url = 'https://www.jd.com/'

response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))

在这里插入图片描述

如上所示,直接访问京东html网页,只是打印了一部分的网页数据,下面使用
Selenium访问京东(模仿浏览器直接访问京东):

  1. 导入selenium

  2. 创建浏览器操作对象(path就是浏览器驱动路径)

  3. get(url)访问网站,page_source获取网页源码

    from selenium import webdriver
    
    url = 'https://www.jd.com'
    
    path = 'chromedriver.exe'
    browser = webdriver.Chrome(path)
    
    browser.get(url)
    print(browser.page_source)
    
    # CTRL + F:进行查找
    

1.4 Selenium元素定位

现在webdriver这个模块只有两个函数 find_elements和 find_element,要想使用如下6个函数,必须进行修改,具体修改方案如下:

webdriver模块修改

  1. find_elements_by_tag_name() :根据标签名字获取对象

  2. find_elements_by_name() :根据标签属性属性值获取element

  3. find_elements_by_id():根据id获取element

  4. find_elements_by_xpath() :根据xpath语法获取element

  5. find_elements_by_css_selector () :根据bs4的语法获取element

  6. find_elements_by_link_text() :根据链接文本获取数据

    如上获取的element都是列表,当如上elements变成element,就说明获取的是单个对象,如下以获取百度一下为案例:

在这里插入图片描述

	    from selenium.webdriver.chrome.service import Service
	    from selenium import webdriver
	    
	    path = Service('chromedriver.exe')
	    browser = webdriver.Chrome(service=path)
	    
	    url = 'https://www.baidu.com'
	    browser.get(url)
	    
	    
	    button = browser.find_elements('id', 'su')
	    print(button)
	    
	    button = browser.find_elements('xpath', '//input[@id="su"]')
	    print(button)

改版后的 find_elements和 find_element的第一个参数就是如上的6个方法除了find_elements_by_后的值,第二个参数就是如上6个方法的参数,注意tag_name要改为tag name

1.5 seleniu访问元素信息

  • tag_name:标签名称
  • text:标签包含的内容
  • get_attrbute(属性):属性值
from selenium.webdriver.chrome.webdriver import Service
from selenium import webdriver

url = 'https://www.baidu.com'

path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
element = browser.find_element('id', 'su')
print(element.tag_name)
print(element.get_attribute('id'))
a = browser.find_element('link text', '新闻')
print(a.text)

1.6 selenium交互

selenium交互就是用代码实现人为操作,比如我想进行如下操作:

  1. 首先在百度输入框输入周杰伦,然后点击百度一下
  2. 然后向下滑动到底部
  3. 点击下一页
  4. 上一步,下一步,退出

使用的具体函数如下所示;

  • element.send_keys(value): 输入
  • element.click(): 点击
  • browser.execute_script(): 模拟JS滚动
  • browser.back():上一页
  • browser.forward():下一页
  • browser.quit():退出
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep


url = 'https://www.baidu.com'

path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
sleep(2)
input = browser.find_element('id', 'kw')
input.send_keys('周杰伦')
sleep(2)
button = browser.find_element('id', 'su')
button.click()
sleep(2)

# 滑到底部
js_bottom = 'document.documentElement.scrollTop=100000'
browser.execute_script(js_bottom)
sleep(2)

next = browser.find_element('xpath', '//a[@class="n"]')
next.click()
sleep(2)

browser.back()
sleep(2)

browser.forward()
sleep(2)

browser.quit()

2. Phantomjs

之所以使用Phantomjs,是因为selenium进行css和gui渲染非常慢,所以才会使用Phantomjs,由于不进行css和gui渲染,Phantomjs运行效率要比真实的浏览器要快很多(selenium展示界面,Phantomjs不展示界面,但是运行结果一致),Phantomjs已经被淘汰了,已经不在使用了

2.1 介绍Phantomjs

  1. Phantomjs是一个 无界面的浏览器
  2. 支持页面元素查找,js的执行等
  3. 由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多

2.1 使用Phantomjs

使用Phantomjs的第一步还是下载Phantomjs的浏览器驱动,并放在你写代码的文件夹中

  1. 获取PhantomJS.exe文件路径path

  2. browser = webdriver.PhantomJS(path)

  3. browser.get(url)

    from selenium import webdriver
    
    path = 'phantomjs.exe'
    
    browser = webdriver.PhantomJS(path)
    
    
    url = 'https://www.baidu.com'
    browser.get(url)
    
    browser.save_screenshot('baidu.png')
    
    import time
    time.sleep(2)
    
    input = browser.find_element_by_id('kw')
    input.send_keys('昆凌')
    
    time.sleep(3)
    
    browser.save_screenshot('kunling.png')
    
    

3. Chrome handless

Chrome-headless 模式, Google 针对 Chrome 浏览器 59版 新增加的一种模式,可以让你不打开UI界面的情况下 使用 Chrome 浏览器,所以运行效果与 Chrome 保持完美一致。

3.1 Chrome handless的系统要求

1、Chrome 版本要求
    Unix/Linux 系统要求 chrome >= 59
    Windows 系统需要 chrome >= 60
2、Python 版本 >= 3.6
3、Selenium 版本 >= 3.4
4、ChromeDriver 版本 >= 2.31

3.2 Chrome handless的作用

from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep


url = 'https://www.baidu.com'

# 如下两句代码就是创建浏览器对象
path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
sleep(2)

运行如上的代码,我们会发现有一个百度的界面展示出来,这样运行的界面需要加载css,js等,但是我们只要dom元素,不需要显示界面,这就是Chrome handless的作用,通俗来说Chrome handless就是改变path = Service('chromedriver.exe') browser = webdriver.Chrome(service=path)这两句代码,不让浏览器加载css,js等,提高访问速度

3.1 Chrome handless的使用

# 导入 selenium
from selenium import webdriver
# 如果需要指定路径,但是路径在新版本中被重构到 Service 函数中了
from selenium.webdriver.chrome.service import Service
# 配置对象
from selenium.webdriver.chrome.options import Options
# 导入 定时器
from time import sleep


# 浏览器封装,
def share_browser():
    path = 'chromedriver'  # 浏览器驱动路径(可以是下载的驱动,也可以直接使用电脑上 Chrome 浏览器的驱动,找到路径就行)
    options = Options()  # 配置对象
    # options.add_experimental_option('detach', True) # 不自动关闭浏览器
    # 如下两句是模式设置
    options.add_argument('--headless')  # 设置无窗口模式
    options.add_argument('--disable-gpu')  # 禁用gpu加速

    # 创建浏览器
    service = Service(path)
    browser = webdriver.Chrome(service=service, options=options)
    return browser


# 创建浏览器,就这个函数和selenium创建的浏览器不同,其余的
browser = share_browser()

# 打开指定网址
browser.get('https://www.baidu.com')

# 拍摄图片
browser.save_screenshot('baidu.png')  

# 睡眠
sleep(2)

# 退出
browser.quit()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值