成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

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

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

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

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

需求分析

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

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

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

進一步分析

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

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

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

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

{
    "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 層,我建議你直接跟老板提放棄這個網頁吧!

再進一步分析

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

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

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

[
 {
  "$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 的解析規(guī)則,如果要拿來解析 html 對象呢?很簡單,將解析方式改為 xpath 對象,然后傳入 xpath 解析語法即可。

代碼實現

總共分成兩部分,一部分根據原最終結果和規(guī)則進行打包,將所有涉及 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

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

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

實現方式請移步至 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爬蟲之你好,李煥英電影票房數據分析

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

巨人網絡通訊聲明:本文標題《python 用遞歸實現通用爬蟲解析器》,本文關鍵詞  python,用,遞歸,實現,通用,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python 用遞歸實現通用爬蟲解析器》相關的同類信息!
  • 本頁收集關于python 用遞歸實現通用爬蟲解析器的相關信息資訊供網民參考!
  • 推薦文章
    高清在线视频日韩欧美| 久热中文字幕精品视频在线| 免费在线观看一级毛片| 超碰免费在线公开| 精品成av人一区二区三区| 在线免费观看国产精品| 国产av人人夜夜澡人人爽麻豆| 男女视频网站在线观看| 偷拍与自拍一区| 亚洲av综合色区| 精品久久久久久最新网址| 不卡av在线网| 国产欧美日韩网站| 嫩草av久久伊人妇女超级a| 波波电影院一区二区三区| 精品无码久久久久| 日本黄色一级视频| 成人在线观看网站| a√在线视频| 成人性生交大片免费看中文| 国产区一区二区三区| 一区二区三区不卡视频在线观看| 久久露脸国语精品国产91| 日韩精品最新在线观看| 男人插曲女人视频免费| 国产一区二区三区四| 性欧美freesex顶级少妇| 国产免费一区二区三区在线能观看| 青檬在线电视剧在线观看| 五月婷婷开心综合| 污视频网站在线免费观看| 日韩免费黄色片| 免费久久久久久| 激情亚洲另类图片区小说区| 男人av在线播放| 视频在线这里都是精品| 久99久在线视频| 三级外国片在线观看视频| 免费成人在线网站| 午夜无码国产理论在线| 91免费看片网站| 亚洲成人影院少妇| 亚洲在线观看免费视频| 男人天堂av网| 欧美高清视频一二三区| 免费看黄在线看| 美腿丝袜亚洲色图| 九九热播视频在线精品6| 国产h色视频在线观看| 免费黄色片网站| 免费看黄色网| 青青草娱乐在线| 亚洲精品乱码久久久久久日本蜜臀| 精品人妻一区二区三| 国产精品视频二区三区| 亚洲国产精华液网站w| 久久精品中文| 国产剧情演绎av| 日韩国产在线观看一区| 欧美电影免费观看高清| 男人插曲女人的视频| 日韩.com| 亚洲福利精品在线| 久久久精品五月天| 日韩欧美黄色网址| 欧美人与禽zozo性伦| 亚洲36d大奶网| 久久久一本精品| 自拍偷拍第9页| 1234区在线观看视频免费| 欧美高清免费| av在线电影院| 超碰在线免费av| 超碰在线免费播放| 国内精品不卡一区二区三区| 97精品国产| 一区二区三区日韩欧美精品| 日本成人超碰在线观看| 国产高清不卡av| 国产a视频精品免费观看| 俺去俺来也在线www色官网| 香蕉伊大人中文在线观看| 这里只有精品6| 欧美精品日韩精品| 日韩亚洲色图| 日韩一区二区在线看片| 蜜桃网站在线观看| 日韩欧美中文字幕一区二区| 亚欧精品在线视频| 丁香五月缴情综合网| 一区二区三区欧美亚洲| 欧美第一淫aaasss性| 国产免费av电影| 亚洲精品一区二区三区蜜桃久| 国产乱人伦真实精品视频| 中文字幕观看av| 搡老女人一区二区三区视频tv| av片在线免费| 综合亚洲深深色噜噜狠狠网站| 在线毛片观看| 欧美精品少妇一区二区三区| 男男h黄动漫啪啪无遮挡软件| 久久精品aaaaaa毛片| 欧美精品电影免费在线观看| 久久久久久艹| 国产亚洲美女精品久久久| 亚洲第一二区| 亚洲性猛交富婆| 久久这里只有精品1| 欧美成人黄色网| 高清美女视频一区| 91在线免费网站| 亚洲激情免费视频| 欧美成人国产一区二区| 国产精品久久久久一区二区三区共| 欧美激情精品久久久久久黑人| 国产精品chinese在线观看| 精品一区二区三区高清免费不卡| 一区二区三区精品99久久| 日本在线高清视频一区| 鲁大师私人影院在线观看| 久久久噜噜噜久噜久久综合| 色综合色综合网色综合| 深夜福利小视频| 青青草原av在线| 亚洲精品**中文毛片| 国产爆初菊在线观看免费视频网站| 精品伊人久久久久7777人| 99九九热只有国产精品| 国产成人精品av在线| 秘密基地免费观看完整版中文| 久久人人爽av| 日韩中文字幕亚洲一区二区va在线| 九九热在线视频观看| av亚洲精华国产精华精| 精品视频亚洲| 欧美va在线播放| 欧美孕妇性xxxⅹ精品hd| 亚洲一区在线免费| 久久精品久久99精品久久| 中文字幕中文乱码欧美一区二区| 天天摸天天做天天爽水多| 91精品久久久| 欧美三级午夜理伦三级小说| 婷婷激情5月天| 亚洲天堂久久久久久久| 人人妻人人澡人人爽久久av| 免费女人毛片视频| 国产免费黄视频在线观看| www.99re7.com| 国产精品igao视频网网址不卡日韩| 久久成人人人人精品欧| 国产成人av一区二区三区在线观看| 日韩二区三区在线观看| 韩国精品一区二区三区| 国产1区2区3区精品美女| 日韩av三级在线| 97国产精东麻豆人妻电影| 99精品久久久| 成品网站w灬+源码1| 无码人妻精品一区二区三区99v| 国色天香久久精品国产一区| 国产精品一区二区91| 中文字幕一区二区av| 亚洲三区在线| 亚洲精品国产一区二区在线| 亚洲图片小说网| 在线观看免费视频污| 乳奴隷乳フ辱julia在线观看| 天天看天天摸天天操| www.日韩在线观看| 日韩深夜福利网站| 久久久国产一区二区三区四区小说| 亚洲欧美日韩不卡一区二区三区| 日本福利片免费看| 亚洲性生活视频在线观看| 欧美成人精品欧美一级| 亚洲一区日本| av日韩一区| 欧美电影免费观看高清完整| 免费看一区二区三区| 日韩精品成人一区二区在线观看| 日韩三级在线播放| 欧美一级午夜免费电影| 欧美丝袜在线观看| 国产精品视频一区二区图片| 特级西西444www大精品视频| 中文字幕不卡av| 欧美激情精品久久久六区热门| 97人人澡人人爽91综合色| 国产免费一区| 欧美久久香蕉| 国产精彩视频在线观看免费蜜芽| 中文亚洲av片在线观看| 成人免费网视频| 26uuu另类亚洲欧美日本老年| 人交獸av完整版在线观看| 成人久久久久久久| 日本系列欧美系列| 色悠悠久久综合网| 久久综合99re88久久爱| 国产一区在线观看麻豆| 国产中文字幕视频在线观看| 狠狠色噜噜狠狠狠狠97| 美腿丝袜亚洲一区| 久久精品视频免费播放| 伊人网av在线| 国产69久久精品成人看| 欧美在线一区二区三区四区| 中文字幕在线看精品乱码| 国产精品稀缺呦系列在线| 久久av老司机精品网站导航| 欧美成人3dxxxx| 99免费在线观看视频| 国产一区二区你懂的| 中文字幕免费高清在线观看| 宅男在线精品国产免费观看| 精选一区二区三区四区五区| 午夜精品一区二区三区在线视频| mm131丰满少妇人体欣赏图| 五月激情久久久| 免费人成在线不卡| 91桃色在线| www.日韩在线观看| 日韩国产欧美精品一区二区三区| 夫妻免费无码v看片| 欧美老年两性高潮| 日韩av懂色| 国产精品福利一区| 国产一区二区三区视频播放| 麻豆明星ai换脸视频| 亚洲成人福利在线观看| 久久人人爽人人爽人人| 九一九一国产精品| www激情久久| 老**午夜毛片一区二区三区| 国产日韩二区| 日本a级片免费| 在线观看免费看片| 久久撸在线视频| 日本高清不卡在线观看| 欧美成aaa人片免费看| 亚洲国产日韩欧美一区二区三区| 午夜在线免费视频| 91看片淫黄大片91| 久久无码人妻一区二区三区| 精品国产精品国产偷麻豆| 91丨九色丨国产| 久久久一区二区| 新狼窝色av性久久久久久| 91高潮大合集爽到抽搐| www亚洲国产| 亚洲免费网站在线观看| 欧美熟女一区二区| jizzjizz少妇亚洲水多| 欧美激情免费看| 国产男女猛烈无遮挡a片漫画| 精品国产人妻一区二区三区| 国产福利一区二区在线精品| 菠萝蜜视频国产在线播放| 日韩欧美在线网站| 精品人妻一区二区三区换脸明星| 91l九色lporny| 日韩超碰人人爽人人做人人添| 欧美一级视频一区二区| 国产一区二区三区中文字幕| 日日夜夜视频| 成人免费视频一区| 一区二区视频免费看| 成人网视频在线观看| 最近中文字幕mv2018在线高清| 国产精品一 二 三| 日本高清视频在线播放| 国产中文字幕亚洲| www.四虎成人| 欧美xxxx性猛交bbbb| 国产精品v片在线观看不卡| 日韩视频第二页| 国产精品视频免费观看www| 欧美国产日韩免费| 一区二区三区视频在线播放| 色哟哟一区二区在线观看| 一区二区三区在线观看免费| 99在线免费观看视频| 欧美性感美女一区二区| 亚洲调教一区| 国产91精品高潮白浆喷水| 色网综合在线观看| 精品一区在线| 在线观看免费视频一区| 伊人久久久久久久久久久久久| 亚洲美女区一区| 蜜臀av性久久久久蜜臀aⅴ| 免费在线观看黄色小视频| 搞黄在线观看| 国产永久精品大片wwwapp| 亚洲欧美国产精品| 亚洲美女色视频| 三上悠亚一区二区三区| 久久91超碰青草是什么| 国产调教打屁股xxxx网站| 成人精品一区| 久久综合一区| 日本卡一卡2卡3卡4精品卡网站| 国产人妻精品久久久久野外| 日本精品一区在线| 久久午夜免费视频| 亚洲欧美另类图片小说| 国内福利写真片视频在线| 久久免费高清| 欧洲国产伦久久久久久久| 九色自拍视频在线观看| 欧美一级黄色录像片| 少妇久久久久久| www.青草| 波多野结衣视频一区二区| 99久久精品一区二区成人| 国产欧美日韩在线观看视频| 成年人午夜久久久| 欧美亚洲午夜视频在线观看| av剧情在线观看| 国产精品美日韩| 中午字幕在线观看| 日韩欧美国产成人一区二区| 国产经典自拍视频在线观看| 日本一区二区不卡在线| 98视频精品全部国产| 超碰福利在线观看|