當feapder爬蟲框架遇上feapder爬蟲管理系統(tǒng)是怎么樣的體驗
不廢話,直接進入主題,今天我們采集下百度搜索結果頁,以此來了解下feapder以及feapder爬蟲管理平臺

安裝feapder
pip3 install feapder==1.6.0 -i https://pypi.org/simple/
創(chuàng)建項目
> feapder create -p baidu-spider
baidu-spider 項目生成成功

items 存放與數(shù)據(jù)庫表映射的item spiders 存放爬蟲腳本 main.py 啟動入口 CHECK_DATA.md 數(shù)據(jù)審核模板 README.md 爬蟲開發(fā)模板
創(chuàng)建爬蟲
> feapder create -s baidu_spider
BaiduSpider 生成成功
生成baidu_spider.py文件

文件內(nèi)容
import feapder
class BaiduSpider(feapder.AirSpider):
def start_requests(self):
yield feapder.Request("https://www.baidu.com")
def parse(self, request, response):
print(response)
if __name__ == "__main__":
BaiduSpider().start()
這個baidu_spider.py是可以脫離項目直接運行的,因此創(chuàng)建項目那一步可以省略。有項目結構,是為了規(guī)范爬蟲代碼,大型的爬蟲項目往往會有好多腳本。
編寫爬蟲
介于大家不喜歡廢話,時間寶貴,直接貼編輯好的代碼

baidu_spider.py
import feapder
from items import *
class BaiduSpider(feapder.AirSpider):
def start_requests(self):
# 采集10頁
for i in range(0, 100, 10):
yield feapder.Request(f"https://www.baidu.com/s?wd=feapder&pn={i}")
def download_midware(self, request):
"""
下載中間件 可修改請求的一些參數(shù)
"""
# request.header = {}
return request
def validate(self, request, response):
"""
@summary: 校驗函數(shù), 可用于校驗response是否正確
若函數(shù)內(nèi)拋出異常,則重試請求
若返回True 或 None,則進入解析函數(shù)
若返回False,則拋棄當前請求
可通過request.callback_name 區(qū)分不同的回調(diào)函數(shù),編寫不同的校驗邏輯
---------
@param request:
@param response:
---------
@result: True / None / False
"""
if response.status_code == 404:
return False # 則拋棄當前請求, 不會進入解析函數(shù)
if response.status_code != 200:
raise Exception("狀態(tài)碼錯誤") # 拋出異常,框架自動重試
def parse(self, request, response):
"""
解析列表
"""
results = response.xpath("http://h3[@class='t']/a")
for result in results:
title = result.xpath("string(.)").extract_first()
url = result.xpath("./@href").extract_first()
# 數(shù)據(jù)自動入庫
item = baidu_list_item.BaiduListItem()
item.title = title
item.url = url
yield item
# 采集詳情頁 并傳值title
yield feapder.Request(url, callback=self.parse_detail, title=title)
def parse_detail(self, request, response):
"""
解析詳情
"""
# 取值
title = request.title
html = response.text
# 數(shù)據(jù)自動入庫
item = baidu_detail_item.BaiduDetailItem()
item.title = title
item.html = html
yield item
if __name__ == "__main__":
BaiduSpider(thread_count=100).start()
baidu_list_item.py
from feapder import Item
class BaiduListItem(Item):
"""
This class was generated by feapder.
command: feapder create -i baidu_list.
"""
def __init__(self, *args, **kwargs):
# self.id = None
self.title = None
self.url = None
baidu_detail_item.py
from feapder import Item
class BaiduDetailItem(Item):
"""
This class was generated by feapder.
command: feapder create -i baidu_detail.
"""
def __init__(self, *args, **kwargs):
# self.id = None
self.title = None
self.html = None
setting.py :配置了數(shù)據(jù)庫連接信息
運行日志


落庫數(shù)據(jù)

