国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

scrapy-redis分布式爬蟲框架詳解

myeveryheart / 730人閱讀

摘要:分布式爬蟲框架詳解隨著互聯網技術的發展與應用的普及,網絡作為信息的載體,已經成為社會大眾參與社會生活的一種重要信息渠道。下載器中間件位于引擎和下載器之間的框架,主要是處理引擎與下載器之間的請求及響應。

scrapy-redis分布式爬蟲框架詳解

隨著互聯網技術的發展與應用的普及,網絡作為信息的載體,已經成為社會大眾參與社會生活的一種重要信息渠道。由于互聯網是開放的,每個人都可以在網絡上發表信息,內容涉及各個方面。小到心情日志,大到國家大事。

互聯網已成為思想文化信息的集散地,并具有傳統媒體無法相比的優勢:便捷性,虛擬性,互動性,多元性。網絡新聞熱點通常形成迅速,多是人們對于日常生活中的各種問題發表的各種意見,評論,態度,情緒等,隨著事件的發展而變化,是反映社會熱點的重要載體之一。

相比較而言,編寫爬蟲程序獲取到的海量數據更為真實、全面,在信息繁榮的互聯網時代更為行之有效。因此編寫爬蟲程序成為大數據時代信息收集的必備技能。

本文主要介紹爬蟲收集數據優點、爬蟲原理、scrapy爬蟲框架,并以新聞爬取為例,詳細講解使用scrapy爬取數據的步驟以及scrapy-redis分布式。

一、爬蟲收集數據的優點

大數據時代下,人類社會的數據正以前所未有的速度增長,傳統的獲取數據的方式如問卷調查、訪談法等,其樣本容量小、信度低、且受經費和地域范圍所限,因而收集的數據往往無法客觀反映研究對象,有著較大的局限性。

以不能滿足高質量研究的需求。正如Ivor的理論所揭示的,如果輸入的是無效信息,無論處理的程序如何精良,輸出的都是無用信息“Garbage In,Garbage Out”。可見,對比傳統的數據收集方法,立足于海量數據的研究有以下的優點:

(一)數據的真實性
數據的真實性,使用問卷調查法收集的數據,調查者難以了解被調查者是認真填寫還是敷衍了事。使得得到的數據真實性不可靠,而通過爬蟲技術能快速獲取真實、客觀的用戶信息,如在社交網絡上對一個公司的評價顯然要比問卷調查真實,淘寶、美團上消費者對賣家的評論就比較客觀的反應了商品的質量。
 (二)樣本容量
人類當初發明計算機是因為在二戰時期工程師們已經無法計算導彈的飛行軌跡,龐大的計算量迫使了計算機的發明,可見計算機天生就是來處理大規模批量的數據,把人們從繁重的勞動中解放出來。在同樣的成本下,人工采集和計算機采集的數據量不是一個量級的,爬蟲可以對互聯網上的海量數據進行收集、分析,能更好的反應客觀事實,而數據越全面,分析研究的結果也就越真實。

二、爬蟲原理
網絡爬蟲(Web crawler),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本,我們瀏覽的網頁數以億計,它們在世界各地的服務器上存儲著。用戶點擊一個網頁的超鏈接以跳轉的方式來獲取另一個頁面的信息,而跳轉的頁面又有鏈接存在,網頁便由超鏈接組成一個巨大且錯綜復雜的網。而Web爬蟲(Crawler),也稱蜘蛛(Spider),則是穿梭在這巨大的互聯網中下載網頁解析內容的程序。它們被廣泛用于互聯網搜索引擎,可以自動采集所有其能夠訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。
(一)爬蟲的應用
在商務智能上,企業使用爬蟲收集競爭對手的情報或在社交網絡、虛擬社區上爬取用戶對企業的評價從而在產品服務上做出改進等。在數據研究上,爬蟲能快速收集互聯網上的信息,為數據分析提供原始資料。
(二)爬蟲算法流程
從功能上來講,爬蟲一般分為數據采集,處理,儲存三個部分。傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較為復雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接將其放入等待抓取的URL隊列。然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統的某一條件時停止。另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索;對于聚焦爬蟲來說,這一過程所得到的分析結果還可能對以后的抓取過程給出反饋和指導。

                         圖1:爬蟲算法流程圖

