第一週

request

  • 更簡潔更友好
  • 繼承了urllib的全部特徵
  • 底層用的urllib3
  • get請求
    • requests.get()
    • requests.request("get",url)
    • 能夠帶有headers和parmas參數
  • post
    • rsp = requests.post(url,data=data)
    • data,headers要求 是dict類型
  • proxy
    • 代理有可能報錯,若是使用人數多,考慮網絡安全問題,可能會被強行關閉

xpath

  • 在XML文件中查找信息的一套規則/語言,根據XML的元素或者屬性進行遍歷
  • XML中選取節點
    • nodename:選取此節點的全部子節點
    • /:從根節點開始選取
    • //:選取節點,不考慮位置
    • .:選取當前的節點
    • ..:選取當前節點的父節點
    • @:選取屬性
  • XPath中查找通常按照路徑方法查找

scrapy概述

  • 包含各個部件
    • scrapyengine:神經中樞,大腦,核心
    • scheduler調度器:引擎發來的request請求,調度器須要處理,而後交換引擎
    • Downloader下載器:把引擎發來的requests發出請求,獲得response
    • spider爬蟲:負責把下載器獲得的網頁/結果進行分解,分解成數據+鏈接
    • itempipeline管道:詳細處理item
    • Downloadermiddleware下載中間件:自定義下載的功能擴展組件
    • spidermiddleware爬蟲中間件:對spider進行功能擴展
  • 爬蟲的大概流程
    • 新建項目:scrapy startproject xxx
    • 明確須要目標:編寫item.py
    • 製做爬蟲:地址spider/xxspider.py
    • 存儲內容:pipelines.py

item封裝數據

  • item基類:自定義數據類的基類
  • field類:用來描述自定義數據類包含哪些字段
  • fie元數據
    • 傳遞額外信息給處理大戶局的某個組件,告訴組件應以怎樣的方式處理數據
  • 自定義一個數據類,只需繼承Item,並建立一系列Field對象的類屬性

itempipeline處理數據

  • 對應的是pipelines文件
  • 爬蟲提取出數據存入item後,item中保存的數據須要進行一步處理,好比清洗數據,驗證數據有效性,過濾掉重複數據,存儲數據等
  • pipeline須要處理process_item函數
    • process_item:
      • spider提取出來的item做爲參數傳入,同時傳入的還有spider(爬取此項數據的spider對象)
      • 此方法必須出現,用來處理每一項由spider爬取到的數據
      • 必須返回一個item對象,被丟棄的item不會被以後的pipeline處理
        • 若是process_item在處理某項item時返回了一項數據(Item或字典),返回的數據會遞送給下一級Item Pipeline(若是有)繼續處理
        • 若是process_item在處理某項item時拋出(raise)一個DropItem異常(scrapy.exceptions.DropItem),該項item便會被拋棄,再也不遞送給後面的Item Pipeline繼續處理,也不會導出到文件,一般,咱們在檢測到無效數據或想要過濾數據時,拋出DropItem異常
  • __ init __:構造函數
    • 進行一些參數的初始化
  • open_spider(spider)
    • spider對象被開啓的時候調用
  • close_spider(spider)
    • 當spider對象被關閉的時候調用
  • from_crawler(cls,crawler)
    • 建立Item Pipeline對象時回調該類方法。一般,在該方法中經過crawler.settings讀取配置,根據配置建立Item_Pipeline對象
  • 啓用item_pipeline
    • 須要在setting.py中進行配置