解釋說明
item為表的映射,用feapder create -i [table_name] 自動生成。yield item 即完成了數(shù)據(jù)自動批量入庫
同時,feapder提供了pipeline,可對接其他任何數(shù)據(jù)存儲
分布式改造
feapder 提供了分布式爬蟲,改造如下:
修改繼承類
class BaiduSpider(feapder.Spider):
"""
分布式爬蟲
"""修改啟動參數(shù)
if __name__ == "__main__":
BaiduSpider(thread_count=100, redis_key="baidu_spider").start()啟動參數(shù)多了個redis_key,用于指定redis里任務隊列存儲的key
分布式爬蟲做了任務防丟策略,可隨時重啟,不用擔心任務丟失,數(shù)據(jù)不完整 可開多個進程,同時抓取。
編輯main
現(xiàn)在,項目里存在兩份爬蟲,baidu_spider2.py是支持分布式的,我們編輯下main.py,指定統(tǒng)一的啟動入口,方便管理

main.py
# -*- coding: utf-8 -*-
"""
Created on 2021-07-15 20:42:39
---------
@summary: 爬蟲入口
---------
@author: Boris
"""
from spiders import *
from feapder.utils.custom_argparse import ArgumentParser
def _baidu_spider1():
baidu_spider.BaiduSpider(thread_count=100).start()
def _baidu_spider2():
baidu_spider2.BaiduSpider(thread_count=100, redis_key="baidu_spider").start()
if __name__ == "__main__":
parser = ArgumentParser(description="測試")
parser.add_argument(
"--baidu_spider", action="store_true", help="", function=_baidu_spider1
)
parser.add_argument(
"--baidu_spider2", action="store_true", help="", function=_baidu_spider2
)
parser.start()
部署
使用feapder爬蟲管理平臺部署,注意不僅支持feapder,也支持scrapy等任何腳本
添加項目

支持zip和git兩種上傳方式,使用git方式時,每次啟動前都會自動拉取最新的代碼來運行。

添加任務


添加了兩個爬蟲,支持定時調(diào)度,指定爬蟲數(shù)。因為分布式爬蟲支持啟動多個實例,這里爬蟲數(shù)啟動了2個
查看任務實例
查看下分布式爬蟲的實例,已經(jīng)起兩個實例,正在初始化運行了

但由于從github拉取項目,網(wǎng)速的原因,導致拉取超時,打印日志如下:
將項目上傳到碼云,修改項目的Git地址為碼云上的地址時,再次運行,成功啦

為什么用feapder爬蟲管理系統(tǒng)
feapder爬蟲管理系統(tǒng)與市面上已有的爬蟲管理系統(tǒng)比較,優(yōu)勢在哪里?我們從架構說起
市面上已有的爬蟲管理系統(tǒng)大多數(shù)都是 master、worker工作模式,worker節(jié)點常駐,等待master的指令執(zhí)行任務。雖然都打包成了docker,但沒有利用到docker swarm或k8s的彈性伸縮,都需要事先部署好worker
feapder爬蟲管理系統(tǒng)的worker生命周期與爬蟲生命周期一致,一個任務實例可以看為一個worker,爬蟲啟動時才創(chuàng)建,爬蟲結束時銷毀。系統(tǒng)架設在docker swarm集群上,正是因為worker的彈性伸縮,使系統(tǒng)的穩(wěn)定性大大提升,一臺服務器宕機,worker會自動遷移到其他服務器節(jié)點。若后續(xù)部署到阿里云的k8s上,在爬蟲高峰期時,利用阿里云k8s自動伸縮機制,即可實現(xiàn)自動擴充服務器節(jié)點,爬蟲高峰期過了自動釋放服務器,降低成本
地址:
feapder文檔:https://boris-code.gitee.io/feapder/#/
feapder爬蟲管理系統(tǒng) 在上面的文檔里有詳細的介紹及部署步驟
本文的項目地址可關注公眾號,回復【項目】獲取
點擊原文可看爬蟲管理系統(tǒng)視頻
