动态渲染页面爬取

动态渲染页面爬取

  • Selenium的使用
    • 基本使用
      • 声明浏览器对象
      • 访问页面
      • 查找节点
      • 节点交互
      • 动作链
  • Splash的使用
    • splash页面渲染失败的解决方法:
    • splash 对象属性
    • Splash对象方法
    • Splash API 调用
      • render.html
      • render.png
      • excute

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 EC4
from selenium.webdriver.support.wait import WebDriverWait
browser=webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input=browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait=WebDriverWait(browser,10)
    wait.until(EC4.presence_of_element_located((By.ID,'content_left')))
    print(browser.current_url)
    print(browser.get_cookie())
    print(browser.page_source)
finally:
    browser.close()

声明浏览器对象

from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.Edge()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()

访问页面

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()

查找节点

  • 单个节点
    find_element_by_id
    find_element_name
    find_element_by_xpath
    find_element_by_class_name
    find_element_by_tag_name
    find_element_by_css_selector
    find_element_by_partial_link_text
    通用方法:
    find_element(By.x,’*’)
    find_element_by_id(id)等价于find_element(By.ID,id)
  • 多个节点
    find_element只能获取匹配的第一个节点WebElement类型
    find_elements结果为列表类型,列表中每个节点是WebElement类型

节点交互

动作链

from selenium import webdriver
from selenium.webdriver import ActionChains
browser=webdriver.Chrome()
url='http://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')
声明ActionChains对象
actions=ActionChains(browser)
actions.drag_and_drop(source,target)
actions.perform()
#执行JavaScript对象
browser.execute_script('window.scrollTo(0,document.body.scrollHeight')
browser.execute_script('alert("To Bottom")')
#获取节点信息
logo=browser.find_element_by_class_name('zhihuLogolink')
#获取属性
print(logo.get_attribute('class'))
#获取文本值
input=browser.find_element_by_class_name('zu-top-add-question')
print(input.text)
#获取id,位置,标签名和大小
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
  • 切换Frame
browser.switch_to_frame('iframeResult')
try:
    logo=browser.find_element_by_class_name('logo')
except NoSuchAttributeException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo=browser.find_element_by_class_name('logo')
#隐式等待
from selenium import webdriver
browser=webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
#显示等待
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)
input=wait.until(EC.presence_of_element_located((By.ID,'q')))
#等待条件
button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input,button)
  • 前进后退
browser.back()
time.sleep(1)
browser.forward()
  • Cookies
print(browser.get_cookies())
browser.add_cookie({
     'name':'name','domain':'www.zhihu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()

Splash的使用

splash页面渲染失败的解决方法:

转载: link.

splash 对象属性

  • js_enabled:Splash的Javascript执行开关
  • resource_timeout:设置加载的超时时间
  • images_enable:设置图片石油加载
  • plugins_enabled:控制浏览器插件是否开启
  • scroll_position:页面滚动

Splash对象方法

  • go():请求某个链接
  • wait():控制页面的等待时间
    wait(time, cancel_on_redirect=false,cancel_on_error=true}
  • jsfunc():可以直接调用JavaScript定义的方法
    jsfunc([[
    function(){
    var body=document.body;
    var divs=body.getElementsByTagName(‘div’);
    return divs.length,
    }
    ]])
  • evaljs():执行js代码,并返回最后一条js语句的返回结果
local title=splash:evaljs("document.title")
  • runjs():与evaljs的功能类似,但是更偏向于执行某些动作或声明某些方法
  • autoload():设置每个页面访问时自动加载的对象,只加载不执行
  • call_later():设置定时任务和延迟时间俩实现任务延时执行
function main(splash,args)
  local snapshots={
     }
  local timer=splash:call_later(function()
    snapshots["a"]=splash:png()
    splash:wait(1.0)
    snapshots["b"]=splash:png()
    end,0.2)
  splash:go("https://www.taobao.com")
  splash:wait(3.0)
  return snapshots
end
  • http_get():模拟发送HTTP的GET请求
    response=splash:http_get{url,headers=nil,follow_redirects=true}
    follow_redirects:表示是否启动自动重定向
  • http_post():与上类似
    response=splash:http_post{url, headers=nil, follow_redirects=true, body=nil}
    body:表单数据
  • set_content():设置页面内容
  • html():获取网页源代码
  • png():获取png格式的网页截图
  • jpg()
  • har():获取页面加载过程描述
  • url():获取当前正在访问的url
  • get_cookies()
  • add_cookies()
  • clear_cookies()
  • get_viewport_size():获取当前浏览器页面的大小,既宽高
  • set_viewport_size():设置当前浏览器页面的大小,既宽高
  • set_viewport_full():设置浏览器全屏显示
  • set_user_agent():设置浏览器的User-Agent()
  • set_custom_headers()
  • select():选择符合条件的节点
  • select_all():选择所有符合条件节点
  • mouse_click():模拟鼠标点击操作

Splash API 调用

render.html

import requests
url='http://localhost:8050/render.html?url=https://www.baidu.com&wait=5'#wait设置时间
response=requests.get(url)
print(response.text)

render.png

获取网页截图

excute

实现与lua脚本的对接

你可能感兴趣的:(python爬虫,selenium,python,爬虫)