2019.04.26 mongaodb

打開服務  mongod.exe --dbpath E:\Develop\mongodb_64\data\dbjavascript

在安裝和打開服務以前要建一個db  文件的存儲位置java

而後打開服務python

 

打開服務以後  打開圖形化界面鏈接  好像也沒什麼須要注意了linux

 

 

通俗來講, robots.txt 是遵循 Robot協議 的一個文件,它保存在網站的服務器中,它的做用是,告訴搜索引擎爬蟲,本網站哪些目錄下的網頁 不但願 你進行爬取收錄。在Scrapy啓動後,會在第一時間訪問網站的 robots.txt 文件,而後決定該網站的爬取範圍。web

固然,咱們並非在作搜索引擎,並且在某些狀況下咱們想要獲取的內容偏偏是被 robots.txt 所禁止訪問的。因此,某些時候,咱們就要將此配置項設置爲 False ,拒絕遵照 Robot協議redis



做者:一隻小蝸牛Snail
連接:https://www.jianshu.com/p/1b5d7d904b21
來源:簡書
簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
 
 
如何將信息保存包Mongo中呢?安裝MongoDB打開服務器以後
python中有第三包是鏈接MongoDB用的 須要安裝  pymongo
而後引包就可鏈接MongoDB了  
 
可是在scrapy中咱們該如何將數據保存到MongoDB中呢
那要是My sql呢?
 
 
奈斯 臥槽終於有一是能夠關聯上數據庫了
媽耶 還有什麼比這更好
 

 Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。sql

 

Docker相似於虛擬機那種環境     http://get.daocloud.io/mongodb

 

Splash是一個javascript渲染服務。它是一個帶有HTTP API的輕量級Web瀏覽器,使用Twisted和QT5在Python 3中實現。QT反應器用於使服務徹底異步,容許經過QT主循環利用webkit併發。
一些Splash功能:chrome

  • 並行處理多個網頁
  • 獲取HTML源代碼或截取屏幕截圖
  • 關閉圖像或使用Adblock Plus規則使渲染更快
  • 在頁面上下文中執行自定義JavaScript
  • 可經過Lua腳原本控制頁面的渲染過程
  • 在Splash-Jupyter 筆記本中開發Splash Lua腳本。
  • 以HAR格式獲取詳細的渲染信息

 

何爲動態的頁面:數據改變吧docker

 

虛擬化  任務管理 CPU查看是否開啓

 

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。

 

分佈式讓爬蟲的效率更高   

 

linux  的安裝  操做系統的安裝(centos6)

VMware安裝好了以後,要先建立一個虛擬環境,分區磁盤運行內存啥的。而後才安裝操做系統,   對啊個人系統也放在這些分區中,這些硬件中

因此操做系統不該該包括這些的。本身不可能在配置這些硬件什麼之類的,否則就是寫死了

 

windou鏈接虛擬機 傳輸文件 Xshell  Xftp           通常文件放在/OPT      可是我解壓文件以後,應該怎麼安裝呢

因此計算機也會有全局變量這種東西  環境變量也有全局的和局部的

 

克隆的時候也要注意硬件網卡的東西,克隆出來是同樣的可能會衝突。 硬件?TCP/IP嗎

那該怎麼辦呢   刪除網卡 vi ifcfg-eth0

而後是刪除硬件信息  70-persistent-net.rules                     不對啊  把本身的網卡還有硬件信息都刪了,那本身怎麼辦

怎麼克隆呢:先拍快照  而後管理裏有克隆  

而後發現用戶名是同樣的那要怎麼改呢?

cd /etc/sysconfig/   

vi network

init 6 是重啓嗎

 

分佈式內容:

  在虛擬機中裝了什麼,python3,scrapy以及它的環境,scrapy-redis     而他們是跑爬蟲程序的機器

  windows是核心服務器須要裝redis服務器

