<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          當feapder爬蟲框架遇上feapder爬蟲管理系統(tǒng)是怎么樣的體驗

          共 5099字,需瀏覽 11分鐘

           ·

          2021-07-29 09:10

          不廢話,直接進入主題,今天我們采集下百度搜索結果頁,以此來了解下feapder以及feapder爬蟲管理平臺

          安裝feapder

          pip3 install feapder==1.6.0 -i https://pypi.org/simple/

          創(chuàng)建項目

          > feapder create -p baidu-spider

          baidu-spider 項目生成成功
          -w506
          1. items 存放與數(shù)據(jù)庫表映射的item
          2. spiders 存放爬蟲腳本
          3. main.py 啟動入口
          4. CHECK_DATA.md 數(shù)據(jù)審核模板
          5. 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ù)

          -w1276

          解釋說明

          item為表的映射,用feapder create -i [table_name] 自動生成。yield item 即完成了數(shù)據(jù)自動批量入庫

          同時,feapder提供了pipeline,可對接其他任何數(shù)據(jù)存儲

          分布式改造

          feapder 提供了分布式爬蟲,改造如下:

          1. 修改繼承類

            class BaiduSpider(feapder.Spider):
            """
            分布式爬蟲
            """

          2. 修改啟動參數(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)一的啟動入口,方便管理

          -w380

          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 swarmk8s的彈性伸縮,都需要事先部署好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)視頻


          瀏覽 118
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜激情福利视频 | 丁香五月婷婷av影院 | 天天操屄天天日 | 人人摸人人撸 | 日日av影院 |