分佈式爬蟲(4)

1、CSS定位器

  1.什麼是CSS

      (1)CSS=Cascading Style Sheetsjavascript

      (2)樣式定義如何顯示HTML元素css

      (3)想一想爲何不直接使用屬性設置元素html

      (4)CSS與JSjava

  2.CSS基礎語法

      (1)CSS規則:選擇器,以及一條或者多條的聲明node

        selector {declaration1;....;desclarationN}python

      (2)每條聲明由一個屬性和一個值組成  web

        property:value正則表達式

      (3)例子數據庫

        h1{color:red;font-size:14px}npm

      (4)元素選擇器

        直接選擇文檔元素

        好比head,p

      (5)類選擇器

        元素的class屬性,好比<h1 class="important">

        類名就是Important

        .important選擇全部有這個屬性的元素

        能夠結合元素選擇器,好比p.important

      (6)ID選擇器

        元素的id屬性,好比<h1 id="intro">

        id就是intro

        #intro用於選擇id=intro的元素

        能夠結合元素選擇器,好比p.#intro

        與類選擇器的異同

          ID一個文檔只出現一次

          ID選擇器不能使用單詞列表

          與類選擇器同樣,都區分大小寫 

      (7)屬性選擇器

        選擇有某個屬性的元素,而不管是什麼

        *[title]選擇包含title屬性的元素

        a[href]選擇全部帶有href屬性的錨元素

        還能夠選擇多個屬性,好比:a[href][title],注意這裏是要同時知足的

        限定值:a[href="www.so.com"]

      (8)後代選擇器

        選擇某個元素的後代元素

        選擇h1元素的em元素:h1 em

      (9)子元素選擇器

        範圍限制在子元素

        選擇h1元素的子元素strong:h1>strong    

<h1>
         <em>.....</em>
         <body>
              <em></em>      
         </body>    
</h1>            
    

      (9)子代元素選擇器

        範圍限制在子元素

        選擇h1元素的子元素strong:h1>stong

2、XPath簡介

  1.什麼是Xpath

     (1)使用路徑表達式在XML文檔中進行導航

     (2)包含一個標準數據庫

     (3)是XSLT的主要元素

     (4)是一個W3C標準

  2.XPath語法

        (1)謂語

        嵌在[]中用來查找某個特定節點或包含某個特定值的節點

        /bookstore/book[1]第一個book元素

        /bookstore/book[last()]最後一個book元素

        /bookstore/book[position()<3]選擇前2個元素

        //title[@lang]選擇所擁有有名爲lang的屬性的title元素

        /bookstore/book[price>35.00]    條件過濾

     (2)七種基本節點

        元素、屬性、文本

        命名空間、處理指令、註釋以及根節點

     (3)節點之間的關係

        父、子、同胞(兄弟)、先輩、後代 

     (4)路徑表達式
        nodename選取此節點的全部子節點

        /從根節點選取

        //從匹配的當前節點選擇文檔中的節點,而不考慮他們的位置

        .選取當前節點

        ..選取當前節點的父節點

        @選取屬性

        在DOM樹,以路徑的方式查詢節點,經過@符號來選取屬性

        

<a rel="nofollow" class="external text" href="http://google.ac">google<wbr/>.ac</a>

rel class ref 都是屬性,均可以經過"//*[@class='external text']"來選取對應元素

=符號要求屬性徹底匹配,能夠用contains方法來部分匹配,例如

  "//*[contains(@class,'external')]"能夠進行匹配,而"//*[@class='external']"則不能進行匹配

import lxml
from lxml import etree

s='<a class="hask">Yes</a>'

tr=etree.HTML(s)

tr.xpath('//a')


tr.xpath('//p')

tr.xpath('//a')[0]

tr.xpath('//a')[0].attrib

tr.xpath('//*@class="hask"')[0].attrib

tr.xpath('//*[@class="hask"]')[0].attrib

#
s='<a class="hask" href="http://www.tabobao.com">Yes</a>'

tr=etree.HTML(s)

tr.xpath('//a')[0].attrib  #打印出attrib屬性,這個地方能夠打印出兩個屬性
一個是鏈接,另一個是類屬性{'class': 'hask', 'href': 'http://www.taobao.com'}

>>> tr.xpath('//*[@href="http://www.taobao.com"]')[0].attrib
{'class': 'hask', 'href': 'http://www.taobao.com'}
>>> tr.xpath('//*[@href="http://www.taobao.com"]')[0]
<Element a at 0x2cc5108>

 

<bookstore>
            <book>
                            <title  lang="eng">Harry Potter</title>
                            <price>29.99</price>
            </book>
            <book>
                            <title lang="eng">Learn XML</title>
                            <price>75</price>
            </book>