咱們在master上搭建一個redis數據庫`(注意這個數據庫只用做url的存儲),並對每個須要爬取的網站類型,都開闢一個單獨的列表字段。經過設置slave上scrapy-redis獲取url的地址爲master地址。這樣的結果就是,儘管有多個slave,然而你們獲取url的地方只有一個,那就是服務器master上的redis數據庫

而且,因爲scrapy-redis自身的隊列機制,slave獲取的連接不會相互衝突。這樣各個slave在完成抓取任務以後,再把獲取的結果彙總到服務器上

 

3.分佈式爬蟲的實現

  1. 使用三臺機器,一臺是win10,兩臺是centos6,分別在兩臺機器上部署scrapy來進行分佈式抓取一個網站

  2. win10的ip地址爲192.168.31.245,用來做爲redis的master端,centos的機器做爲slave

  3. master的爬蟲運行時會把提取到的url封裝成request放到redis中的數據庫:「dmoz:requests」,而且從該數據庫中提取request後下載網頁,再把網頁的內容存放到redis的另外一個數據庫中「dmoz:items」

  4. slave從master的redis中取出待抓取的request,下載完網頁以後就把網頁的內容發送回master的redis

  5. 重複上面的3和4,直到master的redis中的「dmoz:requests」數據庫爲空,再把master的redis中的「dmoz:items」數據庫寫入到mongodb中

  6. master裏的reids還有一個數據「dmoz:dupefilter」是用來存儲抓取過的url的指紋(使用哈希函數將url運算後的結果),是防止重複抓取的

 

這些數據庫:mongo,redis,Mysql   在python鏈接他們的時候,他們都要的打開服務,都是獨立的軟件,如何進行通訊呢?

就經過這個服務的,應該會有端口之類的   設計這些東西可能都是基於Linux系統吧,都沒有圖形化界面  也沒有像qq那樣安裝的簡單

因此他們也是提供的本身的圖形界面的   一個非關係型的數據庫 一個是key value形式的 有16個小數據庫的   一個關係型的大型數據庫

 

如今環境已經搭建好了,咱們的目標是什麼,併發嗎???  按照上面的要求我必須在master中存request url 到redis中  

而後在slave中獲取master中的url進行爬取    

 

splash與request結合  :有什麼轉變嗎?只是在原基礎上加了docker 的訪問地址嗎?

動態爬取嗎???    加載js嗎?   與js有關係嗎  不能爬取有js渲染的嗎?  加載東西也是須要時間的

原來是這個意思

 

什麼是lua代碼  不曉得  這個lua代碼應該是docker中的吧

 

splash 與scrapy結合:去上面的方式有什麼不一樣  python提供了一個類吧 SplashRequest

這個就是 當咱們發送請求的時候不用咱們原來的Spider.request 了  而是用SplashRequest這個請求了

須要在setting中修改東西的

 

問題

有的頁面的不少部分都是用JS生成的,而對於用scrapy爬蟲來講就是一個很大的問題,由於scrapy沒有JS engine,因此爬取的都是靜態頁面,對於JS生成的動態頁面都沒法得到

官網http://splash.readthedocs.io/en/stable/

 

解決方案

  • 利用第三方中間件來提供JS渲染服務: scrapy-splash 等

  • 利用webkit或者基於webkit庫

Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具備異步處理能力,以發揮webkit的併發能力

 

 pip install scrapy-splash

 

scrapy-splash使用的是Splash HTTP API, 因此須要一個splash instance,通常採用docker運行splash,因此須要安裝docker

 

selenium 是一套完整的web應用程序測試系統,包含了測試的錄製(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Selenium Grid)。Selenium的核心Selenium Core基於JsUnit,徹底由JavaScript編寫,所以能夠用於任何支持JavaScript的瀏覽器上。

selenium能夠模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。

 

selenium與scrapy結合:selenium能夠驅動瀏覽器,scrapy還有去重url的做用

去重是在調度器有記錄的,因此咱們還想用selenium發送請求的話能夠下載中間件下手

    def start_request(self):

      chrome = webdriver.Chrome()

      chrome = get(url)

中間件有不少東西,但每次咱們用的時候都是看源碼。找到咱們想要的模塊

要使用middlewares就要在setting中開啓 要使用pipeline就要setting中開啓

雖然很好去關注下載中間件,可是這也是一個流程,咱們下載的東西,確定通過裏面的

 

開始 // 屬性用@符號,屬性名用雙引號 用中括號括起來   下一層用/ 隔開

還能夠拼接  |       concat      有意思的string

' concat(//span[@class="total"]/text(),//span[@class="unit"]/span/text())'

 

爲何那個什麼ul下的li  索引不是從零開始的

 

若是推送過來的item不是字典的話  要記得用dict轉換

 

好像真的是,他會先訪問url  而後會在調度器中隊列排序

 

scrapy-redis 這個也要安裝的  在redis中就會生成字段  爲何redis不要鏈接呢

相關文章
相關標籤/搜索