三、scrapy爬蟲框架

Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。其最初是為了頁面抓取 (更確切來說, 網絡抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。

(一)scrapy整體架構圖

                                圖2:scrapy架構圖


(二)Scrapy主要組件
1、引擎(Scrapy): 用來處理整個系統的數據流處理, 觸發事務(框架核心)。
2、調度器(Scheduler): 用來接受引擎發過來的請求, 壓入隊列中, 并在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什么, 同時去除重復的網址。
3、下載器(Downloader): 用于下載網頁內容, 并將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)。
4、爬蟲(Spiders): 爬蟲是主要干活的, 用于從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面。
5、項目管道(Pipeline): 負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析后,將被發送到項目管道,并經過幾個特定的次序處理數據。
6、下載器中間件(Downloader Middlewares): 位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
7、爬蟲中間件(Spider Middlewares): 介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
8、調度中間件(Scheduler Middewares): 介于Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。
四、爬蟲實戰項目
(一)scrapy安裝

Scrapy框架官方網址:http://doc.scrapy.org/en/latest
Scrapy中文維護站點:http://scrapy-chs.readthedocs...

1、Ubuntu下安裝
sudo pip install scrapy

2、mac下安裝
sudo pip install scrapy

3、Windows下安裝

Windows下安裝scrapy會出現各種依賴和不兼容,個人建議先安裝anaconda,它是一個開源的、免費的python類庫的集合,貌似一下就安裝了200+的包,各種依賴包各種搞定,專治各種不服。anaconda下載鏈接。
安裝命令: conda install scrapy

4、安裝后,只要在命令終端輸入 scrapy,提示類似以下結果,代表已經安裝成功

                            圖3:scrapy安裝成功


(二)新建scrapy項目(scrapy startproject)

在開始爬取之前,必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令,命令執行完后程序目錄結構大致如下:

scrapy startproject tutorial    #創建項目

            圖4:目錄結構圖

下面來簡單介紹一下各個主要文件的作用:
scrapy.cfg:項目的配置文件
tutorial/:項目的Python模塊,將會從這里引用代碼
tutorial/items.py:項目的字段定義文件
tutorial/pipelines.py:項目的管道文件
tutorial/settings.py:項目的設置文件
tutorial/spiders/:存儲爬蟲代碼目錄

(三)定義存儲對象(tutorial/items.py)

Items是裝載我們抓取數據的容器。它們工作像簡單的Python字典,它提供更多的保護,比如對未定義的字段提供填充功能防止出錯.
Itmes.py

(四)制作爬蟲 (tutorial/spiders/)

1、在當前目錄下輸入命令,將在tutorial/spider目錄下創建一個名為hsw的爬蟲,并指定爬取域的范圍:

`scrapy genspider hsw "hsw.cn"`   #創建爬蟲

2、打開 tutorial/spider目錄里的 hsw.py,默認增加了下列代碼:

hsw.py

3、要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法。

(1)    name ="":這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
(2) allow_domains=[]是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
(3) start_urls=():爬取的URL元祖/列表。爬蟲從這里開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
(4) parse(self,
response):解析的方法,每個初始URL完成下載后將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:
a) 負責解析返回的網頁數據(response.body),提取結構化數據(生成item) b) 生成需要下一頁的URL請求。

4、修改parse方法,添加parse_item方法

