1.什么是动态渲染页面爬取?
ajax方式也是动态渲染的一种,但是动态渲染并不止有ajax这一种,比如有些网页是由javascript生成的,并非原始html代码,这其中并不包含ajax请求,,比如Echarts官网,其图形都是经过javaScript计算之后生成的。还有就是淘宝这种网页,它既是是ajax获取的数据,但是其ajax接口含有很多加密参数,我们很难找出其中的规律,也很难直接分析ajax来抓取。
2.解决办法:
我们可以直接用模拟浏览器运行的方式来爬取,即可见即可爬,这样就不用去关心网页是由什么算法渲染页面,也不用去管后台的ajax接口到底有哪些参数。
python提供了很多模拟浏览器运行的库,如.Selenium,Splash,pyV8,Ghost等。
3.Selenium的使用:
3-1:安装Selenium : pip install xxx
3-2:Selenium是一个自动检测化工具,利用它可以驱动浏览器指定特定的动作,如点击,下拉等操作。
3-3:安装 谷歌 webdriver 参考下面文章:
https://blog.csdn.net/wwwq2386466490/article/details/81513888
4.Selenium的使用:
4-1:通过谷歌驱动打开百度, 输入Python, 回车,(显示等待),(异常获取),提取源码,再通过BeautifulSoup解析库操作数据。
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from time import sleep
# 异常
from selenium.common.exceptions import TimeoutException,NoSuchElementException
# 选择通过谷歌驱动打开网页 也可选择火狐,PhantomJS等浏览器
broser = webdriver.Chrome()
try:
broser.get('https://www.baidu.com/') # 请求网址
# 根据不同方式获取标签位置
#根据id获取
input = broser.find_element_by_id('kw')
# 根据name 获取
# input1 = broser.find_element_by_name('s_ipt')
# # copy selector 获取
# input2 = broser.find_element_by_css_selector('#kw')
# # 根据xpath 获取
# input3 = broser.find_element_by_xpath('//*[@id="kw"]')
input.send_keys('Python') # 在标签id为 kw的 也就是文本框内 输入内容
input.send_keys(Keys.ENTER) # 单击操作
# 显示等待 (确保指定节点被加载出来) 更多呢等待条件 百度
wait = WebDriverWait(broser,10)
# 在指定时间内 指定id被加载出来 则打印源码 否则 抛出异常
wait.until(EC.presence_of_element_located((By.ID,'content_left1')))
# 打印信息
print 'url : ' ,broser.current_url # 打印 url
print 'cookies :',broser.get_cookies() # 打印 cookies
print '源码 : ',broser.page_source # 源码
# Selenium 通过谷歌驱动打开网页 获取到源码后 通过 BeautifulSoup等解析库 来操作所需数据
soup = BeautifulSoup(broser.page_source, 'lxml')
# copy Selector
values = soup.select('#s_tab > div > a')
for v in values:
print "v : " + v.get_text() # 获取a标签的值
except Exception as e:
# 捕获异常 不影响程序
print '异常了'
print ('Error', e.args)
finally:
# 休眠10秒 关闭浏览器
sleep(10)
broser.close()
4-2:下拉操作 (可以通过execute_script() 方法,通过执行javaScript 完成操作)
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from time import sleep
# 选择通过谷歌驱动打开网页 也可选择火狐,PhantomJS等浏览器
broser = webdriver.Chrome()
# 把进度条拖到最底部
broser.get('https://www.zhihu.com/explore') # 请求网址
broser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
broser.execute_script('alert("To Bottom")')
4-3:待续