婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python 用遞歸實現通用爬蟲解析器

python 用遞歸實現通用爬蟲解析器

熱門標簽:電話機器人貸款詐騙 佛山通用400電話申請 蘇州人工外呼系統軟件 看懂地圖標注方法 淮安呼叫中心外呼系統如何 打印谷歌地圖標注 電話外呼系統招商代理 京華圖書館地圖標注 廣東旅游地圖標注

我們在寫爬蟲的過程中,除了研究反爬之外,幾乎全部的時間都在寫解析邏輯。那么,生命苦短,為什么我們不寫一個通用解析器呢?對啊!為什么不呢?開整!

需求分析

爬蟲要解析的網頁類型無外乎 html、json 以及一些二進制文件(video、excel 文件等)。既然要做成通用解析器,我們有兩種實現方式,一種是將網頁內容轉換成統一的形式,然后用對應的解析規則去解析,比如全部將網頁內容轉換成 html 形式,然后用 xpath 去提取。

另外一種是配置文件預先告知的方式,你配置成什么類型,解析器就通過對應的解析規則去解析。

統一網頁形式,需要做大量的網頁內容形式轉換,而配置文件預先告知則需要在配置時指定更多解析字段。相比較而言,通過第二種方式,未來改變較多的是配置規則,不需要動核心代碼,引入 bug 的可能性較低。因此這里我們采用第二種方式實現解析器

進一步分析

解析器對于網頁內容的提取,本質上和我們在本地電腦上查找和整理文件,沒有什么差別。比如像下面這樣

解析內容就是從中提取我們想要的信息,然后整理成我們希望的格式。比如上面的內容,我們提取出來的形式應該是這樣

{
  "design": "設計圖.psd",
  "software": "sketch.dmg"
}

而在實際的爬蟲開發過程中,網頁形式遠比以上的復雜。其實遇到最多的問題是在一組列表中嵌套一個列表,我們需要把這種形式提取出來。比如像下面這種形式

{
    "a": "a",
    "b": [
        {"c": "c1", "d": "d1"},
        {"c": "c2", "d": "d2"}]
}

他提取出信息后應該是這樣

[
  {
    "a": "a",
    "c": "c1",
    "d": "d1"
  },
  {
    "a": "a",
    "c": "c2",
    "d": "d2"
  }
]

如果小伙伴對于算法熟悉的話,應該能察覺出這種遍歷用遞歸來寫是非常方便的。但要注意的是 python 會限定遞歸的層數,小伙伴可以通過下面這個方法查看遞歸限定的層數

import sys
print(sys.getrecursionlimit())

>>>1000

我這邊限定的層數是 1k。對于解析網頁來說完全夠用了,如果哪個人把網頁解析邏輯嵌套了 1000 層,我建議你直接跟老板提放棄這個網頁吧!

再進一步分析

我們已經知道對于通用解析來說,就是通過配置解析規則提取頁面的對應信息。而針對有列表層級的網頁可能還涉及遞歸遍歷問題。那如何去配置這種解析規則呢?其實很簡單,只需要在進入每一個層級之前先指定該層的數據形式,比如下面這個原數據

{
  "a": "a",
  "b": [
          {"c": "c1", "d": "d1"},
          {"c": "c2", "d" : "d2"}
       ]
}

想提取嵌套信息,我們的解析規則就應該是這樣的

[
 {
  "$name": "a",
  "$value_type": "raw",
  "$parse_method": "json",
  "$parse_rule": "a",
  "$each": []
 },
 {
  "$name": "__datas__",
  "$value_type": "recursion",
  "$parse_method": "json",
  "$parse_rule": "b",
  "$each": [
        {  
         "$name": "c",
          "$value_type": "raw",
         "$parse_method": "json",
         "$parse_rule": "c",
         "$each": []
        },
        {  
         "$name": "d",
          "$value_type": "raw",
         "$parse_method": "json",
         "$parse_rule": "d",
         "$each": []
        }
      ]
 }
]

