要在手機或者電腦看到更好的圖片或代碼歡迎到博文原地址。也歡迎到博文原地址批評指正。
??????????????????????????????
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。
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。 祝大家國慶節快樂~!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答