亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

一個簡單的開源PHP爬蟲框架『Phpfetcher』

2020-03-22 18:55:45
字體:
來源:轉載
供稿:網友
這篇文章首發在吹水小鎮:http://blog.reetsee.com/archives/366

要在手機或者電腦看到更好的圖片或代碼歡迎到博文原地址。也歡迎到博文原地址批評指正。

??????????????????????????????


好久不見了!我終于又寫一篇日志了,本來有很多流水帳想發但是感覺沒營養,就作罷了。今天我主要分享一個簡單的PHP爬蟲框架,名字叫: Phpfetcher 項目的地址是:https://github.com/fanfank/phpfetcher這個框架的作者是:reetsee.xu,即吹水。把整個項目下載下來后,在Linux下的終端直接執行 demo文件夾下的single_page.php即可看到效果。不過在執行demo文件前,先設置一下你的終端編碼為UTF-8以免顯示亂碼:
export LANG=en_US.UTF-8
???????????????????????????????? 0 背景 背景是這樣的目前 吹水新聞( http://news.reetsee.com)下的內容全部由Python的爬蟲抓取,使用的框架是Python的 Scrapy,而吹水新聞目前是運行在 BAE(百度應用引擎)下的,每個月還需要交錢。目前我的想法是把吹水新聞完全遷移到目前這臺阿里云主機上,并且原本的新聞我每天都手動執行一次腳本來抓取再更新到網站,等遷移到這里后就能直接使用Crontab定時腳本自動更新新聞了!最近工作都在用 PHP,開發網站的新頁面要PHP,直接讀寫數據庫也能用PHP,那么就直接用PHP重構新聞網站好了。準備開干的時候卻發現沒找到一個好的PHP爬蟲框架(可能是我沒仔細找),于是就打算自己寫一個,因此就有了這個Phpfetcher。名字起得略好……但是代碼寫得略搓……不管怎么樣,目前基本可以用,而且應該能滿足不少簡單的需求,下面就是使用示例。 1 基本概念 在Phpfetcher中有四個主要的對象,依次是:Dom,Page,Crawler,Manager。
  • Dom對象用來解析html,能夠訪問html里的dom;
  • Page對象對應到一個具體的html頁面,能夠取得整個網頁的內容,Page對象中有一個Dom對象的成員;
  • Crawler對象可以理解為就是爬蟲對象,用來設置要爬取頁面的規則;
  • Manager對象原本是用來管理Crawler對象的,以后或許能用來在多進程環境下使用,但目前沒有實現,所以暫時沒有用;
  • 大致概念就是這樣了,實際使用主要是操作Crawler對象。在Phpfetcher中,你可以實現自己的Dom,Page和Crawler,只要符合基類的要求即可。要說明的是Phpfetcher的默認Page對象中的Dom對象使用的是 simple_html_dom,沒有使用PHP提供的 DOMDocument類,因為我發現DOMDocument對HTML格式的內容兼容比較差,有時網頁中混入其它內容時可能解析不出dom。下面這張是圖是Phpfetcher的目錄結構: 你可以根據自己的需要定制想要的Crawler,Page,Dom類,默認情況下我提供了Crawler的默認類是Phpfetcher_Crawler_Default,Page的默認類是Phpfetcher_Page_Default,Dom的默認類是Phpfetcher_Dom_SimpleHtmlDom。類名和它們所在的路徑有對應關系。要注意的是, 在使用默認的Page對象時需要PHP的curl庫,使用默認的Crawler對象時需要使用PHP的mb_string庫,沒有的需要裝一下。為了便于理解,我畫了幾張圖,第一張是Phpfetcher的三個主要對象之間的關系: 圖里表示的是Crawler里面有Page的對象,Page里面有Dom的對象。在使用Phpfetcher時,最重要的是完成下圖中兩個綠色矩形框要求的事情: 即你要寫一個類繼承Phpfetcher提供的Crawler類,然后在你自己的類中實現一個名為handlePage($page)的函數。其中$page參數是一個Phpfetcher的Page類對象。最后這里給出一個基本的流程圖: 上面說的東西有點虛,那還是直接看實例吧! 2 簡單例子 ****** 實例1:single_page.php ******例如我們要抓取這個網站的內容: http://news.qq.com/a/20140927/026557.htm里面有很多超鏈接,有標題,有新聞詳細內容,或者其它我們關心的內容。先看一下下面的例子:
    sel('//title');        for ($i = 0; $i < count($res); ++$i) {            echo $res[$i]->plaintext;            echo "/n";        }    }}$crawler = new mycrawler();$arrJobs = array(    //任務的名字隨便起,這里把名字叫qqnews    //the key is the name of a job, here names it qqnews    'qqnews' => array(         'start_page' => 'http://news.qq.com/a/20140927/026557.htm', //起始網頁        'link_rules' => array(            /*             * 所有在這里列出的正則規則,只要能匹配到超鏈接,那么那條爬蟲就會爬到那條超鏈接             * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches             */        ),        //爬蟲從開始頁面算起,最多爬取的深度,設置為1表示只爬取起始頁面        //Crawler's max following depth, 1 stands for only crawl the start page        'max_depth' => 1,             ) ,   );//$crawler->setFetchJobs($arrJobs)->run(); 這一行的效果和下面兩行的效果一樣$crawler->setFetchJobs($arrJobs);$crawler->run();
    將這個腳本和“phpfetcher.php”以及“Phpfetcher”文件夾放在同一個目錄下(或者將“phpfetcher.php”和“Phpfetcher”放到你的PHP環境默認include的查找路徑),執行這個腳本,得到的輸出如下:
    [root@reetsee demo]# php single_page.php 王思聰回應遭警方調查:帶弓箭不犯法 我是綠箭俠_新聞_騰訊網
    查看一下我們抓取的網頁源代碼,可以發現是下面這幾行中的title標簽內容提取出來了:
                                            王思聰回應遭警方調查:帶弓箭不犯法 我是綠箭俠_新聞_騰訊網        
    上面就是一個最簡單的例子。 ****** 實例2:multi_page.php ******接下來就是另外一個簡單的例子,例如說騰訊新聞的主頁,上面有各種新聞,我們這次的目標是把騰訊新聞主頁( http://news.qq.com)顯示的部分新聞標題抓下來,直接先上例程:
    sel('//h1', 0)->plaintext);        if (!empty($strFirstH1)) {            echo $page->sel('//h1', 0)->plaintext;            echo "/n";        }    }}$crawler = new mycrawler();$arrJobs = array(    //任務的名字隨便起,這里把名字叫qqnews    //the key is the name of a job, here names it qqnews    'qqnews' => array(         'start_page' => 'http://news.qq.com', //起始網頁        'link_rules' => array(            /*             * 所有在這里列出的正則規則,只要能匹配到超鏈接,那么那條爬蟲就會爬到那條超鏈接             * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches             */            '#news/.qq/.com/a//d+//d+/.htm$#',        ),        //爬蟲從開始頁面算起,最多爬取的深度,設置為2表示爬取深度為1        //Crawler's max following depth, 1 stands for only crawl the start page        'max_depth' => 2,             ) ,   );$crawler->setFetchJobs($arrJobs)->run(); //這一行的效果和下面兩行的效果一樣//$crawler->setFetchJobs($arrJobs);//$crawler->run();
    相比于第1個例子,變化的地方有幾個:首先這次我們增加了一條爬蟲跟蹤的規則“#news/.qq/.com/a//d+//d+/.htm$#”(注:PHP使用pcre正則表達式,可以到 PHP關于正則表達式的頁面看一下),這是一個正則表達式,例如這種超鏈接“news.qq.com/a/12345678/00234.htm”那么爬蟲就會跟蹤;然后是我們把爬蟲的最大跟蹤深度設置為2,這樣爬蟲會跟蹤1次起始頁面上符合要求的超級鏈接;最后是我把原本的Dom選擇從“//title”改為了“//h1”,意思就是抓取h1標簽的內容而不是像之前那樣抓取title標簽,想知道這種Dom選擇器的選擇規則,需要了解一下 xpath。運行這個文件,能夠看到大致效果如下: 這樣第二個例子就結束了。暫時我就介紹這兩個例子吧,Phpfetcher的源代碼在這里: https://github.com/fanfank/phpfetcher把代碼下載下來后,demo內的東西就可以直接運行了(當然你需要一個有curl和mb_string擴展的php,可以使用“php -m”命令來看一下你的PHP有沒有裝這兩個擴展)。 3 后話 實際上這個phpfetcher目前還有很多問題,性能應該是比較差的,不過畢竟也是我寫的第一個框架。另外是關于phpfetcher我有很多東西還沒有提到,例如Page對象的一些設置,Crawler對象的設置等,主要是目前太過懶不想寫文檔,也不知道有沒有必要寫。我感覺這個框架還是蠻簡單的,里面主要的函數我都做了詳細的注釋,歡迎閱讀批評指正給建議!最后就是,如果你想寫個爬蟲,又想用PHP來寫,不妨試一下phpfetcher。 祝大家國慶節快樂~!

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲第一中文字幕在线观看| 日本不卡免费高清视频| 久久99精品久久久久久琪琪| 国产激情999| 日韩成人av在线播放| 亚洲国产日韩精品在线| 国产精品av免费在线观看| 国产精品久久国产精品99gif| 欧美性一区二区三区| 国产日韩欧美日韩大片| 成人免费大片黄在线播放| 国产精品香蕉av| 欧美国产日产韩国视频| 国产精品第3页| 97人洗澡人人免费公开视频碰碰碰| 95av在线视频| 欧美日韩aaaa| 国产欧美一区二区三区久久| 日本一区二区三区在线播放| 久久久av电影| 亚洲成人网av| 日韩精品极品视频免费观看| 欧美激情啊啊啊| 日韩精品免费在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 97视频在线观看播放| 亚洲美女av网站| 日韩电影中文 亚洲精品乱码| 亚洲国产精品专区久久| 91亚洲精品在线| 欧美性猛交xxxx黑人| 爽爽爽爽爽爽爽成人免费观看| 精品香蕉在线观看视频一| 91中文精品字幕在线视频| 一区二区三区日韩在线| 欧美第一页在线| 欧美亚洲另类视频| 欧美第一黄网免费网站| 国产精品96久久久久久又黄又硬| 国产精品亚洲一区二区三区| 久久香蕉国产线看观看av| 亚洲第一页自拍| 亚洲精品电影网在线观看| 亚洲一区二区在线| 亚洲国产欧美日韩精品| www国产精品com| 久久亚洲国产精品| 91美女高潮出水| 亚洲欧美在线第一页| 国产成人在线一区| 日韩欧美中文字幕在线播放| 精品女同一区二区三区在线播放| 亚洲成人三级在线| 91九色国产在线| 91精品国产自产在线| 2020欧美日韩在线视频| 久久精品视频在线| 成人激情视频小说免费下载| 日韩中文字幕亚洲| 国产精品亚洲美女av网站| 日韩精品免费电影| 欧美亚洲另类激情另类| 久久久国产一区二区| 亚洲成人久久久久| 欧美高清视频免费观看| 成人免费在线视频网站| 热99精品里视频精品| 亚洲精品永久免费精品| 日本高清+成人网在线观看| 国产精品一区二区三区成人| 欧美精品日韩三级| 国产精品爽黄69天堂a| 97视频网站入口| 成年无码av片在线| 日本国产精品视频| 日本高清+成人网在线观看| 最近免费中文字幕视频2019| 北条麻妃一区二区在线观看| 久久久精品国产网站| 久久精品一区中文字幕| 国产精品免费福利| 国产91露脸中文字幕在线| 亚洲欧洲中文天堂| 国产一区二区三区三区在线观看| 91欧美日韩一区| 国产精品永久免费在线| 欧美国产日韩一区二区| 日本三级韩国三级久久| 神马久久桃色视频| 国产视频精品久久久| 九九热r在线视频精品| 国产成人高潮免费观看精品| 欧美性猛交xxxx乱大交蜜桃| 九九热视频这里只有精品| 欧美成人免费全部观看天天性色| 在线视频中文亚洲| 97在线视频一区| 欧美激情免费观看| 国产精品亚洲美女av网站| 亚洲tv在线观看| 一本色道久久88亚洲综合88| 欧美视频中文在线看| 法国裸体一区二区| 日本一区二区三区四区视频| 国产日韩精品在线观看| 一区二区三区www| 欧美午夜精品久久久久久久| 国产精品欧美久久久| 亚洲第一福利网| 日韩欧美亚洲综合| 91精品啪在线观看麻豆免费| 欧美体内谢she精2性欧美| 久久视频在线免费观看| 亚洲级视频在线观看免费1级| 最近2019中文字幕mv免费看| 亚洲男人的天堂网站| 国产精品久久久久久久久久久久| 日韩av在线一区| 国产成人精品a视频一区www| 国产精品久久久久久久7电影| 91精品综合久久久久久五月天| 欧美另类暴力丝袜| 国产精品综合久久久| 91在线网站视频| 性欧美在线看片a免费观看| 高潮白浆女日韩av免费看| 国产ts人妖一区二区三区| 亚洲欧美日韩精品久久| 国产成人a亚洲精品| 亚洲精品xxx| 日韩中文字幕亚洲| 精品国产依人香蕉在线精品| 日韩av电影在线播放| 亚洲精品美女在线观看播放| 久国内精品在线| 狠狠操狠狠色综合网| 久久的精品视频| 日韩成人黄色av| 精品国产一区二区三区久久| 国产亚洲成av人片在线观看桃| 久久久精品免费| 欧美成人激情视频| 少妇久久久久久| 日韩一区二区三区国产| 国产日韩在线一区| 色偷偷偷亚洲综合网另类| 久久精品99国产精品酒店日本| 久久久久久中文字幕| 亚洲精品国产欧美| 久久男人av资源网站| 91精品久久久久久久久久久久久久| 欧美日韩免费在线观看| 亚洲精品成人久久| 亚洲精品福利资源站| 日韩欧美国产一区二区| 国产精品av网站| 日韩一区二区久久久| 亚洲福利视频二区| 最新91在线视频| 麻豆国产精品va在线观看不卡| 欧美精品在线极品| 日韩午夜在线视频| 国产精品一区久久| 国产91色在线播放|