現在我們修改hsw.py文件將start_urls的值修改為需要爬取的第一個url
start_urls = ["http://finance.hsw.cn/hyxw/index.shtml"]
這里先簡單介紹下xpath語法(詳見官方文檔:http://www.w3school.com.cn/xm...)

(1)    //div[@class="listleft"]/ul/li/h3/a/@href
表示選擇所有含有屬性class等于listleft的dev元素下方的ul->li->h3下方a標簽的herf屬性,取列表頁所有內容頁url。
(2) //div[@class="hd"]/h1/text()
表示選擇所有含有屬性class等于hd的dev元素下方的h1標簽,取文章標題。
(3) //div[@class="photoarea"]//p/text()|//div[@class="contentBox
cf"]//p/text() 同上,由于網頁中存在多種不同的頁面結構,需要兼容,故使用“|”語法,表示或的意思,取文章正文。
(4) //span[@class="article-time"]/text() 語法同上,取文章的發布時間。

5、然后運行一下看看,在tutorial目錄下執行:

scrapy crawl hws -o hws.csv

輸出信息保存csv格式,用Excel打開數據如下圖所示:

                                    圖6:Excel數據

scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,命令如下:
json格式,默認為Unicode編碼

scrapy crawl hws -o hws.json

json lines格式,默認為Unicode編碼

scrapy crawl hws -o hws.jsonl

csv 逗號表達式,可用Excel打開

scrapy crawl hws -o hws.csv

xml格式

scrapy crawl hws -o hws.xml
五、scrapy-redis分布式

scrapy是python界出名的一個爬蟲框架。Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
雖然scrapy能做的事情很多,但是要做到大規模的分布式應用則捉襟見肘。有能人改變了scrapy的隊列調度,將起始的網址從start_urls里分離出來,改為從redis讀取,多個客戶端可以同時讀取同一個redis,從而實現了分布式的爬蟲。

(一)scrapy-redis安裝

安裝:pip install scrapy-redis 官方站點:https://github.com/rolando/scrapy-redis

(二)scrapy-redis架構

                    圖7:scrapy-redis架構
                    
                   

(三)scrapy-Redis組件詳解

如上圖所示,scrapy-redis在scrapy的架構上增加了redis,基于redis的特性拓展了如下四種組件:Scheduler,Duplication Filter,Item Pipeline,Base Spider

1、Scheduler: scrapy改造了python本來的collection.deque(雙向隊列)形成了自己的Scrapy
queue,但是Scrapy多個spider不能共享待爬取隊列Scrapy
queue,即Scrapy本身不支持爬蟲分布式,scrapy-redis 的解決是把這個Scrapy
queue換成redis數據庫(也是指redis隊列),從同一個redis-server存放要爬取的request,便能讓多個spider去同一個數據庫里讀取。Scrapy中跟“待爬隊列”直接相關的就是調度器Scheduler,它負責對新的request進行入列操作(加入Scrapy
queue),取出下一個要爬取的request(從Scrapy
queue中取出)等操作。它把待爬隊列按照優先級建立了一個字典結構,然后根據request中的優先級,來決定該入哪個隊列,出列時則按優先級較小的優先出列。為了管理這個比較高級的隊列字典,Scheduler需要提供一系列的方法。但是原來的Scheduler已經無法使用,所以使用Scrapy-redis的scheduler組件。

2、Duplication Filter

Scrapy中用集合實現這個request去重功能,Scrapy中把已經發送的request指紋放入到一個集合中,把下一個request的指紋拿到集合中比對,如果該指紋存在于集合中,說明這個request發送過了,如果沒有則繼續操作。這個核心的判重功能是這樣實現的:

在scrapy-redis中去重是由Duplication Filter組件來實現的,它通過redis的set不重復的特性,巧妙的實現了DuplicationFilter去重。scrapy-redis調度器從引擎接受request,將request的指紋存入redis的set檢查是否重復,并將不重復的request push寫入redis的 request queue。

引擎請求request(Spider發出的)時,調度器從redis的request queue隊列里根據優先級pop 出?個request 返回給引擎,引擎將此request發給spider處理。

3、Item Pipeline:

引擎將(Spider返回的)爬取到的Item給Item Pipeline,scrapy-redis 的Item Pipeline將爬取到的
Item 存入redis的 items queue。修改過Item Pipeline可以很方便的根據 key 從 items queue
提取item,從而實現 items processes集群。

4、Base Spider

不在使用scrapy原有的Spider類,重寫的RedisSpider繼承了Spider和RedisMixin這兩個類,RedisMixin是用來從redis讀取url的類。

當我們生成一個Spider繼承RedisSpider時,調用setup_redis函數,這個函數會去連接redis數據庫,然后會設置signals(信號):一個是當spider空閑時候的signal,會調用spider_idle函數,這個函數調用schedule_next_request函數,保證spider是一直活著的狀態,并且拋出DontCloseSpider異常。一個是當抓到一個item時的signal,會調用item_scraped函數,這個函數會調用schedule_next_request函數,獲取下一個request。

5、 總結

總結一下scrapy-redis的總體思路:這套組件通過重寫scheduler和spider類,實現了調度、spider啟動和redis的交互;

實現新的dupefilter和queue類,達到了判重和調度容器和redis的交互,因為每個主機上的爬蟲進程都訪問同一個redis數據庫,所以調度和判重都統一進行統一管理,達到了分布式爬蟲的目的;當spider被初始化時,同時會初始化一個對應的scheduler對象,這個調度器對象通過讀取settings,配置好自己的調度容器queue和判重工具dupefilter;

每當一個spider產出一個request的時候,scrapy引擎會把這個reuqest遞交給這個spider對應的scheduler對象進行調度,scheduler對象通過訪問redis對request進行判重,如果不重復就把他添加進redis中的調度器隊列里。當調度條件滿足時,scheduler對象就從redis的調度器隊列中取出一個request發送給spider,讓他爬取;

當spider爬取的所有暫時可用url之后,scheduler發現這個spider對應的redis的調度器隊列空了,于是觸發信號spider_idle,spider收到這個信號之后,直接連接redis讀取strart_url池,拿去新的一批url入口,然后再次重復上邊的工作。

(四)從零搭建scrapy-redis分布式爬蟲

1、scrapy-Redis分布式策略:

Slaver端從Master端拿任務(Request/url/ID)進行數據抓取,在抓取數據的同時也生成新任務,并將任務拋給Master。Master端只有一個Redis數據庫,負責對Slaver提交的任務進行去重、加入待爬隊列。

優點:scrapy-redis默認使用的就是這種策略,我們實現起來很簡單,因為任務調度等工作scrapy-redis都已經幫我們做好了,我們只需要繼承RedisSpider、指定redis_key就行了。

缺點:scrapy-redis調度的任務是Request對象,里面信息量比較大(不僅包含url,還有callback函數、headers等信息),導致的結果就是會降低爬蟲速度、而且會占用Redis大量的存儲空間。當然我們可以重寫方法實現調度url。

                        圖6:scrapy-redis分布式策略
                        

2、安裝Redis

下載redis:http://redis.io/download

安裝完成后,拷貝一份Redis安裝目錄下的redis.conf到任意目錄,建議保存到:/etc/redis/redis.conf 打開你的redis.conf配置文件,示例: 非Windows系統: sudo vim /etc/redis/redis.conf Master端redis.conf里注釋bind 127.0.0.1,Slave端才能遠程連接到Master端的Redis數據庫。

3、創建項目

使用上面的scrapy的項目我們來修改一下,這個爬蟲繼承了RedisSpider,它能夠支持分布式的抓取,采用的是basic spider,需要寫parse函數。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis將key從Redis里pop出來,成為請求的url地址。
修改spiders/hsw.py

修改settings.py

4、執行程序

通過runspider方法執行爬蟲的py文件(也可以分次執行多條),爬蟲(們)將處于等待準備狀態:

scrapy runspider hsw.py

在Master端的redis-cli輸入push指令,參考格式:

$redis > lpush myspider:start_urls http://finance.hsw.cn/hyxw/

5、獲取數據

所有Slaver端將開始爬取數據,數據將保存在Redis數據庫中,并共享Redis數據庫的請求隊列、請求指紋集合和數據隊列。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41516.html

相關文章

  • Python3網絡爬蟲實戰---11、爬蟲框架的安裝:ScrapySplash、ScrapyRedi

    摘要:上一篇文章網絡爬蟲實戰爬蟲框架的安裝下一篇文章網絡爬蟲實戰部署相關庫的安裝的安裝是一個中支持渲染的工具,本節來介紹一下它的安裝方式。另外一個是的庫的安裝,安裝之后即可在中使用服務。 上一篇文章:Python3網絡爬蟲實戰---10、爬蟲框架的安裝:PySpider、Scrapy下一篇文章:Python3網絡爬蟲實戰---12、部署相關庫的安裝:Docker、Scrapyd Scrap...

    harryhappy 評論0 收藏0
  • python爬蟲入門(一)

    摘要:想辦法區分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態圈完善,是最大對手。最要命的是爬蟲需要經常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...

    lentrue 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • scrapy-redis的布隆去重

    摘要:布隆去重的優點和缺點優點相比于其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。下載布隆過濾器文件,將其拷貝至包中。修改其函數按照分布式爬蟲部署步驟,繼續進行即可使用布隆去重策略 scrapy-redis的布隆去重 - 為什么要使用布隆去重? scrapy自帶去重機制,即將所需要爬取的網頁放在set中來達到去重的目的,但是在實際工作中,我們需要更新數據的時候往往不需要爬取已經爬...

    jaysun 評論0 收藏0

發表評論

0條評論

myeveryheart

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<