其中 $name 字段表示我們最終希望最外層數據所擁有的字段名,當然如果是需要遞歸到內層的字段,則將列表保存為 __datas__ ,然后根據這個 __datas__ 進行內層結構的解析。最終我們得到的數據結構應該是這樣的

[
  {"a": "a", "c": "c1", "d": "d1"}, 
  {"a": "a", "c": "c2", "d": "d2"}
]

以上我們只演示了 json 的解析規則,如果要拿來解析 html 對象呢?很簡單,將解析方式改為 xpath 對象,然后傳入 xpath 解析語法即可。

代碼實現

總共分成兩部分,一部分根據原最終結果和規則進行打包,將所有涉及 recursion 邏輯的字段進行轉換,代碼如下

def _pack_json(result, rules):
        item = {}

        for p_rule in rules:

            if p_rule.get("$value_type") == "raw":
                if p_rule.get("$parse_method") == "json":
                    item[p_rule.get("$name")] = glom(result, p_rule.get("$parse_rule"))

            elif p_rule.get("$value_type") == "recursion":
                if p_rule.get("$parse_method") == "json":
                    tmp_result = glom(result, p_rule.get("$parse_rule"))
                    total_result = []
                    for per_r in tmp_result:
                        total_result.append(_pack_json(per_r, p_rule.get("$each")))
                    item[p_rule.get("$name")] = total_result
        return item

另外一部分將上一步得到的進行解析,將打包得到的結果進行解包,即將所有內嵌的數據提到最外層,代碼如下

def _unpack_datas(result: dict) -> list:
        if "__datas__" not in result:
            return [result]

        item_results = []
        all_item = result.pop("__datas__")

        for per_item in all_item:
            if "__datas__" in per_item:
                tmp_datas = per_item.pop("__datas__")
                for per_tmp_data in tmp_datas:
                    tmp_item = _unpack_datas(per_tmp_data)
                    for per_tmp_item in tmp_item:
                        item_results.append({**per_tmp_item, **per_item})
            else:
                item_results.append({**result, **per_item})

        return item_results

后再包一層執行入口就可以了,完整代碼如下

from loguru import logger

from glom import glom


def parse(result, rules):

    def _pack_json(result, rules):
        item = {}

        for p_rule in rules:

            if p_rule.get("$value_type") == "raw":
                if p_rule.get("$parse_method") == "json":
                    item[p_rule.get("$name")] = glom(result, p_rule.get("$parse_rule"))

            elif p_rule.get("$value_type") == "recursion":
                if p_rule.get("$parse_method") == "json":
                    tmp_result = glom(result, p_rule.get("$parse_rule"))
                    total_result = []
                    for per_r in tmp_result:
                        total_result.append(_pack_json(per_r, p_rule.get("$each")))
                    item[p_rule.get("$name")] = total_result
        return item

    def _unpack_datas(result: dict) -> list:
        if "__datas__" not in result:
            return [result]

        item_results = []
        all_item = result.pop("__datas__")

        for per_item in all_item:
            if "__datas__" in per_item:
                tmp_datas = per_item.pop("__datas__")
                for per_tmp_data in tmp_datas:
                    tmp_item = _unpack_datas(per_tmp_data)
                    for per_tmp_item in tmp_item:
                        item_results.append({**per_tmp_item, **per_item})
            else:
                item_results.append({**result, **per_item})

        return item_results

    pack_result = _pack_json(result, rules)
    logger.info(pack_result)
    return _unpack_datas(pack_result)

以上,就是通用解析器的完整案例。案例中僅實現了對于 json 的支持,小伙伴可以基于自己的項目,改造成其他的解析形式。通用解析其實是雞仔為了偷懶寫的,因為雞仔發現,在爬蟲開發中,大部分工作都耗在解析這部分。而有了通用解析的前端頁面,運營和數據分析師就可以根據自己的需要配置自己想爬取的站點了。人生苦短,你懂得。我去摸魚了~

