《python3網絡爬蟲開發實戰》--動態渲染頁面爬取


Ajax可以對JS進行渲染,但有些直接通過JS來渲染,例如淘寶,許多圖形是通過JavaScript計算之后形成的,里面的Ajax接口含有許多加密參數,無法找到規律,像Echarts

1. selenium

Selenium是一個 自動化測試工具,利用它可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作,同時還可以獲取瀏覽器當前呈現的頁面的源代碼,做到可見即可爬

  1 from selenium import webdriver
  2 from selenium.webdriver.common.by import By
  3 from selenium.webdriver.common.keys import Keys
  4 from selenium.webdriver.support import expected_conditions as EC
  5 from selenium.webdriver.support.wait import WebDriverWait
  6 from selenium.common.exceptions import NoSuchElementException
  7 from selenium.webdriver.support.ui import WebDriverWait
  8 from selenium.webdriver import ActionChains
  9 import time
 10 
 11 browser = webdriver.Chrome()
 12 
 13 '''
 14 #訪問百度,並查詢python
 15 try:
 16     browser.get('https://www.baidu.com')
 17     input = browser.find_element_by_id('kw')
 18     input.send_keys('Python')
 19     input.send_keys(Keys.ENTER)
 20     wait = WebDriverWait(browser, 10)
 21     wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
 22     print(browser.current_url)
 23     print(browser.get_cookies())
 24     print(browser.page_source)
 25 finally:
 26     browser.close()
 27 
 28 #訪問淘寶
 29 #單個節點
 30 browser.get('http://www.taobao.com')
 31 input_first = browser.find_element_by_id('q')
 32 input_second = browser.find_element_by_css_selector('#q')
 33 input_third = browser.find_element_by_xpath('//*[@id="q"]')
 34 print(input_first, input_second, input_third)
 35 #print(browser.page_source)
 36 browser.close()
 37 '''
 38 
 39 '''
 40 #多個節點
 41 import time
 42 browser = webdriver.Chrome()
 43 browser.get('https://www.taobao.com')
 44 input = browser.find_element_by_id('q')
 45 input.send_keys('iPhone')
 46 time.sleep(1)
 47 input.clear()
 48 input.send_keys('iPad')
 49 button = browser.find_element_by_class_name('btn-search')
 50 button.click()
 51 '''
 52 
 53 '''
 54 #動作鏈
 55 browser = webdriver.Chrome()
 56 url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
 57 browser.get(url)
 58 browser.switch_to_frame('iframeResult')
 59 #source = browser.find_element_by_css_selector('#draggable')
 60 #target = browser.find_element_by_css_selector('#droppable')
 61 #actions =ActionChains(browser)
 62 #actions.drag_and_drop(source, target)
 63 #actions.perform()
 64 
 65 #切換Frame
 66 # Selenium打開頁面后,它默認是在父級 Frame里面操作,
 67 # 而此時如果頁面中 還有子 Frame,它是不能獲取到子 Frame里面的節點的 。 
 68 # 這時就需要使用 switch_to.frame()方法來切 換 Frame。
 69 try:
 70     logo = browser.find_element_by_class_name('logo')
 71 except NoSuchElementException:
 72     print('NO LOGO')
 73 browser.switch_to.parent_frame()
 74 logo = browser.find_element_by_class_name('logo')
 75 print(logo)
 76 print(logo.text)
 77 '''
 78 
 79 '''
 80 #獲取js
 81 browser =webdriver.Chrome()
 82 browser.get('http://www.zhihu.com/explore')
 83 #browser.execute_script('window.scrollTo(0, ducument.body.scrollHeight)')
 84 browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
 85 browser.execute_script('alert("To Bottom")')
 86 '''
 87 
 88 '''
 89 #獲取節點信息
 90 browser =webdriver.Chrome()
 91 url = 'http://www.zhihu.com/explore'
 92 browser.get(url)
 93 logo = browser.find_element_by_id('zh-top-link-logo')
 94 input = browser.find_element_by_class_name('zu-top-link-logo')
 95 
 96 print(logo)
 97 print(logo.get_attribute('class'))
 98 print(input.text)
 99 input = browser.find_element_by_class_name('zu-top-add-question')
100 print(input.id)
101 print(input.location)
102 print(input.tag_name)
103 print(input.size)
104 print(input.text)
105 '''
106 
107 '''
108 #延時等待
109 #隱式等待
110 #使用隱式等待執行測試的時候,
111 #如果 Selenium沒有在 DOM 中找到節點,將繼續等待,
112 #超出設定時間后,則拋什1找不到節點的異常。
113 #browser = webdriver.Chrome()
114 #browser.implicitly_wait(10)
115 #browser.get('http://www.zhihu.com/explore')
116 #input = browser.find_element_by_class_name('zu-top-add-question')
117 #print(input)
118 #顯式等待
119 #它指定要查找的節點,然后指定一個最長等待時間。
120 #如果 在規定時間內加載出來了這個節點,就返回查找的節點;
121 #如果到了規定時間依然沒有加載出該節點,則拋陽超時異常。
122 browser = webdriver.Chrome()
123 browser.get('https://www.taobao.com/')
124 wait = WebDriverWait(browser, 10)
125 #until傳入等待條件
126 #presence_of_element_located代表節點出現
127 input = wait.until(EC.presence_of_element_located((By.ID, 'q')))#節點定義為元組,所以是兩對括號
128 button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
129 print(input, button)
130 '''
131 
132 '''
133 #前進后退
134 browser.get('http://www.zhihu.com/explore')
135 browser.get('http://www.taobao.com')
136 browser.get('http://www.python.com')
137 browser.back()
138 time.sleep(1)
139 browser.forward()
140 browser.close()
141 '''
142 
143 #'''
144 #cookies
145 browser.get('http://www.zhihu.com/explore')
146 print(browser.get_cookies())
147 print('--------------------------------------------------------------')
148 browser.add_cookie({
149     'name': 'name',
150     'domain': 'www.zhihu.com',
151     'value': 'germey'
152 })
153 print(browser.get_cookies())
154 print('--------------------------------------------------------------')
155 browser.delete_all_cookies()
156 print(browser.get_cookies())
157 #'''

 

2. splash:

Splash是一個 JavaScript渲染服務,是一個帶有 HTTPAPI 的輕量級瀏覽器,同時它對接了 Python中的Twisted和QT庫。 利用它,我們同樣可以實現動態誼染頁面的抓取。

  • 異步方式處理多個網頁渲染過程 ;
  • 獲取渲染后的頁面的源代碼或截圖;
  • 通過關閉圖片渲染或者使用 Adblock規則來加快頁面渲染速度;口 可執行特定的 JavaScript腳本;
  • 可通過 Lua腳本來控制頁面渲染過程;
  • 獲取渲染的詳細過程並通過 HAR ( HTTP Archive )格式呈現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM