整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          php采集網(wǎng)頁數(shù)據(jù)(php采集類)

          php采集網(wǎng)頁數(shù)據(jù)(php采集類)

          、概述

          在進(jìn)行網(wǎng)頁數(shù)據(jù)采集時(shí),PHP是一種常用的語言,它提供了多種設(shè)置方式來實(shí)現(xiàn)采集功能。本文將對(duì)這些設(shè)置方式進(jìn)行評(píng)測(cè)和比較,以幫助讀者選擇最適合自己需求的方式。

          二、使用cURL庫

          cURL是一個(gè)強(qiáng)大的開源庫,可以實(shí)現(xiàn)各種網(wǎng)絡(luò)通信功能。在PHP中,通過cURL庫可以方便地進(jìn)行網(wǎng)頁數(shù)據(jù)的采集。使用cURL庫的優(yōu)點(diǎn)是操作靈活,可以模擬用戶行為,支持多線程,并且對(duì)于反爬蟲機(jī)制有一定的應(yīng)對(duì)能力。然而,使用cURL庫需要具備一定的網(wǎng)絡(luò)編程知識(shí),并且代碼量相對(duì)較多。

          三、使用file_get_contents函數(shù)

          file_get_contents函數(shù)是PHP提供的一個(gè)簡單易用的文件讀取函數(shù),在采集網(wǎng)頁數(shù)據(jù)時(shí)也可以使用該函數(shù)。它的優(yōu)點(diǎn)是代碼簡潔、易于理解和維護(hù),適合簡單的數(shù)據(jù)采集任務(wù)。然而,file_get_contents函數(shù)無法處理需要登錄或帶有反爬蟲機(jī)制的網(wǎng)站。

          四、使用第三方庫Guzzle

          Guzzle是一個(gè)流行的PHP HTTP客戶端庫,提供了豐富的功能和易用的接口。它支持并發(fā)請(qǐng)求、重試機(jī)制、cookie管理等特性,非常適合進(jìn)行網(wǎng)頁數(shù)據(jù)采集。使用Guzzle的優(yōu)點(diǎn)是可以快速實(shí)現(xiàn)功能,代碼清晰易讀。但是,由于Guzzle是一個(gè)第三方庫,需要額外安裝和配置。

          五、使用第三方工具Selenium

          Selenium是一個(gè)自動(dòng)化測(cè)試工具,也可以用于網(wǎng)頁數(shù)據(jù)采集。它可以模擬瀏覽器行為,支持JavaScript渲染,適應(yīng)復(fù)雜頁面的采集。使用Selenium的優(yōu)點(diǎn)是功能強(qiáng)大,適用于各種場(chǎng)景,并且有大量的學(xué)習(xí)資源可供參考。但是,相比其他方式,使用Selenium需要額外安裝瀏覽器驅(qū)動(dòng)程序,并且對(duì)系統(tǒng)資源消耗較大。

          六、使用PhantomJS

          PhantomJS是一個(gè)無界面的瀏覽器引擎,可以實(shí)現(xiàn)網(wǎng)頁截圖、頁面渲染等功能。在進(jìn)行網(wǎng)頁數(shù)據(jù)采集時(shí),也可以利用PhantomJS來獲取網(wǎng)頁內(nèi)容。PhantomJS的優(yōu)點(diǎn)是操作簡單,支持多種語言調(diào)用,并且對(duì)JavaScript渲染有很好的支持。然而,PhantomJS已經(jīng)停止維護(hù),并且在部分情況下可能存在性能問題。

          七、比較與選擇

          根據(jù)不同的需求和場(chǎng)景,選擇合適的PHP設(shè)置方式是很重要的。如果需要靈活的操作和對(duì)抗反爬蟲機(jī)制,可以選擇使用cURL庫;如果只是進(jìn)行簡單的數(shù)據(jù)采集,可以考慮使用file_get_contents函數(shù);如果需要更多功能和易用性,可以嘗試使用Guzzle或Selenium;如果對(duì)性能要求較高,可以考慮使用PhantomJS。綜合考慮各種因素,選擇最適合自己需求的設(shè)置方式。

          八、總結(jié)

          本文對(duì)PHP采集文章的設(shè)置方式進(jìn)行了評(píng)測(cè)和比較,介紹了cURL庫、file_get_contents函數(shù)、Guzzle、Selenium和PhantomJS等幾種常用方式。根據(jù)不同的需求和場(chǎng)景,讀者可以選擇最適合自己的設(shè)置方式來實(shí)現(xiàn)網(wǎng)頁數(shù)據(jù)采集。希望本文對(duì)讀者在PHP采集文章方面有所幫助。

          為一名資深網(wǎng)絡(luò)編輯,我一直以來都非常關(guān)注著網(wǎng)絡(luò)內(nèi)容的質(zhì)量和采集規(guī)則。近日,我有幸采訪到了業(yè)界著名的 PHP 編程專家小李,并向他請(qǐng)教了關(guān)于 PHP 文章采集規(guī)則的實(shí)用技巧。在這篇文章中,我將與大家分享這些寶貴的經(jīng)驗(yàn)和建議。

          1.了解目標(biāo)網(wǎng)站結(jié)構(gòu)

          小李告訴我,要想成功采集目標(biāo)網(wǎng)站的文章,首先需要對(duì)目標(biāo)網(wǎng)站的結(jié)構(gòu)進(jìn)行詳細(xì)了解。通過分析網(wǎng)頁源碼、URL 參數(shù)等信息,可以更好地定位和提取目標(biāo)文章。

          2.使用合適的采集工具

          針對(duì)不同的采集需求,小李推薦了幾款功能強(qiáng)大、易于使用的 PHP 采集工具。例如,可以使用 Simple HTML DOM Parser 來解析 HTML 文檔,并提取所需內(nèi)容。

          3.處理 JavaScript 渲染

          現(xiàn)在很多網(wǎng)站都使用 JavaScript 進(jìn)行頁面渲染,這給采集帶來了一定難度。小李建議可以利用無頭瀏覽器(Headless Browser)來模擬瀏覽器行為,從而解決 JavaScript 渲染的問題。

          4.設(shè)置合理的采集頻率

          在進(jìn)行文章采集時(shí),要注意設(shè)置合理的采集頻率,避免給目標(biāo)網(wǎng)站帶來過大的訪問壓力。小李建議可以使用定時(shí)任務(wù)或者監(jiān)控工具來控制采集頻率,以免被目標(biāo)網(wǎng)站封禁。

          5.處理反爬蟲機(jī)制

          為了防止惡意爬蟲對(duì)網(wǎng)站造成損害,很多網(wǎng)站都設(shè)置了反爬蟲機(jī)制。小李提醒我們要注意處理這些機(jī)制,可以通過設(shè)置合適的 User-Agent、使用代理 IP 等方式來規(guī)避反爬蟲策略。

          6.數(shù)據(jù)清洗和去重

          采集到的文章可能存在一些噪音數(shù)據(jù)和重復(fù)內(nèi)容。小李建議在采集后進(jìn)行數(shù)據(jù)清洗和去重處理,以提高數(shù)據(jù)質(zhì)量和減少存儲(chǔ)空間占用。

          7.合法合規(guī)使用采集結(jié)果

          在進(jìn)行文章采集時(shí),務(wù)必要遵守相關(guān)法律法規(guī),并確保使用采集結(jié)果的合法性。小李強(qiáng)調(diào)了保護(hù)知識(shí)產(chǎn)權(quán)和個(gè)人隱私的重要性,呼吁大家要有責(zé)任心和法律意識(shí)。

          8.不斷學(xué)習(xí)和提升

          最后,小李鼓勵(lì)大家要不斷學(xué)習(xí)和提升自己的采集技術(shù)。網(wǎng)絡(luò)環(huán)境和網(wǎng)站結(jié)構(gòu)都在不斷變化,只有保持學(xué)習(xí)的態(tài)度,才能跟上時(shí)代的步伐。

          通過與小李的交流,我深刻感受到了 PHP 文章采集規(guī)則的復(fù)雜性和挑戰(zhàn)性。但同時(shí),我們也看到了解決問題的方法和技巧。相信在大家共同努力下,我們一定能夠更好地利用 PHP 技術(shù)進(jìn)行文章采集,并為網(wǎng)絡(luò)內(nèi)容質(zhì)量的提升做出更大的貢獻(xiàn)!

          理見《PowerQuery爬取網(wǎng)頁終極攻略——Power Query網(wǎng)絡(luò)爬取詳解》。施陽大神的手筆。pqfans是個(gè)好去處,有興趣的可以多瞄瞄。

          1、翻頁URL會(huì)變化,直接get方式提交

          URL:http://quote.stockstar.com/stock/ranklist_a_3_1_1.html

          此為滬深A(yù)股數(shù)據(jù),需要抓取1-20頁的所有數(shù)據(jù)。點(diǎn)擊下一頁后觀察URL發(fā)現(xiàn),html前面最后一個(gè)數(shù)字即為頁數(shù),那么只需要自定義函數(shù),將其做成變量然后調(diào)用即可。另外發(fā)現(xiàn)每一頁的最后一行都是多余的,可以用Table.RemoveLastN刪掉。

          let
           get_data=(x)=>Table.RemoveLastN(Web.Page(Web.Contents("http://quote.stockstar.com/stock/ranklist_a_3_1_"&Text.From(x)&".html")){0}[Data],1),
           result=Table.Combine(List.Transform({1..20},get_data))
          in
           result
          

          2、翻頁URL不會(huì)變化,F(xiàn)12找出真實(shí)地址

          URL:http://221.215.38.136/grcx/kscx/list.action?kscxVo.jsp=ylypmlcx.jsp

          要抓取1-20頁數(shù)據(jù),但發(fā)現(xiàn)翻頁URL不會(huì)變,無法根據(jù)URL控制頁數(shù)。瀏覽器按F12發(fā)現(xiàn),網(wǎng)頁以get方式提交,圖中參數(shù)4即為頁數(shù),表格的真實(shí)URL為http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery=4,于是方法同上。

          let
           source=Table.Combine(List.Transform({1..20},each Web.Page(Web.Contents("http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery="&Text.From(_))){2}[Data])),
           result=Table.SelectRows(source, each not Text.StartsWith([藥品編碼], "當(dāng)前"))
          in
           result
          

          3、post方式提交

          URL:http://www.drugfuture.com/cndrug/national.aspx?ApprovalDateStart=2016-01-01&ApprovalDateEnd=2016-12-31

          和之前不同的是,該網(wǎng)頁是以post方式提交,如果只是在URL后加參數(shù)無法得到正確的頁數(shù),于是要用到Web.Contents中的Content提交post參數(shù),另外headers中的Content-Type是必須的,所以也要加進(jìn)來。因?yàn)橛袀€(gè)"-"為特殊符號(hào),所以要加個(gè)#""。

          需要注意的是,提交的參數(shù)需要是encode后的,__VIEWSTATE參數(shù)太長了,我沒放進(jìn)來,自己改一下。

          let
           get_data=(page)=>
           let
           url="http://www.drugfuture.com/cndrug/national.aspx",
           headers=[#"Content-Type"="application/x-www-form-urlencoded"],
           content="__EVENTTARGET=GridViewNational&__EVENTARGUMENT=Page%24"&Text.From(page)&"&__VIEWSTATE=太長了自己改吧",
           query=[ApprovalDateStart="2016-01-01",ApprovalDateEnd="2016-12-31"],
           web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]),
           data=Table.RemoveLastN(Web.Page(Text.FromBinary(web_data))[Data]{0},1)
           in
           data,
           result=Table.Combine(List.Transform({1..78},get_data))
          in
           result
          

          4、需要登錄,加cookies

          URL:http://www.51mis.com/biaozhun/index.php?module=Accounts&action=index&parenttab=Parent%20Accounts

          這是一個(gè)CRM的試用賬戶,現(xiàn)要抓出客戶分類中的vip客戶下的1-4頁的所有信息。這里面有三個(gè)問題要解決:①需要登陸 ②點(diǎn)擊客戶分類下的任何子分類URL都不會(huì)變,如何定位到我們想要的vip客戶 ③翻頁問題

          我們首先打開這個(gè)URL驗(yàn)證下手機(jī)號(hào)登陸,然后打開一個(gè)新窗口,再次打開這個(gè)URL,發(fā)現(xiàn)看到的已經(jīng)和剛才不一樣了,這是因?yàn)閯偛诺顷懞蠓?wù)器已經(jīng)把所有的身份識(shí)別信息記錄在cookies中,當(dāng)再次訪問的時(shí)候?yàn)g覽器檢查到本地有cookies,于是向服務(wù)器提交了一個(gè)headers中帶有cookies的請(qǐng)求,驗(yàn)證通過。所以我們只需要復(fù)制cookies添加到headers中即可,問題①解決。

          然后嘗試點(diǎn)擊客戶分類下的不同子分類,對(duì)比發(fā)現(xiàn)有一個(gè)叫viewname的參數(shù)在變化,而vip客戶對(duì)應(yīng)的參數(shù)為179,問題②解決。

          頁碼對(duì)應(yīng)的則是start參數(shù),上面介紹過,問題③解決。

          let 
           get_data=(page)=>
           let
           url="http://www.51mis.com/biaozhun/index.php",
           headers=[#"Content-type"="application/x-www-form-urlencoded",Cookie="ck_login_id_lingdang=201; ck_login_theme_lingdang=softed; ck_login_language_lingdang=zh_cn; IESESSION=alive; _qddamta_4008885110=3-0; pgv_pvi=1109719040; pgv_si=s9133628416; tencentSig=2914921472; Hm_lvt_15823373277d5586cce1d8fa22740e98=1498477295,1498478011; Hm_lpvt_15823373277d5586cce1d8fa22740e98=1498478011; LXB_REFER=www.baidu.com; _qddaz=QD.evgckn.ew8amb.j4e2ox3t; PHPSESSID=j0m2ou15d8hcumonfcul46kj64; _qdda=3-1.3bt43b; _qddab=3-i0t2ae.j4e2ox3v"],
           content="viewname=179&start="&Text.From(page),
           query=[action="index",module="Accounts"],
           web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]),
           table=Web.Page(Text.FromBinary(web_data)){0}[Data]
           in
           table,
           result=Table.RemoveColumns(Table.Combine(List.Transform({1..4},get_data)),{""})
          in
           result
          

          5、返回json:

          URL:http://sports.sina.com.cn/g/ucl/table.html

          要抓取2011-2016所有歐冠積分榜數(shù)據(jù)。通過F12不難找到真實(shí)地址,去掉無關(guān)參數(shù)后為http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season=2016。把這個(gè)地址復(fù)制到瀏覽器打開,發(fā)現(xiàn)出來的和上面的案例都不一樣,返回的是json,那么就需要使用Json.Document來解析,其中season參數(shù)控制賽季,自定義函數(shù)后構(gòu)建{2011..2016}的list調(diào)用即可:

          let
           get_data=(x)=>Table.FromRecords(Json.Document(Web.Contents("http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season="&Text.From(x)))[result][data]),
           result=Table.Combine(List.Transform({2011..2016},get_data))
          in
           result
          

          6、非結(jié)構(gòu)化數(shù)據(jù):

          以上案例都有一個(gè)共同點(diǎn):都為結(jié)構(gòu)化數(shù)據(jù),可以直接通過解析表或json等方式從而獲取數(shù)據(jù),但有些網(wǎng)頁中的數(shù)據(jù)是非結(jié)構(gòu)化的。

          例如:爬取本站頁面https://pqfans.com/catalog中所有的錨鏈接。

          對(duì)于這種非結(jié)構(gòu)化的網(wǎng)頁,只能通過Text.FromBinary解析出源碼,然后當(dāng)文本處理。如果網(wǎng)頁的編碼為GBK或GB2312,Text.FromBinary的第二參數(shù)要加個(gè)0,否則會(huì)出現(xiàn)亂碼,如果是UTF-8則不用第二參數(shù)。

          let
           source=Text.FromBinary(Web.Contents("https://pqfans.com/catalog")),
           result=List.Transform({0..List.Count(Text.PositionOf(源,"<a href=""https://pqfans.com/",2))-1},each "https://pqfans.com/"&Text.BetweenDelimiters(源,"<a href=""https://pqfans.com/","""",_))
          in
           result
          

          處理動(dòng)態(tài)參數(shù)

          對(duì)于動(dòng)態(tài)參數(shù),可以把變量寫在單元格中,然后將單元格導(dǎo)入PQ,效果如下圖:

          修改單元格中的值,刷新即可得到不同日期、不同類型等數(shù)據(jù),體驗(yàn)類似于網(wǎng)頁中的查詢。

          練習(xí)

          URL:http://datacenter.mep.gov.cn/index!MenuAction.action?name=402880fb24e695b60124e6973db30011

          請(qǐng)用以上介紹的方法,抓出2017/6/20-2017/6/23全部49頁的全國城市空氣質(zhì)量日?qǐng)?bào)

          來源于施陽大神。


          主站蜘蛛池模板: 免费视频一区二区| 麻豆精品久久久一区二区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产在线视频一区二区三区| 日本一区二区三区在线看 | 精品一区二区三区中文| 国产一区二区三区在线观看精品| 一本大道在线无码一区| 久久精品国产一区二区三| 精品国产一区二区三区久久久狼| 亚洲AV成人精品日韩一区18p| 精品午夜福利无人区乱码一区| 熟女性饥渴一区二区三区| 亚洲日韩精品国产一区二区三区 | 毛片无码一区二区三区a片视频| 国产福利电影一区二区三区,日韩伦理电影在线福 | 国产在线精品一区二区在线看| 国产在线不卡一区| 97人妻无码一区二区精品免费| 亚洲熟女综合色一区二区三区 | 日韩美女视频一区| 亚州日本乱码一区二区三区| 国产精品毛片a∨一区二区三区| 在线观看精品一区| 51视频国产精品一区二区| 国产91精品一区二区麻豆网站 | 久久久精品人妻一区二区三区四| 无码人妻aⅴ一区二区三区| 国产乱码精品一区二区三区四川人| 鲁丝片一区二区三区免费| 麻豆AV一区二区三区久久| 日本韩国黄色一区二区三区 | 秋霞鲁丝片一区二区三区| 人妻夜夜爽天天爽一区| 久久精品国产第一区二区三区| 国产综合无码一区二区色蜜蜜| 人体内射精一区二区三区| 波多野结衣AV无码久久一区| 日本一区二区高清不卡| 日本一区二区三区中文字幕| 国产日韩精品一区二区在线观看播放|