spider

  • 對應的是spiders下的文件css

  • ___ init __:初始化爬蟲列表,start_urls列表html

  • start_requests:生成requests對象交給scrapy下載器返回responsenode

  • parse:根據返回的response解析出相應的item,item自動進入pipeline:若是須要,解析出url,url自動交給requests模塊,一直循環下去、mysql

  • start_request:此方法只能被調用一次,讀取start_urls內容並啓動循環過程sql

  • name:設置爬蟲名稱,是一個標識shell

  • start_urls:設置開始的第一批爬蟲的url,一般被實現成一個列表數據庫

    • 怎樣暗中構造並提交的requset對象
    • spider的源碼:

    class Spider(object_ref): ... def start_requests(self): for url in self.start_urls: yield self.make_requests_from_url(url)api

    def make_requests_from_url(self, url):
          return Request(url, dont_filter=True)
           
      def parse(self, response):
          raise NotImplementedError
      ...
    複製代碼
    • scrapy引擎調用start_requsets方法,對爬取列表進行迭代,用迭代出的每一個url做爲參數調用make_requests_from_url方法,而後獲得真正的requset對象
    • 咱們也能夠本身定義start-requse方法
  • allow_domains:spider容許爬取的域名列表瀏覽器

  • start_request(self):只被調用一次緩存

  • parse

    • 實現頁面解析函數
    • 使用選擇器提取頁面中的數據,將數據封裝後(item或者字典)提交給引擎
    • 使用選擇器或者linkextractor提取頁面中的連接,用其構造新的requ對象並提交給scrapy引擎
  • log:日誌記錄

用LinkExtractor提取連接

  • 提取連接可使用selector和LinkExtractor兩種方法
  • selector:由於連接也是頁面中的數據,因此可使用與提取數據相同的方法進行提取,在提取少許(幾個)連接或提取規則比較簡單時,使用 Selector就足夠了
  • LinkExtractor:在提取大量連接或提取規則比較複雜

中間件(Downloadermiddlewares)

  • 中間件是處於引擎和下載器中間的一層組件

  • 能夠有不少個,按順序加載執行

  • 做用是對發出的請求和返回的結果進行預處理

  • 在middlewares文件中

  • 須要在settings中設置以便生效

  • 編寫中間件,必須是scrapy,contrib,Downloadermiddlewar的子類

  • 通常一箇中間件完成一項功能

  • 必須實現如下一個或者多個方法

    • process_request(self,request,spider)
      • 在request經過的時候調用
      • 必須返回None或response或者raise ignorerequest
      • None:scrapy將繼續處理該request
      • request:scrapy會中止調用process_request並沖洗調度返回的request
      • response:scrapy將不會調用其餘的process_request或者process_exception,直接將該response做爲結果返回,同時會調用process_response函數
    • process_response(self,request,response,spider)
      • 跟process_response大同小異
      • 每次返回結果的時候自動調用
      • 能夠有多個,按順序調用
  • 去重

    • 爲了防止爬蟲進入死循環,須要去重
    • 即在spider中的parse函數中,返回request的時候加上dont_filter=False參數

    myspider(scrapy.spider) def parse(……): …… yield screapy.Request(url=url,callback=self.parse,dont_filter=False)

  • 如何在scrapy使用selenium

    • 能夠放入中間件中的process_request函數中
    • 在函數中調用selenium,完成爬取後返回response

    class MyMiddleWare(object): def process_request(……): driver = wedriver.Chrome() html = driver,page_source driver.quit() return HtmlResponse(url=url,encoding='utf_8',ody=html,request=request)

scrapy-shell

  • shell
    • 啓動:Aanconda Promot(scrapy shell "url:xxx")
    • 啓動後自動下載指定的url的網頁
    • 下載完後,url的內容保存在response的變量中去,咱們須要調用response
  • response
    • 爬取到的內容保存在response中
    • response.body是網頁的代碼
    • response.headers是返回的http的頭信息
    • response.xpath()容許使用xpath語法選擇內容
    • response.css()容許使用css語法選取內容
  • selector
    • 選擇器,容許用戶使用選擇器來選擇本身想要的內容
    • response.selector.xpath:response.xpath是selector.xpath的快捷方式
    • response.selector.css:response.css是他的快捷方式
    • selector.extract:把節點的內容用Unicode形式返回。extract方法內部會調用其中每一個Selector對象的extract方法,並把全部結果收集到一個列表返回給用戶
    • selector.extract_first:該方法返回其中第 一個Selector對象調用extract方法的結果
    • selector.re:容許用戶經過正則選取內容
    • selector.re_first:返回其中的第一個Selector對象調用re方法的結果
    • 在第一次訪問 一個Response對象的selector屬性時,Response對象內部會以自身爲參數自動建立Selector對象,並將該Selector對象緩存,以便下次使用

