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 )格式呈現。