文將介紹如何使用PHP采集文章內(nèi)容,包括采集的方法、工具和注意事項。
1.什么是PHP采集文章內(nèi)容?
PHP采集文章內(nèi)容指的是使用PHP編程語言從互聯(lián)網(wǎng)上獲取并提取文章的內(nèi)容。這種技術(shù)可以幫助我們自動化地獲取大量文章信息,節(jié)省時間和人力資源。
2. PHP采集文章內(nèi)容的方法有哪些?
-使用cURL庫:cURL是一個強大的開源網(wǎng)絡(luò)庫,可以通過HTTP協(xié)議獲取網(wǎng)頁源代碼,并從中提取所需的文章內(nèi)容。
-使用file_get_contents()函數(shù):這個PHP內(nèi)置函數(shù)可以讀取遠程文件并返回其內(nèi)容,我們可以通過它獲取網(wǎng)頁源代碼,并進行解析提取。
-使用第三方庫:例如Goutte、Simple HTML DOM等第三方庫提供了更加簡單和高效的方式來采集文章內(nèi)容。
3.如何使用cURL庫進行文章內(nèi)容采集?
使用cURL庫進行文章內(nèi)容采集需要以下步驟:
-初始化cURL會話;
-設(shè)置目標網(wǎng)址和其他相關(guān)參數(shù);
-執(zhí)行cURL請求,并獲取網(wǎng)頁源代碼;
-解析網(wǎng)頁源代碼,提取所需的文章內(nèi)容。
4.如何使用file_get_contents()函數(shù)進行文章內(nèi)容采集?
使用file_get_contents()函數(shù)進行文章內(nèi)容采集需要以下步驟:
-設(shè)置目標網(wǎng)址;
-使用file_get_contents()函數(shù)讀取網(wǎng)頁源代碼;
-解析網(wǎng)頁源代碼,提取所需的文章內(nèi)容。
5.采集文章內(nèi)容時需要注意什么?
在采集文章內(nèi)容時,我們需要注意以下幾點:
-尊重網(wǎng)站的規(guī)則和版權(quán):遵守網(wǎng)站的使用條款和版權(quán)法律,不要進行未經(jīng)授權(quán)的采集。
-控制采集頻率:不要過于頻繁地訪問同一個網(wǎng)站,以免給服務(wù)器帶來過大的負擔。
-處理反爬蟲機制:一些網(wǎng)站可能設(shè)置了反爬蟲機制,我們需要通過設(shè)置User-Agent、使用代理IP等方式來繞過這些限制。
6.有哪些常用的PHP文章內(nèi)容采集工具?
除了手動編寫代碼進行文章內(nèi)容采集外,還有一些常用的PHP文章內(nèi)容采集工具,例如:
- PHPCrawler:一個強大的PHP爬蟲框架,可以快速實現(xiàn)文章內(nèi)容采集功能。
- Goutte:一個簡單易用的Web爬蟲庫,可以方便地獲取網(wǎng)頁信息。
- Simple HTML DOM:一個解析HTML文檔的庫,可以輕松提取所需的數(shù)據(jù)。
7.采集到的文章內(nèi)容如何處理和存儲?
采集到的文章內(nèi)容可以通過以下方式進行處理和存儲:
-清洗數(shù)據(jù):對采集到的文章內(nèi)容進行清洗,去除HTML標簽、特殊字符等無用信息。
-存儲數(shù)據(jù):將處理后的文章內(nèi)容存儲到數(shù)據(jù)庫中,以便后續(xù)使用和管理。
8. PHP采集文章內(nèi)容的應(yīng)用場景有哪些?
PHP采集文章內(nèi)容在以下場景中有廣泛的應(yīng)用:
-網(wǎng)頁數(shù)據(jù)分析:通過采集多個網(wǎng)頁的文章內(nèi)容,進行數(shù)據(jù)分析和挖掘,發(fā)現(xiàn)其中的規(guī)律和趨勢。
-新聞聚合平臺:通過采集各大新聞網(wǎng)站的文章內(nèi)容,構(gòu)建一個新聞聚合平臺,方便用戶獲取最新資訊。
-內(nèi)容自動發(fā)布:通過采集其他網(wǎng)站的文章內(nèi)容,并自動發(fā)布到自己的網(wǎng)站或博客上,實現(xiàn)內(nèi)容更新和增加。
9. PHP采集文章內(nèi)容的未來發(fā)展趨勢是什么?
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展和創(chuàng)新,PHP采集文章內(nèi)容也將迎來更多的機遇和挑戰(zhàn)。未來發(fā)展趨勢包括:
-智能化采集:利用機器學習和自然語言處理等技術(shù),實現(xiàn)對文章內(nèi)容的智能化采集和處理。
-多媒體內(nèi)容采集:除了文字內(nèi)容,還可以采集圖片、視頻等多媒體內(nèi)容,提供更豐富的信息資源。
-分布式采集系統(tǒng):通過分布式架構(gòu)和任務(wù)調(diào)度算法,實現(xiàn)對大規(guī)模網(wǎng)站的高效采集和處理。
以上是關(guān)于PHP采集文章內(nèi)容的問答,希望對您有所幫助。如果您還有其他問題,歡迎繼續(xù)提問!
摘要】
集算器 SPL 支持抓取網(wǎng)頁數(shù)據(jù),根據(jù)抓取定義規(guī)則,可將網(wǎng)頁數(shù)據(jù)下載到在本地進行統(tǒng)計分析。具體定義規(guī)則要求、使用詳細情況,請前往乾學院:集算器 SPL 抓取網(wǎng)頁數(shù)據(jù)!
網(wǎng)站上的數(shù)據(jù)源是我們進行統(tǒng)計分析的重要信息源。當我們?yōu)g覽網(wǎng)頁,看到自己感興趣數(shù)據(jù)內(nèi)容時,希望能夠快速抓取網(wǎng)頁上的數(shù)據(jù),這對于數(shù)據(jù)分析相關(guān)工作來說極其重要,也是必備的技能之一。但是網(wǎng)絡(luò)數(shù)據(jù)抓取大多需要復(fù)雜的編程知識,操作也比較繁瑣。這里介紹如何用集算器 SPL 快速抓取網(wǎng)頁數(shù)據(jù)。
1、基本流程圖
2、抓取網(wǎng)頁數(shù)據(jù)接口
3、定義規(guī)則
A、web_info
B、init_url
C、help_url
D、target_url
E、page_url
4、抓取股票歷史數(shù)據(jù)
5、用戶自定義程序
A、數(shù)據(jù)提取程序接口
B.數(shù)據(jù)保存程序接口
C、數(shù)據(jù)提取程序樣例
D、數(shù)據(jù)保存程序樣例
E、自定義程序的使用
1、基本流程圖
從給定的開始地址進行遍歷,將解析過濾后的網(wǎng)址放入下載地址隊列,分成網(wǎng)址頁 help_url 與下載頁 target_url, 網(wǎng)址頁只收集網(wǎng)址,下載頁即能收集網(wǎng)址,也能提取數(shù)據(jù),把提取到的數(shù)據(jù)保存起來。抓取網(wǎng)頁數(shù)據(jù)直到遍歷地址為空,則抓取工作結(jié)束。
2、抓取網(wǎng)頁數(shù)據(jù)接口
web_crawl(jsonstr) 是抓取網(wǎng)頁數(shù)據(jù)接口,參數(shù) jsonstr 是定義規(guī)則的字符串,抓取數(shù)據(jù)時,根據(jù)定義規(guī)則遍歷 URL、下載、提取、保存相關(guān)內(nèi)容數(shù)據(jù)。
本接口依賴集算器外部庫 webcrawlCli。它缺省安裝在集算器軟件的 esProc\extlib\webcrawlCli 路徑下,在集算器的外部庫設(shè)置中勾選 webcrawlCli 項, 重啟集算器后,就可以使用 web_crawl 接口。
web_crawl 簡單用法,如抓取指定股票數(shù)據(jù),SPL 腳本 demo.dfx:
獲取股票代碼 600000 的數(shù)據(jù)文件:
文件內(nèi)容:
3、定義規(guī)則
根據(jù)基本流程圖,將定義規(guī)則分成網(wǎng)站信息、初始網(wǎng)址、網(wǎng)址頁、下載頁、提取數(shù)據(jù)五部分。具體內(nèi)容如下:
[
{web_info:{domain:‘www.banban.cn’, save_path:‘d:/tmp/data/webmagic’, thread_size:2, cookie:{name:“jacker”, laster:“2011”},
user_agent:‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0’}},
{init_url:[‘_cybs.htmlhttps://www.banban.cn/gupiao/list’, ‘_sh.htmlhttps://www.banban.cn/gupiao/list’]},
{help_url:[‘gupiao/list_(sh|sz|cyb)\.html’, ‘/shujv/zhangting/’, ‘/agu/$’]},
{target_url:{reg_url:‘/agu/365\d’}},
{target_url:{filter:‘gupiao/list_(sh|sz|cyb)\.html’, reg_url:‘gupiao/[sz|sh]?(60000\d)/’,new_url:‘http://www.aigaogao.com/tools/history.html?s=%s’}},
{page_url:{filter:‘history.html\?s=\d{6}’, extractby: “//div[@id=‘ctl16_contentdiv’]/”}},
{page_url:{extractby: “//div[@id=‘content_all’]/”}},
{page_url:{filter:‘/agu/365\d’, extractby: “//div[@id=‘content’]/”}}
]
規(guī)則簡要說明:
web_info:網(wǎng)站信息, 根據(jù)要下載的網(wǎng)站,設(shè)置域名、本地存儲位置、用戶代理信息、用戶自定義程序等相關(guān)的信息。
init_url:初始網(wǎng)址, URL 遍歷的入口網(wǎng)址。
help_url:網(wǎng)址頁, 定義網(wǎng)址頁規(guī)則,收集網(wǎng)頁內(nèi)容中的 URL,但不提取此頁面數(shù)據(jù)內(nèi)容。
target_url:下載頁, 定義下載頁規(guī)則,收集網(wǎng)頁內(nèi)容中的 URL,同時也提取此頁面的內(nèi)容。
page_url:提取數(shù)據(jù), 定義頁面內(nèi)容提取規(guī)則,在下載頁 target_url 中根據(jù)此規(guī)則提取內(nèi)容。
注意: json 書寫結(jié)構(gòu)細節(jié),節(jié)點 {} 中的 [] 表示 list 列表,節(jié)點 {} 中的 {} 表示 map 鍵值結(jié)構(gòu),書定時要注意,否則書寫不對易引起解析錯誤。
定義規(guī)則說明
A、web_info
設(shè)置要下載的信息,內(nèi)容包括:
domain:設(shè)置域名。
save_path:文件存儲路徑。
user_agent:指用戶代理信息。 作用: 使服務(wù)器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
sleep_time:抓取間隔。
cycle_retry_times:重試次數(shù)。
charset:設(shè)置編碼。
use_gzip:是否為 gzip 壓縮。
time_out:抓取超時設(shè)置。
cookie_name:cookie 信息,鍵值結(jié)構(gòu)。
thread_size:抓取時線程數(shù)。
save_post:是否要為存儲的文件名稱追加編碼串,以防網(wǎng)名文件被覆蓋,缺省值為 true。如 books/a.html, music/a.html, 都是要下載的頁面,保存時若此參數(shù)為 true, 則存儲文件名分別為 a_xxxcgk.txt,a_xabcdw.txt,文件不會被覆蓋;若為 false, 保存文件名為 a.txt, 后存儲的就會將已存在的同名文件覆蓋。
class_name:用戶自定義的存儲類。
class_argv:傳遞給 class_name 類的字符串參數(shù)。
B、init_url
初始的 URL。
為 List 列表結(jié)構(gòu),可設(shè)置多個 URL.
C、help_url
網(wǎng)址頁主要是定義要收集的 URL 過濾規(guī)則, 符合規(guī)則的 URL 會被加入下載網(wǎng)址隊列,但是不會提取其具體內(nèi)容。過濾規(guī)則支持正則表達式,如:
gupiao/list_(sh|sz|cyb)\.html 表示 URL 中只有包括字符串 gupiao/list_sh.html、gupiao/list_sz.html、gupiao/list_cyb.html 鏈接才能通過。
為 List 列表結(jié)構(gòu),可定義多個規(guī)則。
D、target_url
下載頁是要抓取內(nèi)容數(shù)據(jù)的 URL,需要從這個頁面里提取內(nèi)容。若此 URL 符合 help_url 過濾規(guī)則,那么也會在本頁面中收集 URL。
約定定義規(guī)則格式:
{target_url:{filter: pageUrl, reg_url:urlRegex, new_url:newUrl}},
表示在符合 pageUrl 條件的頁面中,找出符合 urlRegex 條件的 href 鏈接,若 newUrl 定義了,則可與 urlRegex 過濾結(jié)果組合成新的 URL。
例如在頁面中找到鏈接 a_100.html 符合過濾條件 reg_url=a_(\d+)\.html, 則有 newUrl=b_%s.php, 那么 urlRegex 過濾 a_100.html 的結(jié)果為 100, 將與 newUrl 合并,新的下載頁為 b_100.php。
其中 filter 表示定義過濾的 URL 規(guī)則;若無此定義,表示所有的 target_url 都要用此規(guī)則。
reg_url 表示要收集的 URL 規(guī)則,必寫;無 reg_url 的 target_url 規(guī)則則無意義。
new_url 表示定義新的頁面,需要與 reg_url 過濾結(jié)果結(jié)合成新的 URL。
舉例說明:
3.1 定義規(guī)則:{target_url:{filter:‘gupiao/list_(sh|sz|cyb)\.html’, reg_url:‘gupiao/([sz|sh]?6000\d{2})/’,new_url:‘http://www.raqsft.com/history.html?s=%s’}}
在下載頁 gupiao/list_sh.html 中包含如下內(nèi)容:
A、gupiao/list_sh.html 符合 filter 條件
B、href 串符合 reg_url 條件,將產(chǎn)生 [600010, 600039, 600048]
C、過濾結(jié)果與 newUrl 生成新的 URL:
http://www.raqsft.com/history.html?s=600010
http://www.raqsft.com/history.html?s=600039
http://www.raqsft.com/history.html?s=600048
new_url 中的 %s 為合并字符串的占位符。
3.2 定義規(guī)則:{target_url:{reg_url:‘/ gupiao/60001\d’}},
在下載頁 gupiao/list.html 中包含如下內(nèi)容:
href 中符合 reg_url 條件的,則收集到的 URL 為: http://www.xxx.com/gupiao/600010/ 其它兩個 href 不符合過濾條件。 設(shè)置 filter 是為了在過濾后的頁面中去收集 URL, 當 help_url 多時,過濾后縮小了范圍,提高了效率。 target_url 規(guī)則可定義多條,以適應(yīng)不同的條件。
E、page_url
提取數(shù)據(jù),主要作用于下載頁面內(nèi)容提取,它表示使用這個抽取規(guī)則,將提取到的結(jié)果保存。定義此規(guī)則參考 xpath 使用說明。它只提取主要內(nèi)容,但對內(nèi)容細節(jié)還需要 className 類來抽取。
約定定義規(guī)則格式:
{page_url:{filter: pageUrl, extractby: contentReg, class: className }},
其中 filter 表示符合過濾條件的 url 規(guī)則,若無此定義,表示所有的 target_url 都要用此規(guī)則。
extractby 表示頁面內(nèi)容提取規(guī)則。若定義 class,表示由 className 類執(zhí)行內(nèi)容提??;若 className=
”default”, 表示用當前缺省方式提取,也就是針對 table 表中的內(nèi)容提取數(shù)據(jù)。若缺省提取不滿足需求,用戶可自定義類來實現(xiàn),具體實現(xiàn)參考后面用戶自定義程序。
例如:extractby :“//div[@class=news-content]/text()”,從網(wǎng)頁中提取此節(jié)點下的數(shù)據(jù)。
page_url 可針對不同的頁面制定不同的規(guī)則。通過 filter 過濾后的頁面中去提取數(shù)據(jù),減少要處理的 URL 數(shù)量,當 target_url 多時,能提高效率。
若無 extractby 規(guī)則,則表示提取 target_url 頁面中所有的內(nèi)容。
若定義了多條 page_url 規(guī)則 ,則首個符合規(guī)則的內(nèi)容將被提取。
假如 A 頁面內(nèi)容的符合規(guī)則 R1,R2,R3, 提取內(nèi)容時首先是 R2,則不再根據(jù) R1、R3 規(guī)則提取數(shù)據(jù)。
說明:若沒有定義 target_url 規(guī)則,但當前頁面有適合的 page_url 規(guī)則,則此頁面的內(nèi)容也會被提取。
4、抓取股票歷史數(shù)據(jù)
下面用抓取股票歷史數(shù)據(jù)來說明,web_crawl() 接口是如何應(yīng)用的。基本操作:先獲取股票代碼,然后通過股票代碼查詢歷史數(shù)據(jù),從下載頁面中提取數(shù)據(jù)后保存。A、在https://www.banban.cn/gupiao/list_xxx.html 頁面 help_url 提取上證、深證、創(chuàng)業(yè)板的股票代碼。
B 、將股票代碼與http://www.aigaogao.com/tools/history.html?s=%s 結(jié)合,生成需要下載網(wǎng)址 target_url.
C 、針對下載頁 target_url 中的內(nèi)容提取。
D、顯示提取后的內(nèi)容。
SPL 實現(xiàn)代碼 Stock.dfx:
加載其中的股票 600010 數(shù)據(jù)為:
5、用戶自定義程序
對于內(nèi)容提取,缺省提供了對 html 中的 table 內(nèi)容進行抽取。 但是世界上沒有千篇一律的網(wǎng)頁一樣,也沒有一勞永逸的提取算法。在使用網(wǎng)頁數(shù)據(jù)抓取過程中,你會碰到各種類型的網(wǎng)頁,這個時候,你就要針對這些網(wǎng)頁,來實現(xiàn)對應(yīng)抽取方法。存儲方式類似,缺省提供的是文件保存,若想其它方式如數(shù)據(jù)庫存儲,還需要用戶自己開發(fā)程序。參考下面接口,可將自定義程序融入網(wǎng)頁數(shù)據(jù)抓取流程中。
A、數(shù)據(jù)提取程序接口
下載頁的內(nèi)容組織形式多樣,各具不同,為了適應(yīng)更多的內(nèi)容提取需求,用戶可自定義提取數(shù)據(jù)程序。
接口程序:
package com.web;
import us.codecraft.webmagic.Page;
public interface StandPageItem {
// 數(shù)據(jù)提取處理。
void parse(Page p);
}
需要實現(xiàn) com.web.StandPageItem 接口 parse(Page p),數(shù)據(jù)提取在此實現(xiàn)。
B、數(shù)據(jù)保存程序接口
提取數(shù)據(jù)存儲方式種類繁多,各具不同,為了適應(yīng)更多的數(shù)據(jù)存儲需求,用戶可自定義數(shù)據(jù)存儲程序。
接口程序:
package com.web;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;
public interface StandPipeline extends Pipeline {
public void setArgv(String argv);
public void process(ResultItems paramResultItems, Task paramTask);
}
同樣需要實現(xiàn) com.web.StandPipeline 類中的 setArgv(), process()。
setArgv()輸入?yún)?shù)接口,process() 處理存儲數(shù)據(jù)接口。
C、數(shù)據(jù)提取程序樣例
實現(xiàn) com.web.StandPage 接口 parse(Page p),
參考代碼:
package com.web;
import java.util.List;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.selector.Selectable;
public class StockHistoryData implements StandPageItem{
@Override
public void parse(Page page) {
StringBuilder buf=new StringBuilder();
List nodes=page.getHtml().xpath(“table/tbody/”).nodes();
for(Selectable node:nodes){
String day=node.xpath(“//a/text()”).get();
List title=node.xpath(“//a/text() | tr/td/text()”).all();
if (title.size()<5) continue;
String line=title.toString().replaceFirst(“, ,”, “,”);
buf.append(line+“\n”);
}
page.putField(“content”, buf.toString());
}
}
將要保存的數(shù)據(jù)存放到 page 的字段 "content" 中,在保存處理時,將從字段 "content" 中獲取。
D、數(shù)據(jù)保存程序樣例
實現(xiàn) com.web.StandPageline 類中的 setArgv(),process()
參考代碼:
package com.web;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import org.apache.commons.codec.digest.DigestUtils;
import us.codecraft.webmagic.utils.FilePersistentBase;
public class StockPipeline extends FilePersistentBase implements StandPipeline {
private Logger logger=LoggerFactory.getLogger(getClass());
private String m_argv;
private String m_path;
public static String PATH_SEPERATOR=“/”;
static {
String property=System.getProperties().getProperty(“file.separator”);
if (property !=null) {
PATH_SEPERATOR=property;
}
}
public StockPipeline() {
m_path=“/data/webcrawl”;
}
// 獲取存儲路徑與存儲文件名前綴
public void setArgv(String argv) {
m_argv=argv;
if (m_argv.indexOf(“save_path=”)>=0){
String[] ss=m_argv.split(“,”);
m_path=ss[0].replace(“save_path=”, ““);
m_argv=ss[1];
}
}
public void process(ResultItems resultItems, Task task) {
String saveFile=null;
Object o=null;
String path=this.m_path + PATH_SEPERATOR + task.getUUID() + PATH_SEPERATOR;
try {
do{
String url=resultItems.getRequest().getUrl();
o=resultItems.get(“content”);
if (o==null){
break;
}
int start=url.lastIndexOf(”/”);
int end=url.lastIndexOf(“?”);
if (end<0){
end=url.length();
}
String link=url.substring(start+1, end);
if (m_argv!=null && !m_argv.isEmpty()){
link=m_argv+“_”+link;
}
if (link.indexOf(“.”)>=0){
link=link.replace(“.”, “_”);
}
// 加 md5Hex 為防止重名
String hex=DigestUtils.md5Hex(resultItems.getRequest().getUrl());
saveFile=path + link+“_”+ hex +“.json”;
}while(false);
if (saveFile!=null){
PrintWriter printWriter=new PrintWriter(new FileWriter(getFile(saveFile)));
printWriter.write(o.toString());
printWriter.close();
}
} catch (IOException e) {
logger.warn(“write file error”, e);
}
}
}
E、自定義程序的使用
將上述接口文件及 java 文件編譯后打包成 webStock.jar 文件,放在 esProc\extlib\webcrawlCli 路徑下重啟集算器。數(shù)據(jù)存儲程序,在 web_info 中配置;數(shù)據(jù)提取程序,在 page_url 中配置。下面是加載兩個自定義類程序的 dfx 腳本。
SPL 代碼腳本 mytest.dfx:
生成結(jié)果:
類似針對內(nèi)容提取或數(shù)據(jù)存儲,參考上面程序的實現(xiàn),用戶可自定義 java 程序。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。