模擬登錄

  • 其核心就是向服務器發送含有登陸單表數據的HTTP請求(一般是POST)
  • Scrapy提供了一個FormRequest類(Request的子類),專門用於構造含有表單數據的請求,FormRequest的構造器方法有一個formdata參數,接收字典形式的表單數據
  • 方法
    • 直接構造FormRequest對象的方式
    • 調用FormRequest的from_response方法。調用時需傳入一個Response對象做爲第一個參數,該方法會解析Response對象所包含頁面中的'<from'>元素,幫助用戶建立FormRequest對象,並將隱藏'<input'> 中的信息自動填入表單數據,使用這種方式,咱們只需經過formdata參數填寫帳號和密碼便可

識別驗證碼

  • 瀏覽器加載完登陸頁面後,會攜帶以前訪問獲取的Cookie信息,繼續發送一個HTTP請求加載驗證碼圖片
  • 識別驗證碼方式
    • OCR識別
      • 識別的驗證碼比較簡單
      • 光學字符識別,用於在圖像中提取文本信息
      • 只需提取驗證碼圖片的url
      • 帶有驗證碼登陸時,須要額外發送一個HTTP請求來獲取驗證碼圖片
    • 網絡平臺識別(驗證碼識別平臺)
      • 識別比較複雜的驗證碼
    • 人工識別
      • —在Scrapy下載完驗證碼圖片後,調用 Image.show方法將圖片顯示出來,而後調用Python內置的input函數,等待用戶肉眼識別後輸入識別結果

cookies登陸

  • 在使用瀏覽器登陸網站後,包含用戶身份信息的Cookie會被瀏覽器保存在本地,若是Scrapy爬蟲能直接使用瀏覽器中的Cookie發送HTTP請求,就能夠繞過提交表單登陸的步驟。

爬取動態頁面

  • 爬取此類動態網 頁須要先執行頁面中的JavaScript代碼渲染頁面,再進行爬取
    • Splash渲染引擎
      • 爲用戶返回通過渲染HTML頁面或頁面截圖
      • 併發渲染多個頁面
      • 關閉圖片加載,加速渲染
      • 在頁面中執行用戶自定義的JavaScript代碼
      • 執行用戶自定義的渲染腳本,功能相似於phantomjs
      • splash.readthedocs.io/en/latest/a…

分佈式爬蟲

  • 多爬蟲問題
    • 數據共享
    • 在空間上不一樣的多態機器,能夠成爲分佈式
  • 須要:
    • 共享隊列
    • 去重
  • Redis
    • 內存數據庫
    • 同時能夠落地保存到硬盤
    • 能夠去重
    • 能夠理解成一共dict,set,list的集合體
    • 能夠對保存的內容進行生命週期控制
  • 內容保存數據庫
    • MongoDB
    • mysql等傳統關係數據庫

天然語言處理

  • 語言處理
    • 搜索文本:顯示一個指定單詞的每一次出現,連同一些上下文一塊兒顯示(concordance)
    • 計數詞彙
      • 使用len獲取長度
    • 將文本作鏈詞表(列表)
    • 索引列表,切片
    • 頻率分佈,文本中每個詞項的頻率
    • 細粒度選擇詞(經過信息量選擇)
    • 詞語搭配和雙連詞
    • 計數其餘東西
      • 查看文本中詞長的分佈
    • 能夠對每一個元素進行操做
  • 文本語料和詞彙資源
    • 最簡單的一種是一些孤立的沒有什麼特別的組織的文本集合;一些語料庫按如文體(布朗語料庫)等分類組織結構;一些分類會重疊,如主題類別(路透社語料庫);另一些語料庫能夠表示隨時間變化語言用法的改變(就任演說語 料庫)
    • 能夠載入本身的語料庫
相關文章
相關標籤/搜索