前面的例子中,我們使用webkit
庫,可以自定義瀏覽器渲染引擎,這樣就可以完全控制想要執行的行為。如果不需要那麼高的靈活性,那麼還有乙個不錯的替代品 selenium 可以選擇,它提供了使瀏覽器自動化的api 介面。
selenium 是乙個用於web應用程式測試的工具。selenium測試直接執行在瀏覽器中,就像真正的使用者在操作一樣。支援市面上幾乎所有的主流瀏覽器。
本來打算使用的是selenium + phantomjs的組合,但發現chrome以及firefox也相繼推出無頭 ( headless ) 瀏覽器模式,個人比較傾向chrome。本文採用的是selenium+chrome的組合。
運用到爬蟲中的思路是:
# coding=utf-8
import time
from selenium import webdriver
class
sinabookspider
(object):
# 建立可見的chrome瀏覽器, 方便除錯
driver = webdriver.chrome()
# 建立chrome的無頭瀏覽器
# opt = webdriver.chromeoptions()
# opt.set_headless()
# driver = webdriver.chrome(options=opt)
driver.implicitly_wait(10)
total = 1526
# 預先計算的總資料量
count = 0
# 已爬取的資料量
# 記錄解析以及翻頁位置
location = 0
click_times = 0
defrun
(self):
""" 開始爬蟲
:return:
"""# get方式開啟網頁
self.driver.get("")
self.parselist()
while self.count < self.total:
if self.click_times is
2: self.driver.find_element_by_css_selector('#subshowcontent1_page > span:nth-child(6) > a').click()
# 等待頁面載入完成
time.sleep(5)
self.click_times = 0
self.location = 0
else:
self.driver.find_element_by_css_selector('#subshowcontent1_loadmore').click()
# 等待頁面載入完成
time.sleep(3)
self.click_times += 1
# 分析載入的新內容,從location開始
self.parselist()
self.driver.quit()
defparselist
(self):
""" 解析列表
:return:
"""divs = self.driver.find_elements_by_class_name("item")
for i in range(self.location, len(divs)):
link = divs[i].find_element_by_tag_name('a').get_attribute("href")
print link
self.location += 1
self.count += 1
print self.count
if __name__ == '__main__':
spider = sinabookspider()
spider.run()
如果你想實際執行上述**,請在執行之前確定:安裝了與瀏覽器版本對應的驅動,並正確的新增到了環境變數中。
有關這三種方式的講解可以看這裡:python selenium —— 一定要會用selenium的等待,三種等待方式解讀 —— 灰藍的部落格到此,我們介紹了動態頁面處理的兩種思路:
做一下簡單的比較:
採用哪種方法,取決於爬蟲活動中的具體情況:
個人認為模擬瀏覽器的方法應盡量避免,因為瀏覽器環境對記憶體和cpu的消耗非常多,可以作為短期決絕方案,此時長期的效能和可靠性並不算重要;而作為長期解決方案,我會盡最大努力對**進行逆向工程。
Java java爬蟲獲取動態網頁的資料
前段時間一直在研究爬蟲,抓取網路上的特定的資料,如果只是靜態網頁就是再簡單不過了,直接使用jsoup document doc jsoup.connect url timeout 2000 get 獲取到document然後就想幹嘛就幹嘛了,但是一旦碰到一些動態生成的 就不行了,由於資料是網頁載入完...
關於網頁快照的處理方式
秀一下我自己的做法吧!1 頁面中的處理很簡單 var url websnap?url url fresh math.random 我這個是提交給了servlet了。window.open url 2 servlet的處理方式 讀磁碟中某個檔案 param fname return string pu...
爬蟲抓取動態網頁的6種方法
對於動態載入的網頁,我們想要獲取其網頁資料,需要了解網頁是如何載入資料的,該過程就被成為逆向回溯。對於使用了ajax 請求技術的網頁,我們可以找到ajax請求的具體鏈結,直接得到ajax請求得到的資料。需要注意的是,構造ajax請求有兩種方式 對於這兩種方式,只要建立並返回了xmlhttpreque...