爬蟲------動態HTML處理

一、常見的反爬蟲技術

如果你在一個網站上看到了 jQuery,那麼採集這個網站數據的時候要格外小心。jQuery可 以動態地創建 HTML 內容,只有在 JavaScript 代碼執行之後纔會顯示。如果你用傳統的方法採集頁面內容,就只能獲得 JavaScript 代碼執行之前頁面上的內容。

一些網站採取的反爬蟲技術,一般包括ajax,DHTML等

1、什麼是ajax?

我們與網站服務器通信的唯一方式,就是發出 HTTP 請求獲取新頁面。如果提交表單之後,或從服務器獲取信息之後,網站的頁面不需要重新刷新,那麼你訪問的網站就在用Ajax 技術。

Ajax 其實並不是一門語言,而是用來完成網絡任務(可以認爲 它與網絡數據採集差不多)的一系列技術。Ajax 全稱是 Asynchronous JavaScript and XML(異步 JavaScript 和 XML),網站不需要使用單獨的頁面請求就可以和網絡服務器進行交互 (收發信息)

2、什麼是DHTML?

和Ajax 一樣,動態 HTML(Dynamic HTML, DHTML)也是一系列用於解決網絡問題的 技術集合。DHTML 是用客戶端語言改變頁面的 HTML 元素(HTML、CSS,或者二者皆 被改變)。比如頁面上的按鈕只有當用戶移動鼠標之後纔出現,背景色可能每次點擊都會改變,或者用一個 Ajax 請求觸發頁面加載一段新內容,網頁是否屬於 DHTML,關鍵要看有沒有用 JavaScript 控制 HTML 和 CSS 元素。

3、如何用python繞過這些反爬蟲?

那些使用了 Ajax 或 DHTML 技術改變/加載內容的頁面,可能有一些採集手段。但是用 Python 解決這個問題只有兩種途徑:直接從 JavaScript 代碼裏採集內容(費時費力)用 Python 的 第三方庫運行JavaScript,直接採集你在瀏覽器裏看到的頁面(這個可以有)

二、Selenium&PhantomJS

1、Selenium

Selenium 是一個 Web 的自動化測試工具,最初是爲網站自動化測試而開發的,類型像我們玩遊戲用的按鍵精靈,可以按指定的命令自動操作,不同是 Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括 PhantomJS 這些無界面的瀏覽器)。

Selenium 可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。

Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起
才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS
的工具代替真實的瀏覽器。

可以從 PyPI 網站下載 Selenium 庫 https://pypi.python.org/simple/selenium ,也可以用
第三方管理器 pip 用命令安裝:pip install selenium==2.48.0

Selenium 官方參考文檔:http://selenium-python.readthedocs.io/index.html

2、PhantomJS

PhantomJS 是一個基於 Webkit 的“無界面”(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,因爲不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。

如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、headers,以及任何我們真實用戶需要做的事情。

注意:PhantomJS 只能從它的官方網站 http://phantomjs.org/download.html 下載。 因爲PhantomJS 是一個功能完善(雖然無界面)的瀏覽器而非一個 Python 庫,所以它不需要像 Python 的其他庫一樣安裝,但我們可以通過 Selenium 調用 PhantomJS 來直接使用。
下載--解壓,然後,設置環境變量:C:\Users\cz\Downloads\phantomjs-2.1.1-windows\bin
打開終端命令行,輸入:phantomjs,能夠進行到 phantomjs 命令行,則表示安裝成功

Selenium 庫裏有個叫 WebDriver 的 API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像 BeautifulSoup 或者其他 Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。

下面以訪問百度寫一段程序:

#1、導入webdriver

from selenium import webdriver
import time
 
#2、調用環境變量指定的PhantomJs瀏覽器創建瀏覽器對象

#driver = webdriver.PhantomJs()

#3、如果沒有在環境變量執行的PhantomJs位置,需要手動加入

driver = webdriver.PhantomJS(executable_path = r"C:\Users\Administrator\Desktop\phantomjs-2.1.1-windows\bin\phantomjs.exe")

#4、請求頁面
driver.get("https://www.baidu.com/")
print(driver.page_source)

#5、截屏工具

driver.save_screenshot('01.png')
#with open('baidu.html','w',encoding='utf-8') as fp:
#    fp.write(driver.page_source)

#6、模擬輸入人名點擊搜索
# 截屏
driver.save_screenshot('02.png')
# 輸入胡歌
driver.find_element_by_id('kw').send_keys('胡歌')
driver.save_screenshot('03.png')

# 點擊百度一下
driver.find_element_by_id('su').click()
# 留出充足時間等待響應
time.sleep(6)
driver.save_screenshot('04.png')
print(driver.title)

最後的一張截屏如圖所示:

模擬滾動操作:

以訪問豆瓣電影爲例:

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys

driver = webdriver.PhantomJS(executable_path=r'C:\Users\Administrator\Desktop\phantomjs-2.1.1-windows\bin\phantomjs.exe')
driver.get('https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=')
time.sleep(3)
driver.save_screenshot('20.png')

#將頁面滾動條從頁面頂部向下拉1000px
js = 'document.body.scrollTop = 10000'
driver.execute_script(js)
time.sleep(3)
driver.save_screenshot('21.png')

第一張圖片:

第二張圖片;

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章