动态渲染页面爬取

JavaScript动态渲染

其中一种方式是Ajax请求,通过直接分析Ajax再用requests来实现数据爬取

另外一种方式是模拟浏览器运行

一、 Selenium库

Selenium是自动化测试工具,可以驱动浏览器执行特定动作(点击、下拉),还可以获取浏览器当前呈现页面的源代码,可见即可爬

1、模拟 Chrome浏览器,一定要先配置chromedriver

(1)先查看Chrome版本,在浏览器中输入chrome://version/

(2)下载地址:https://npm.taobao.org/mirrors/chromedriver/

   下载与浏览器同版本的chromedriver

  将下载的chromedriver复制到安装的Chrome文件夹下

(3) 配置环境变量

将Chrome目录复制到PATH内

(4)测试是否安装成功

2、小小实例,模拟Chrome浏览器,访问百度,搜索‘selenium’

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

##chromedriver的目录
chrome_driver=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
browser = webdriver.Chrome(executable_path=chrome_driver) browser.get('http://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('selenium')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_all_elements_located((By.ID, 'content_left')))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)

 运行结果:浏览器自动打开,进入百度,然后搜索

输出当前的URL、Cookies、源代码等等

报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件

打开报错提示中subprocess.py

找到 __init__函数 中的shell = False 改成shell = True

 3、声明浏览器对象

from selenium import webdriver

## 浏览器对象初始化并赋值给 browser 对象

## selenium支持各种浏览器
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.Ie() ## 还支持无界面浏览器
browser = webdriver.PhantomJS() ## 支持手机端浏览器
browser = webdriver.Android()
browser = webdriver.BlackBerry()
browser = webdriver.Safari()

 

4、访问页面

from selenium import webdriver

# 浏览器对象初始化并赋值给 browser 对象
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
## 输出淘宝页面的源代码
print(browser.page_source)
browser.close()

  

5、查找节点

       ①获取单个节点的方法

## 查找单个节点
## 查找淘宝首页的搜索框
## <input id="q" name="q" aria-label="请输入搜索文字" accesskey="s" autofocus="autofocus" autocomplete="off" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate">
from selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.taobao.com') ## find_element_by_id() 根据 id 获取
input_first = browser.find_element_by_id('q')
## find_element_by_name() 根据 name 获取
input_second = browser.find_element_by_name('q')
## CSS选择器获取
input_third = browser.find_elements_by_css_selector('#q')
## XPath选择器获取
input_forth = browser.find_element_by_xpath('//*[@id="q"]')
## 4个查找结果相同
## 返回结果为 WebElement 类型
print(input_first, input_second, input_third, input_forth)
browser.close()

   

  find_element(查找方式By , 值)

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
## find_element(By.ID, 'q') 等价于 browser.find_element_by_id('q')
input_first = browser.find_element(By.ID, 'q')
print(input_first)
browser.close()

  

  ②获取多个节点的方法

  find_element()只能返回第一个结果

  find_elements()只能返回查找到的所有结果,返回列表类型

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
## 返回查找到的所有结果, 列表类型
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close() list = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')
print(list)

6、节点交互

  Selenium可以驱动浏览器执行一些操作

  ※输入文字 send_key( )

  ※清空文字 clear( )

  ※点击按钮 click( )

from selenium import webdriver
import time browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
## 获取搜索输入框
input = browser.find_element_by_id('q')
## 输入 'T恤' 关键字进
input.send_keys('T恤')
time.sleep(1)
## 清空搜索框
input.clear()
## 输入 '连衣裙' 关键字
input.send_keys('连衣裙')
botton = browser.find_element_by_class_name('btn-search')
## 点击搜索按钮,完成搜索
botton.click()

  

7、动作链ActionChains:鼠标拖拽、键盘按键等

## 实现模拟鼠标拖拽
from selenium import webdriver
from selenium.webdriver import ActionChains browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

8、执行JavaScript

   Selenium API 没有提供的功能,都可以用执行JavaScript 来实现

比如:下拉进度条

# 模拟下拉进度条
from selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
## execute_script()方法将进度条拖至最底部
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
## 弹出alert提示框
browser.execute_script('alert("To Bottom")')

运行结果:  

9、获取节点信息

       page_source可以获得页面源代码,再用解析库来提取信息

       但Selenium提供了选择节点的方法,返回WebElement类型,就可以不用解析库进行解析

from selenium import webdriver
from selenium.webdriver import ActionChains browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore') ## 获取属性 get_attribute()
col = browser.find_element_by_id('collection')
print(col.get_attribute('class')) ## 获取文本值 text
input = browser.find_element_by_css_selector('.ExploreRoundtableCard-questionTitle')
print(input.text) ## 获取id等其他属性值
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

  

10、切换 Frame

switch_to.frame()

import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome()
browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
## 切换到 子Frame
browser.switch_to.frame('iframeResult') try:
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print('No logo')
## 切换到 父Frame
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

  

11、延时等待

       Selenium中,get()方法在网页框架加载结束后执行,但是有些额外的Ajax请求可能没有加载完,需要延时等待一段时间,确保节点全部加载。

       ※隐式等待

              如果没有找到指定节点,则继续等待设定时间,超出设定时间抛出异常

              implicitly_wait()

from selenium import webdriver

browser = webdriver.Chrome()
## 隐式等待 10s
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('App-main')
print(input)

  

       ※显式等待【比隐式好一点】  

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
## 设定最长等待时间
wait = WebDriverWait(browser, 10)
## 10s内 ID为 q 的节点成功加载,则返回该节点,否则抛出异常
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
## 10s该按钮是可点击的,就返回这个按钮,否则抛出异常
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

12、前进和后退

## 前进和后退
import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.zhihu.com')
## 后退
browser.back()
time.sleep(5)
## 前进
browser.forward()
browser.close()

  

13、对cookies进行操作:获取、添加、删除cookies

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
## get_cookies()获取所有cookies
print(browser.get_cookies())
## 以字典形式添加新的 cookies
browser.add_cookie({'name':'name', 'domain':'www.zhihu.com', 'value':'germey'})
print(browser.get_cookies())
## 删除所有 cookies
browser.delete_all_cookies()
print(browser.get_cookies())

  

14、选项卡管理

# 对选项卡进行操作
import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
## window.open() JavaScript语句新开启一个选项卡
browser.execute_script('window.open()')
print(browser.window_handles)
## 切换到新的选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
## 切换到第一个选项卡
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

15、异常处理

## 节点未找到节点
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('超时') try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('未找到指定节点') finally:
browser.close()

  

  

  

  

 

  

【BOOK】动态渲染页面爬取--Selenium库的更多相关文章

  1. 动态渲染页面爬取-Selenium & Splash

    模拟浏览器的动机 JS动态渲染的页面不止Ajax一种 很多网页的Ajax接口含有加密参数,分析其规律的成本过高 通过对浏览器运行方式的模拟,我们将做到:可见即可爬 Python中常用的模拟浏览器运行的 ...

  2. 爬虫动态渲染页面爬取之selenium驱动chrome浏览器的使用

    Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,可以用其进行网页动态渲染页面的爬取. 支持的浏览器包括IE(7, 8, 9, 10 ...

  3. 爬虫动态渲染页面爬取之Splash的介绍和使用

    Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库.利用它,我们同样可以实现动态渲染页面的抓取. 1. 功能介 ...

  4. 动态渲染页面爬取(Python 网络爬虫) ---Selenium的使用

    Selenium 的使用 Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaS ...

  5. 爬虫之Selenium 动态渲染页面爬取

    Selenim 是一个自动化测试工具,可以利用它驱动浏览器执行特定的动作,如点击.下拉等操作,同时可以获取浏览器当前呈现的页面的源代码,做到可见及可爬 1.使用流程 1)声明浏览器对象 Seleniu ...

  6. python3编写网络爬虫14-动态渲染页面爬取

    一.动态渲染页面爬取 上节课我们了解了Ajax分析和抓取方式,这其实也是JavaScript动态渲染页面的一种情形,通过直接分析Ajax,借助requests和urllib实现数据爬取 但是javaS ...

  7. [Python3网络爬虫开发实战] 7-动态渲染页面爬取

    在前一章中,我们了解了Ajax的分析和抓取方式,这其实也是JavaScript动态渲染的页面的一种情形,通过直接分析Ajax,我们仍然可以借助requests或urllib来实现数据爬取. 不过Jav ...

  8. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  9. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  10. Python Requests库入门——应用实例-京东商品页面爬取+模拟浏览器爬取信息

    京东商品页面爬取 选择了一款荣耀手机的页面(给华为打广告了,荣耀play真心不错) import requests url = "https://item.jd.com/7479912.ht ...

随机推荐

  1. 使用 WSDL 指定的标准 SOAP 消息格式

    为 XML 文档(定义 Web 服务)定义架构的行业标准 Web 服务描述语言 (WSDL) 提供了两个主要的 SOAP 格式设置选项.这两个选项均在 XML 元素中指定,而不在主 WSDL 命名空间 ...

  2. nginx(二) の 配置静态资源网站

    首先在开始配置前,要想明白,nginx 配置 静态资源 服务时基本逻辑,其实就是要 将路由地址与服务器中文件真实的存储地址进行映射. 配置静态资源样例 配置前,首先要将当前配置文件的路径,写入到 ng ...

  3. JAVA学习笔记-09

    多线程: 进程:就是正在执行中的程序,每一个进程执行都有一个执行的顺序,该顺序是一个执行路径.或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行 一个进程中至少有一个线 ...

  4. autohotkey switching within applications

    class QdirManager { ppid := -1 ppath := "" __New(pathIn) { this.ppath := pathIn } __Delete ...

  5. win10 安装mariadb

    在MariaDB10.2.17 以前.解压后在目录下看到my-huge.ini.my-innodb-heavy-4G.ini.my-large.ini.my-medium.ini.my-small.i ...

  6. ansible笔记第三章(Ansible--tasks任务控制)

    (1)when判断语句 实践案例一.根据不同操作系统,安装相同的软件包 [root@m01 project1]# cat tasks_1.yml - hosts: oldboy tasks: - na ...

  7. C语言学习记录(二)

    C语言学习记录(二) 一.知识要点(C语言概述) 1.C语言的发展历史和特点 C语言的发展历史 C语言最早在B语言的基础上开发出来,并于1972年在一台计算机上首次实现. C语言最开始只是为描述和实现 ...

  8. 前端BootStrap框架和django创建项目和app

    1.JS 正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep ...

  9. OSPF配置知识总结2(单区域)

    OSPF配置知识总结2 静态路由有静态路由的好处,但也有弊端,牵一发动全身,在一个路由路径上,只要变一个,其他所有的路由器上的静态路由都要跟着改变. 用动态路由OSPF很简单就能解决这个问题.如下: ...

  10. 123data路径

    /zhf/Innosky2021/data/dayantahttp://123.xx.xx.147:8888/cesiumdemo/data/dayanta/tileset.json