python 爬虫框架_Python网络爬虫-scrapy框架的使用
1. Scrapy
1.1 Scrapy框架的安裝
Scrapy是一個十分強大的爬蟲框架,依賴的庫比較多,至少需要依賴的庫有Twisted 、lxml和pyOpenSSL。在不同的平臺環境下,它所依賴的庫也各不相同,所以在安裝之前,最好確保把一些基本庫安裝好。
通過pip安裝:pip install scrapy
如果出現如下錯誤:
這是安裝Twisted導致的這個錯誤的發生的,需要從非官方版本下載twisted并安裝:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
下載對應版本后,通過pip安裝:
pip install Twisted-19.2.0-cp36-cp36m-win_amd64.whlTwisted是用Python實現的基于事件驅動的網絡引擎框架,Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。scrapy是基于twisted實現的。
成功安裝twisted后,再通過pip install scrap即可成功安裝scrapy。
1.2 Scrapy框架基本使用
第一步:創建項目
CMD進入需要放置項目的目錄 輸入:
# DoubanBook代表項目的名字用pycharm打開可以看到如下目錄結構:
第二步:創建一個爬蟲
cd DoubanBook scrapy genspider doubanbook book.douban.com其中doubanbook是爬蟲的名字,http://book.douban.com代表爬蟲爬取url。
執行成功后,可以看到spiders目錄下新生成的文件:
打開doubanbook.py文件,可以看到scrapy框架生成的基本爬蟲模板,里面定義了爬蟲的名稱,爬取起始url,還有一個需要完善的解析方法。
第三步:實現爬蟲
先簡單嘗試一下把parse方法里的pass去掉,打印網頁源碼:
def第四步:運行爬蟲
通過下面命令運行爬蟲:
# doubanbook就是第二步創建爬蟲時定義的爬蟲名稱這時會出現403錯誤
這是因為豆瓣網站檢測了請求是不是由瀏覽器發起的,不是的話會被拒絕訪問,所以要讓爬蟲模擬瀏覽器請求。
修改settings.py配置文件,配置請求頭:
# Override the default request headers:再次運行爬蟲,就能正常打印出網頁源碼。
scrapy從創建項目到運行爬蟲的基本流程就是這樣,詳細內容在后面具體介紹。
1.3 Scrapy基本原理
scrapy架構如圖所示:
- Scrapy Engine: scrapy引擎,負責Spiders、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等等。
- Scheduler(調度器): 它負責接受引擎發送過來的requests請求,并按照一定的方式進行整理排列、入隊,等待Scrapy Engine(引擎)來請求時,交給引擎。
- Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spiders來處理,
- Spiders:它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器),
- Item Pipeline:它負責處理Spiders中獲取到的Item,并進行處理,比如去重,持久化存儲(存數據庫,寫入文件,總之就是保存數據用的)
- Downloader Middlewares(下載中間件):可以當作是一個可以自定義擴展下載功能的組件。
- Spider Middlewares(Spider中間件):可以理解為是一個可以自定擴展和操作引擎和Spiders中間‘通信‘的功能組件(比如進入Spiders的Responses;和從Spiders出去的Requests)
根據scrapy框架的架構,建立一個項目之后:
第一件事情是在items.py文件中定義一些字段,這些字段用來臨時存儲你需要保存的數據。方便后面保存數據到其他地方,比如數據庫 或者 本地文本之類的。
第二件事情在spiders文件夾中編寫自己的爬蟲。
第三件事情在pipelines.py中存儲自己的數據。
第四件事情,不是非做不可的,settings.py文件 并不是一定要編輯的,只有有需要的時候才會編輯。SpiderMiddleware和DownloaderMiddleware也是在有需要的情況下進行修改。
1.4 Scrapy中items的用法
在items中定義爬取內容,如下所示:
import1.5 Scrapy中spiders的用法
spider中通過解析請求的頁面,最后構造一個item并返回。解析可以使用xpath進行解析,也可以使用Beautiful Soup等第三方庫解析。
import1.6 Scrapy中Item Pipeline的用法
頁面解析后得到item之后,通過item pipeline進行后處理,一般是存入數據庫或寫入文件。
把數據存入數據庫,需要使用到pymysql、pymongo等操作數據庫的第三方庫,通過pip安裝:
pip install pymysql pip install pymongo下面通過MySQL演示具體使用:
import然后取消settings中的ITEM_PIPELINES注釋,數字代表優先級,當有多個item_pipelines的時候起作用。
# Configure item pipelines這樣再執行scrapy crawl doubanbook啟動爬蟲,數據就會保存到數據庫中。
2.使用scrapy-redis實現分布式爬蟲
Scrapy 是一個通用的爬蟲框架,但是不支持分布式,Scrapy-redis是為了更方便地實現Scrapy分布式爬取,而提供了一些以redis為基礎的組件。
2.1 scrapy-redis安裝
需要安裝reids和scrapy_redis庫。
pip install redis pip install scrapy_redis2.2 scrapy-redis基本原理
Scrapy-Redis分布式策略:
- Master端(核心服務器) :搭建一個Redis數據庫,負責url指紋判重、Request的分配,以及數據的存儲
- Slaver端(爬蟲程序執行端) :負責執行爬蟲程序,運行過程中提交新的Request給Master
- Scrapy-Reids 就是將Scrapy原本在內存中處理的 調度(就是一個隊列Queue)、去重這兩個操作通過Redis來實現。
- 多個Scrapy在采集同一個站點時會使用相同的redis key(可以理解為隊列)添加Request 獲取Request 去重Request,這樣所有的spider不會進行重復采集。
- Redis是原子性的,一個Request要么被處理 要么沒被處理,不存在第三可能。
2.3 scrapy-redis實例
2.3.1 items.py
定義兩個item,一個是待爬取的每本書的url,一個是每本書的具體內容。
# -*- coding: utf-8 -*-2.3.2 spiders
實現兩個spider,一個用來獲取每本書的url,存入redis,框架實現去重,爬取隊列等。另一個用來爬取每本書的具體內容,從redis中讀取url進行爬取。
master端spider:返回MasterRedisItem
importclient端spider:返回DangdangItem,其中redis_key = 'dangdang:start_urls',和下面pipelines對應一致。
# -*- coding: utf-8 -*-2.3.3 pipelines.py
處理url的redis緩存和最終數據保存到數據庫。
# -*- coding: utf-8 -*-2.3.4 middlewares.py
# -*- coding: utf-8 -*-2.3.5 settings.py
# -*- coding: utf-8 -*-運行master端開始獲取url存入redis,client端可以開啟多個同時進行爬取,這樣就實現了spider的并行。
scrapy crawl dangmaster # 開啟一個 scrapy crawl dangdang # 可以開啟多個3.反爬措施
代碼還沒敲完就被封的豆瓣。
3.1 代理ip的使用
許多網站也做了許多反爬措施,其中爬蟲訪問過于頻繁直接封ip地址的方法被許多網站采用,代理ip便可以防止這種情況出現。
scrapy框架在middlewares里設置代理ip。
def3.2 cookies池的使用
有的網站不登錄直接爬取會有一些弊端,弊端主要有以下兩點。
- 設置了登錄限制的頁面無法爬取。如某論壇設置了登錄才可查看資源,某博客設置了登錄才可查看全文等,這些頁面都需要登錄賬號才可以查看和爬取。
- 一些頁面和接口雖然可以直接請求,但是請求一旦頻繁,訪問就容易被限制或者IP直接被封,但是登錄之后就不會出現這樣的問題,因此登錄之后被反爬的可能性更低。
所以可以搭建一個cookies池來模擬登錄。
GitHub地址:
https://github.com/stormstone/SpiderSSSReferences
總結
以上是生活随笔為你收集整理的python 爬虫框架_Python网络爬虫-scrapy框架的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wps大纲栏显示在右边_miui12通知
- 下一篇: e3 1231 v3 达芬奇_黑苹果E3