</bookstore>

     (5)運算符

        and和or運算符

        選擇p或者span或者h1標籤的元素

        soup=tree.xpath('//td[@class="editor bbsDetailContainer"]*[self::p or self::span or self::h1]')

        選擇class 爲editor或者tag的元素,經過or將3中標籤所有提取出來

        soup=tree.xpath('//td[@class="editor" or @class="tag"]')

 3.正則表達式

  (1)正則表達式是對字符串操做的一種邏輯公式,就是事先定義好的一些特定字符串、以及這些特定的字符串的組合,組成一個"規律字符串"買這個"規律字符串"用來表達對字符竄的一種過濾邏輯

  (2)在爬蟲的解析中,常常講正則表達式與Dom選擇器結合使用。正則表達死適用於字符串特徵比較明顯的狀況,可是一樣的正則表達式可能在HTML源碼裏出現屢次;而DOM選擇器能夠經過class一級id來精確找到DOM塊,從而縮小查找範圍

  (3)正則表達式經常使用規則

    \轉義字符  例如\?

    ^字符串起始

    $字符串結束

    *匹配前面子表達式0次或者屢次

    +匹配前面子表達式1次或者屢次

    ?匹配前面子表達式0次或者1次

    {n,m}至少匹配n次,最多m次

    .匹配除\n以外的單個字符串

    (pattern)匹配並獲取這個匹配,例如匹配ab(cd)e正則表達式只返回cd

    [xyz]字符集合,匹配任意集合裏的字符,[abc]既能匹配a,也能匹配b,也能夠匹配c

    [^xyz]排除集合中的字符,不能進行任何的匹配

    \d匹配一個數字,等價[0-9]  

  (4)獲取標籤下的文本:'<th[^>]*>(.*?)</th>'    //[^>]不包含>符號   *表示匹配0-n次 <th href ="....">匹配的限制條件  (.*?)中間這個是咱們須要取到的內容  

  (5)查找特定類別的鏈接,例如/wiki/不包含Category目錄:

    '<a href="/wiki"/(?!Category:)[^/>]*>(.*?)<'  

  (6)

    eg:https://item.jd.com/27394669614.html

    正則表達式:https://item.jd.com/\d{7}.html  \d{7}重複匹配7次數字 

  (7)查找淘寶的商品信息,'或者"開始及結尾

  'href=[\"\']{1}(//detail.taobao.com/item.html[^>\"\'\s]+?)"'

  (8)貪婪模式以及非貪婪模式

    ?該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。

    非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式儘量多的匹配所搜索的字符串

3、Json

  一、Json=JavaScript Object Notation

  2.相似於XML,可是比XML更小、更快、更易於解析。

  3.使用json庫處理json,編碼與解碼

import  json
obj={'one':1,'two':2,'three':[1,2,3]}
encoded=json.dumps(obj)
print(encoded)
#
{"one": 1, "two": 2, "three": [1, 2, 3]}#字典不保證元素的順序的

4、網站結構分析及案例:馬蜂窩

  一、網站對爬蟲的限制

   二、利用sitemap來分析網站結構和估算目標網頁的規

    (1)進入www.mafengwo.cn/robots.txt

    (2)進入http://www.mafengwo.cn/sitemapIndex.xml

      <sitemap>標籤裏面包含了全部的文章以及上一次的更新時間

  (3)進入http://www.mafengwo.cn/article-0.xml  

    這裏包含每篇文章更新的時間和頻率以及優先級

  (4)進入http://www.mafengwo.cn/i/11026746.html

    <a class="pi" href="/yj/12141/1-0-2.html" title="第2頁">2</a>

    www.mafengwo.cn/yj/12121/1-0-2.html獲取到第二頁的頁面

  (5)有效率抓取特定內容

    直接對.html進行抓取

    對網站結構進行分析:

      大多數網站都會存在明確的top-down的分類目錄結構,咱們能夠進入特定的目錄進行抓取。對於www.mafengwo.cn這個網站,全部遊記都位於www.mafengwo.cn/mdd下面,按照城市進行了分類,每一個城市的遊記都位於城市的首頁

    城市的首頁:/travel-scenic-spot/mafengwo/10774.html

    遊記的分頁格式:/yj/10774/1-0-01.html

    遊記的頁面:/i/3522264.html