實現方式請移步至 github 查看:https://github.com/hacksman/learn_lab/blob/master/small_bug_lab/general_parser.py

以上就是python 用遞歸實現通用爬蟲解析器的詳細內容,更多關于python 遞歸實現爬蟲解析器的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python爬蟲之爬取2020女團選秀數據
  • python爬蟲之教你如何爬取地理數據
  • Python爬蟲之教你利用Scrapy爬取圖片
  • 基于python分布式爬蟲并解決假死的問題
  • python PyQt5 爬蟲實現代碼
  • 用python爬蟲爬取CSDN博主信息
  • 利用Python網絡爬蟲爬取各大音樂評論的代碼
  • Python爬蟲部分開篇概念講解
  • python爬蟲之你好,李煥英電影票房數據分析

標簽:呼和浩特 衡水 江蘇 畢節 股票 湖州 駐馬店 中山

巨人網絡通訊聲明:本文標題《python 用遞歸實現通用爬蟲解析器》,本文關鍵詞  python,用,遞歸,實現,通用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python 用遞歸實現通用爬蟲解析器》相關的同類信息!
  • 本頁收集關于python 用遞歸實現通用爬蟲解析器的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲图片欧美一区| 日韩视频免费观看高清完整版在线观看 | 成人影视亚洲图片在线| 欧美日韩成人一区二区| 三级一区在线视频先锋| 欧美成人猛片aaaaaaa| 精品一二三四区| 欧美激情资源网| 日欧美一区二区| 国产69精品久久777的优势| 国产精品99久久久久久宅男| 久久久精品tv| 国产老女人精品毛片久久| 日本一区二区视频在线观看| 成人av电影在线网| 成人免费视频在线观看| 成人av在线观| 亚洲一级不卡视频| 日韩一级片在线观看| 成人一区二区三区视频在线观看| 亚洲资源在线观看| 91精品国产综合久久精品图片| 久久成人av少妇免费| 1024亚洲合集| 精品久久久久香蕉网| 99久久久久久99| 丝袜脚交一区二区| 国产日韩欧美麻豆| 欧美一区二区黄色| 色狠狠综合天天综合综合| 麻豆精品久久久| 中文字幕欧美一| 亚洲精品在线观看视频| 久久久www免费人成精品| 日本亚洲电影天堂| 一区二区三区蜜桃| 99久久综合精品| 亚洲成人三级小说| 欧美日韩成人综合在线一区二区| 日韩中文欧美在线| 久久久久久免费网| 成人h动漫精品| 国产成人综合在线观看| 欧美电影精品一区二区| 色综合色综合色综合色综合色综合| 香蕉久久夜色精品国产使用方法 | 日韩理论片一区二区| 欧美成人video| 欧美精品第1页| 欧美三级视频在线| 成人综合在线视频| 国产成人午夜高潮毛片| 蜜桃av噜噜一区二区三区小说| 亚洲一区二区三区在线播放| 一区二区三区电影在线播| 国产精品久久久久久久久搜平片| 久久久久久久久久久久久久久99| 国产日韩三级在线| 久久综合久久鬼色| 久久久亚洲国产美女国产盗摄| 欧美一区二区三区成人| 欧美精品 国产精品| 欧美美女网站色| 欧美日韩不卡视频| 欧美一级二级三级蜜桃| 91精品国产91久久久久久最新毛片 | jlzzjlzz欧美大全| 成人福利视频在线| 91精品久久久久久久99蜜桃 | 欧美专区亚洲专区| 紧缚奴在线一区二区三区| 免费欧美日韩国产三级电影| 国产一区二区日韩精品| 成人影视亚洲图片在线| 欧美日韩国产精品自在自线| 国产精品久久99| 国产精品自拍在线| 日韩精品三区四区| 国模套图日韩精品一区二区| 国产真实乱偷精品视频免| 国产经典欧美精品| 色婷婷久久综合| 欧美午夜精品免费| 日韩一区二区三区av| 精品日韩av一区二区| 国产精品视频在线看| 亚洲综合一区二区三区| 久久精品国内一区二区三区| 丁香桃色午夜亚洲一区二区三区| av在线不卡观看免费观看| 日韩三级.com| 国产精品日韩成人| 日韩高清电影一区| 波多野结衣一区二区三区 | 欧美一级黄色大片| 欧美激情一区不卡| 午夜视频久久久久久| 国产精品1区二区.| 欧美日韩黄色一区二区| 久久你懂得1024| 五月天欧美精品| 成人免费黄色大片| 欧美精品乱码久久久久久| 欧美韩国日本不卡| 久久精品国产一区二区| 欧美性生活久久| 国产精品久久看| 久久国产剧场电影| 欧美疯狂做受xxxx富婆| 亚洲欧美一区二区久久| 国产精品香蕉一区二区三区| 欧美日韩一区二区三区高清| 亚洲视频 欧洲视频| 日韩一区二区在线观看视频播放| 久久久久国产精品厨房| 精品国产免费一区二区三区香蕉| 捆绑调教一区二区三区| 久久久久久久久免费| 成人高清视频在线| 一区二区三区自拍| 久久久久久久电影| 欧美精品一卡两卡| 成人午夜精品一区二区三区| 国产做a爰片久久毛片| 91视频精品在这里| 成人av电影免费观看| 欧美精品一区二区三区久久久| 一个色综合av| 精品成人a区在线观看| 日日嗨av一区二区三区四区| 欧美专区日韩专区| 亚洲精品成人少妇| 在线免费不卡视频| 亚洲乱码国产乱码精品精小说 | 午夜精彩视频在线观看不卡| 日本精品免费观看高清观看| 亚洲欧洲三级电影| 99re成人精品视频| 一区二区三区精品在线观看| 在线观看网站黄不卡| 午夜精品123| 欧美不卡激情三级在线观看| 国产一区二区三区在线观看免费视频 | 欧美一卡在线观看| 蜜臀av在线播放一区二区三区| 91精品国产91久久久久久一区二区 | 日韩欧美专区在线| 激情综合亚洲精品| 国产日本欧洲亚洲| 热久久久久久久| 国产欧美综合在线| 在线观看亚洲一区| 蜜臀av一级做a爰片久久| 久久精品在这里| 色哦色哦哦色天天综合| 日本一区二区免费在线观看视频 | 狠狠狠色丁香婷婷综合久久五月| 亚洲色图制服丝袜| 亚洲一区二区欧美| 九色|91porny| 在线播放国产精品二区一二区四区| 日韩久久免费av| 一区二区三区日韩精品| 另类小说图片综合网| 97国产一区二区| 欧美sm极限捆绑bd| 成人精品亚洲人成在线| 日韩久久一区二区| 91麻豆精品国产自产在线| 国内精品免费在线观看| 亚洲精品自拍动漫在线| 中文字幕一区二区在线播放| 在线中文字幕一区| 国产激情一区二区三区四区| 亚洲午夜久久久久久久久久久 | 日本一区二区三区视频视频| 色天使色偷偷av一区二区| 久久99国产精品久久| 一区二区三区四区不卡在线| 精品久久久久久久人人人人传媒 | 一本色道久久加勒比精品 | 激情文学综合丁香| 亚洲裸体在线观看| 久久久亚洲国产美女国产盗摄 | 欧美日韩成人综合| 成人av在线影院| 国产一区二区三区在线观看免费 | 成人a区在线观看| 九九精品视频在线看| 亚洲高清在线精品| 国产精品不卡在线观看| www国产精品av| 欧美三区在线观看| 色综合中文字幕国产| 日本欧美在线观看| 亚洲夂夂婷婷色拍ww47| 日韩理论片在线| 亚洲人成在线观看一区二区| 久久久久久久av麻豆果冻| 日韩免费成人网|