爬虫之模拟浏览器
- 前言
- 1. Selenium
- 1.1 Selenium介绍
- 1.2 安装selenium
- 1.3 Selenium访问京东
- 1.4 Selenium元素定位
- 1.5 seleniu访问元素信息
- 1.6 selenium交互
- 2. Phantomjs
- 2.1 介绍Phantomjs
- 2.1 使用Phantomjs
- 3. Chrome handless
- 3.1 Chrome handless的系统要求
- 3.2 Chrome handless的作用
- 3.1 Chrome handless的使用
前言
对于有些网站,如果你访问,它会检查你的浏览器内核,如果发现你是程序,它会禁止你访问,当然程序也是可以模拟浏览器的,具体方法如下所示:
1. Selenium
1.1 Selenium介绍
- Selenium是一个用于Web应用程序测试的工具。
- Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
- 支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动 真实浏览器完成测试
- selenium也是支持无界面浏览器操作的。
之所以使用selenium是因为,有些网页发现是程序在进行访问,有些数据不会返回,使用selenium就可以 模拟浏览器功能,自动执行网页中的js代码,实现动态加载
,(有检查浏览器反爬,就使用selenium,否则使用urllib)
1.2 安装selenium
-
安装浏览器驱动
操作谷歌浏览器驱动下载地址
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访问京东(模仿浏览器直接访问京东):
-
导入selenium
-
创建浏览器操作对象(path就是浏览器驱动路径)
-
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模块修改
-
find_elements_by_tag_name() :根据标签名字获取对象
-
find_elements_by_name() :根据标签属性属性值获取element
-
find_elements_by_id():根据id获取element
-
find_elements_by_xpath() :根据xpath语法获取element
-
find_elements_by_css_selector () :根据bs4的语法获取element
-
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交互就是用代码实现人为操作,比如我想进行如下操作:
- 首先在百度输入框输入周杰伦,然后点击百度一下
- 然后向下滑动到底部
- 点击下一页
- 上一步,下一步,退出
使用的具体函数如下所示;
- 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
- Phantomjs是一个 无界面的浏览器
- 支持页面元素查找,js的执行等
- 由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多
2.1 使用Phantomjs
使用Phantomjs的第一步还是下载Phantomjs的浏览器驱动,并放在你写代码的文件夹中
-
获取PhantomJS.exe文件路径path
-
browser = webdriver.PhantomJS(path)
-
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()