爬虫.之登陆及动态网页的抓取
分布式爬蟲
Xpath
正則表達式
動態網頁
Headless的瀏覽器:phantomJS
瀏覽器的驅動:Selenium
1.Xpath
基本語法:
表達式:nodename(節點名) 選取此節點的所有子節點,tag或*選擇任意的tag
/ ? 從根節點選取,選擇直接子節點,不包含更小的后代(例如孫、從孫)
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置,包含所有后代
. 選取當前節點
.. 選取當前節點的父節點
@ 選取屬性
@屬性
在DOM樹,以路徑的方式查詢節點通過@符號選取屬性
rel? ?class? ?href (超文本引用)都是屬性,可以通過“//*[@class=‘external text’]”來選取對應元素
=符號要求屬性完全匹配,可以用contains方法來部分匹配,例如“//*[contains(@class,'external')]”可以匹配,而“//*[@class='external']”則不能
運算符
and和or運算符
選擇p或者span或者h1標簽的元素
soup=tree.xpath(‘//td[@class=“editor bbsDetailContainer”]//*[self::p or self::span or self::h1]’)
選擇class為editor或者tag的元素
soup=tree.xpath(‘//td[@class=“editor”or @class=“tag”]’)
2.正則表達式
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯
在爬蟲解析中,經常會將正則表達式與Dom選擇器結合使用。正則表達式適用于字符串特征比較明顯的情況,但同樣的正則表達可能在HTML源碼里多次出現:而Dom選擇器可以通過class
以及id來精確找到DOM塊,從而縮小查找的范圍。
爬蟲常用的正則規則
獲取標簽下的文本 ‘<th[^>]*>(.*?)</th>’
查找特定類型的鏈接,例如/wiki/不包含Category目錄:‘<a href="/wiki/(?!Category:)[^/>]*>(.*?)<’
查找商品外鏈,例如jd的商品外鏈為7位數字的a標簽節點: ‘^d{7}.html’
查找淘寶的商品信息,‘或者’開始及結尾 ‘href=[\"\’]{1}(//detail.taobao.com/item.htm[^>\"\'\s]+?)"'
3.貪婪模式與非貪婪模式
?該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串
4.動態網頁
1.動態網頁的使用場景
單頁模式
單頁模式指的是不需要外部跳轉的網頁,例如個人設置中心經常就是單頁
頁面交互多的場景
一部分網頁上,有很多的用戶交互接口,例如去哪兒的機票選擇網頁,用戶可以反復修改查詢的參數
內容及模塊豐富的網頁
有些網頁內容很豐富,一次加載完對服務器壓力很大,而且這種方式延時也會很差;用戶一般也不會查看所有的內容
2.動態網頁帶來的挑戰
對于爬蟲:簡單下載HTML已經不行了,必須得有一個web容器來運行HTML的腳本
增加了爬取的時間
增加了計算機的CPU、內存資源的消耗
增加了爬取的不確定性
對于網站:為了配合搜索引擎的爬取,與搜索相關的信息會采用靜態方式
與搜索無關的信息,例如商品的價格、評論,仍然會使用動態加載
3.抓取動態網頁—分析
打開目標網頁后,直接右鍵點擊,只保存HTML
把網頁滑動到頁面的最下面,然后再次保存,這次選擇保存完整網頁。
4.分析動態網頁—對比
使用BeyondCompare或者SVN等工具,來對比網頁,大致找出動態加載部分
針對要提取的部分,分別查看html only與full webpage,找出動態數據的部分
記錄下他們的 class或id,
5.Python web引擎
pyQt pyside :基于QT的Python web引擎,需要圖形界面的支持,需要安裝大量的以來。安裝和配置復雜,尤其是安裝圖形系統,對于服務器來說代價很大
Selenium:一個自動化的web測試工具,可以支持包括Firefox、Chrome、phatomJS、IE等多種瀏覽器的連接與測試
phantonJS:一個基于webkit的Headless的web引擎,支持JavaScript。相比pyQt等方法,phamtoms可以部署在沒有UI服務器上
5.安裝
selenium
pip install selenium
phantomJS
phantomJS需要先安裝nodejs
#yum install nodejs
為了加速,將NPM的源改為國內的淘寶
$npm install-g cnpm--registry=https://registry.npm.taobao.org
利用NPM的package Manager安裝phantomjs
$npm-g istall phantomjs-prebuilt
6.使用phantomJS來加載動態頁面
set_window_size
對于動態網頁,有可能存在大量數據是根據視圖來動態加載的。
phantomJS允許客戶端設置來模擬渲染頁面的窗口的尺寸,這個尺寸如果設置比較小,我們就不得用JavaScript的scroll命令來模擬頁面往下滑動的效果以顯示更多
內容,所以我們可以設置一個相對大的窗口高度來渲染。 driver.set_window_size(1280,2400) #optional
7.Built-in DOM selector
Selenium實現了一系列的類似于xpath選擇器的方法,使得我們可以直接調用driver.find_element()來進行元素的選擇,但是這些都是基于Python的實現,執行效率非常
低,大約是基于C的正則表達式或lxml的10倍時間,因此不建議使用built_in的選擇器,而是采用lxml或者re對driver.page_source(html文本)進行操作。
find_element(self,by=‘id’,value=None)
find_element_by_class_name(self,name)
find_element_by_id(self,id_)
find_element_by_css_selector(self,css_selector)
8.Useful Methods & Properties
selenium通過瀏覽器的驅動,支持大量的HTML及JavaScript的操作,常用的可以包括:
page_source:獲取當前的HTML文本
title:HTML的title
current_url:當前網頁的url
get_cookie()&get_cookies():獲取當前的cookie
delete_cookie()&delete_all_cookie():刪除所有的cookie
add_cookie():添加一段cookie
set_page_load_timeout():設置網頁超時
execute_script():同步執行一段JavaScript命令
execute_async_script():異步執行JavaScript命令
9.Close and Clear
Selenium通過內嵌的瀏覽器driver與瀏覽器進程通信,因此在退出時候必須調用driver.close()及driver.quit()來退出phantomJS,否則phantomJS會一直運行在后臺
并占用系統資源。
1.send_signal is recommended
? ?driver.service.process.send_signal(signal.SIGTERM)
2.driver.close()this is not guaranteed to close phantonJS
3.to assure it's closed,run below command in terminal pgrep phantomjs \ xargs kill
10.提取動態數據
1.加載過程中,根據網絡環境的優劣,會存在一些延遲時,因此要嘗試多次提取,提取不到不意味著數據不存在或者網絡出錯
2.動態網頁的元素,所使用的id或class經常會不止一個,例如:京東一件商品的“好評率”,class包括了rate和percent-con兩種,因此,需要對兩種情況都進行嘗試,更通用的情況,如果一個元素
? ?不能找到而selenium并沒有報網絡錯誤,那么有可能這個元素的class或id有了新的定義,我們需要將找不到的頁面及元素信息記錄在日志里,使得后續可以分析,找出新的定義并對這一類頁面
重新提取信息
11.\and\\
網頁內,href后面的鏈接可以有這樣三種:
href=“http//career.taobao.com”
http://是完整URL,直接跳轉(經常外鏈會是絕對路徑,比如引用到了wiki、百科的一篇文章)
href=“\\detail.taobao.com\iuslkjsd”
//是協議相關的絕對路徑,如果現在是http://xxx則需要在//etail.taobao.com前面加上https:前面的協議也可以是file://ftp://所以這樣會比較靈活
herf=“\i\8277375.html”
/是網站的相對路徑,需要在前面指明當前url的協議及domain
phantomJS配置
重要的配置-ignore-ssl-errors=[true / false]
一些證書沒有獲得CA授權(多是自己制作的證書),瀏覽器會報出證書不受信任,這種情況需要用戶交互操作(點擊繼承或者新人),使用這個命令后,能自動忽略此類錯誤。
重要的配置-load-images=[true / false]
網頁上一般都存在大量的圖片,這些圖片對我們第一次執行抓取是沒有用的,在這種情況下,選擇-load-images=false可以不下載這些圖片,加快下載速度
重要的配置-config=/ path / to /config.json
其它配置:
-disk-cache=[ture/false]
-cookies-file=/ path / to / cookies.txt
-debug-=[ture/false]
?
轉載于:https://www.cnblogs.com/jacky912/p/10496793.html
總結
以上是生活随笔為你收集整理的爬虫.之登陆及动态网页的抓取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux增加开放端口号
- 下一篇: 线性表之顺序存储结构相关算法学习