5、動態網頁

  1.動態網頁的使用場景

    (1)單頁模式

      單頁模式是指不須要外部跳轉的網頁,例如我的設置中心常常就是單頁模式

    (2)頁面交互多的場景

      一部分網頁上,有不少的用戶交互接口,例如去哪兒買機票的選擇網頁,用戶能夠反覆查詢的參數

    (3)內容以及模塊豐富的網頁

      有一些的網頁內容很豐富,一次加載完成對服務器壓力很大,並且這種方式延時也會不好,用戶每每也不會查看全部的內容

    (4)對於爬蟲:簡單下載HTML已經不行了,必需要有一個WEB容器來運行HTML的腳本;

      增長了爬取的時間;增長了計算機的CPI、內存的資源消耗;增長了爬取的不肯定性

    (5)對於網站:爲了配合搜索引擎的爬取,與搜索相關的信息會採用靜態的方式;與搜索無關的信息,例如商品的價格、評論,仍然會採用動態的形式進行加載

   2.抓取動態網頁---分析:打打開網頁後,直接右鍵點擊,只保存HTML

   3.Python Web引擎

    (1)PyQt PySide:基於QT的python web引擎,須要圖形界面的支持,須要安裝大量的依賴,安裝配置比較=複雜,尤爲是安裝圖形系統,對於服務器來講代價很大

    (2)Selenium:一個自動化的Web測試工具,能夠支持包括Firefox,chrom,PhatomJS,IE等多種瀏覽器的安裝與測試

    (3)PhantonJs:一個機遇Webkit的Headless的web引擎,支持JavaScript。相比於PyQt等方案,phamtoms能夠部署在沒有UI的服務器上

    (4)PhantomJS+Selenium網頁自動化的測試。

    (5)Selenium安裝:pip install selenium

    (6)PhantomJS安裝:

      先安裝nodejs   yum install nodejs

      爲了加速,將NPM的源改成國內的淘寶

      $npm install -g cnpm --registry=https://registry.npm.taobao.org

      利用NPM的Package Manager安裝 phantomjs

        $npm -g install phantomjs-prebuilt

    (7)使用PhantomJS來加載動態頁面     

#import webdriver from selenium
from selenium import webdriver


#load PhantomJS driver
driver=webdriver.PhantomJS(service_args=['ignore-ssl-errors=true'])

#set window size,better to fit the whole page in order to 
#avoid dynamically loading data
driver.set_window_size(1280,2400)#optional設置網頁大小

#data page content

driver.get(cur_url)#下載網頁

#use page_source to get html content
content=driver.page_source#獲得渲染完後的html網頁

  其中set_window_size

    對於動態網頁,有可能存在大量的數據是根據視圖來進行加載的,PhantomJS容許客戶端設置用來模擬渲染頁面窗口的尺寸,這個尺寸若是設置比較小,咱們就不得不用javascript的scroll命令來模擬頁面往下滑動的效果顯示更多的內容,因此咱們設置一個相對大的窗口高度來渲染

  driver.set_window_size(1280,2400) #optional

  Selenium實現了一系列的相似於xpath選擇器的方法,使得咱們能夠直接調用driver.find_element()來進行元素的選擇,可是這些都是基於python的實現,執行效率很是低,所以不建議使用built-in選擇器,而是lxml或者re對driver.apgr-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)

一些有用的方法和屬性
    Selenium經過瀏覽驅動,支持大量的HTML以及JavaScript的操做,經常使用的能夠包括
        page_source:獲取的當前頁的html文本
        title:HTML的title
        current_url:當前頁的url
        get_cookie()&get_cookies():獲取當前的cookie
        delete_cookie()&delete_all_coolies():刪除全部的cookie
        add_cookie():添加一段cookie
        set_page_load_timeout():設置當前網頁超時
        execute_script():同步設置一段javascript命令
        execute_async_script():異步執行javascript命令

    (8)Close and Clear

    Selenium經過內嵌的瀏覽器driver與瀏覽器進程進行通訊,所以在退出的時候必須調用driver.close()以及driver.quit()來退出PhantomJS,不然PhantomJS會一直運行在後臺並佔據系統資源。

    (9)提取動態數據

    1.加載的過程,根據網絡環境的優劣,會存在一些延時,所以要屢次嘗試提取,提取不到不意味着數據不存在或者網絡出現錯誤

    2.動態頁面的元素,所用的id或者class常常不止一個,例如京東一件商品的"好評率",class包括了rate和percent-con兩種,所以須要對兩種狀況進行嘗試。

    (10)網頁內,href後面的連接能夠有這三種:

      href="http://career.taobao.com"  http://是完整的URL,直接轉跳

      href="\\detail.taobao.com\iuslkjsd"

      //是協議相關的絕對路徑,若是如今是https://xxx則須要在//rtail.tabobao.com前面加上,https:前面的協議也能夠是file://

      href="\i\8444444.html"  \是網站的相對路徑,須要在前面指明當前的url協議以及domain

    (11)HhantomJS配置

      --ignore-ssl-errors=[true|false]  

      一些證書沒有得到CA受權,瀏覽器會報出證書不受信任,這種狀況須要用戶交互操做,使用這個命令以後,能自動忽略這列錯誤  

      --load-images=[true|false]  將其設置爲false,圖片就不會進行加載,對於抓取的速度性能就會比較高

      --disk-cache=[true|false]   將經過磁盤來進行緩存設置爲true

 

      --config=/path/to/config.json

相關文章
相關標籤/搜索