導航:首頁 > 編程語言 > php爬蟲抓取數據

php爬蟲抓取數據

發布時間:2023-04-28 04:17:38

php實現網路爬蟲

只要包含網路和字元串處理功能的編程語言理論上都可以寫爬蟲,所以PHP當然完全沒問題。如何用PHP寫爬蟲的前提是你要先調研清楚爬什麼內容。這需要你針對要爬取目標做好充分的測試和准備工作,叢簡否則會浪費很多時間。

比如一個簡單的「傳統型」網站,那真的只需要用file_get_contents函數加正則就能搞定。覺的正則匹配數據太麻煩可以上xpath。如果站點有了頻率和IP限制,這時就要額外准備好代理IP池了。當發現抓取內容是JS渲染的,可能要考慮引入headlessbrowser這種技術的PHP擴展了。對爬取效率有鬧鄭物了要求後,多線程,抓取和解析分離,分布式也是要考慮的了。。。

回到問題本身如何寫的問題,我個人覺得爬蟲是個定製化比較液液高的業務需求,需要根據具體的場景來規劃。如果是要寫一個能解決所有爬蟲場景的,那就不用自己寫了,成熟的開源軟體拿來直接用就行了。非要寫的話可以直接參考這些成熟的軟體,自己可以少踩很多坑。

⑵ php中curl爬蟲 怎麼樣通過網頁獲取所有鏈接

本文承接上面兩篇,本篇中的示例要調用到前兩篇中的函數,做一個簡單的URL採集。一般php採集網路數據會用file_get_contents、file和cURL。不過據說cURL會比file_get_contents、file更快更專業,更適合採集。今天就試試用cURL來獲取網頁上的所有鏈接。示例如下:

<?php
/*
* 使用curl 採集hao123.com下的所有鏈接。
*/
include_once('function.php');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.hao123.com/');
// 只需返回HTTP header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 頁面內容我們並不需要
// curl_setopt($ch, CURLOPT_NOBODY, 1);
// 返回結果,而不是輸出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$info = curl_getinfo($ch);
if ($html === false) {
echo "cURL Error: " . curl_error($ch);
}
curl_close($ch);
$linkarr = _striplinks($html);
// 主機部分,補全用
$host = 'http://www.hao123.com/';
if (is_array($linkarr)) {
foreach ($linkarr as $k => $v) {
$linkresult[$k] = _expandlinks($v, $host);
}
}
printf("<p>此頁面的所有鏈接為:</p><pre>%s</pre>n", var_export($linkresult , true));
?>

function.php內容如下(即為上兩篇中兩個函數的合集):

<?php
function _striplinks($document) {
preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1) (.*?)\1 | ([^s>]+))'isx", $document, $links);
// catenate the non-empty matches from the conditional subpattern
while (list($key, $val) = each($links[2])) {
if (!empty($val))
$match[] = $val;
} while (list($key, $val) = each($links[3])) {
if (!empty($val))
$match[] = $val;
}
// return the links
return $match;
}
/*===================================================================*
Function: _expandlinks
Purpose: expand each link into a fully qualified URL
Input: $links the links to qualify
$URI the full URI to get the base from
Output: $expandedLinks the expanded links
*===================================================================*/
function _expandlinks($links,$URI)
{
$URI_PARTS = parse_url($URI);
$host = $URI_PARTS["host"];
preg_match("/^[^?]+/",$URI,$match);
$match = preg_replace("|/[^/.]+.[^/.]+$|","",$match[0]);
$match = preg_replace("|/$|","",$match);
$match_part = parse_url($match);
$match_root =
$match_part["scheme"]."://".$match_part["host"];
$search = array( "|^http://".preg_quote($host)."|i",
"|^(/)|i",
"|^(?!http://)(?!mailto:)|i",
"|/./|",
"|/[^/]+/../|"
);
$replace = array( "",
$match_root."/",
$match."/",
"/",
"/"
);
$expandedLinks = preg_replace($search,$replace,$links);
return $expandedLinks;
}
?>

⑶ phpstudy怎麼抓取網頁數據

什麼網頁數據?

是打開 本地網頁還是打開網上網頁

如果是本地網頁的話 在瀏覽器上輸入127.0.0.1或者localhost進行訪問


如果是外網我理解的是你要獲取外網的一個網頁,可以用代碼或者程序來實現

(一般稱為採集程序,或者小偷程序)

//個人認為curl好一點,因為curl可以模擬瀏覽器,有的網站會過濾機器人

//1.php代碼
//把網頁讀入一個字元串
$contone=file_get_contents('url');
print_r($contone);
//curl採集
#初始化curl(true/false)
$ch=curl_init();
#請求url地址
$params[CURLOPT_URL]='網址';
#是否返回響應頭信息
$params[CURLOPT_HEADER]=true;
#是否將結果返回
$params[CURLOPT_RETURNTRANSFER]=true;
#是否重定向
$params[CURLOPT_FOLLOWLOCATION]=true;
#偽造瀏覽器
$params[CURLOPT_USERAGENT]='Mozilla/5.0(WindowsNT5.1;rv:9.0.1)Gecko/20100101Firefox/9.0.1';
curl_setopt_array($ch,$params);
$content=curl_exec($ch);
//輸出網頁內容
print_r($content);

//下面是整個curl採集類
classCurl{
#採集的地址
public$url;
#匹配的正則
public$preg;
#模擬登錄需要的用戶名
public$username;
#模擬登錄需要的密碼;
public$pwd;
#cookie存儲的路徑
private$cookie_path;
#採集數據的字元集
public$charset;

/**
*構造方法,初始化採集基本信息
*@param$url採集的url
*@param$preg匹配的正則
*@paramstring$username用戶名
*@paramstring$pwd密碼
*@paramstring$charset字元集
*/
publicfunction__construct($info){
extract($info);
$this->url=$url;
$this->preg=$preg;
if(isset($charset)){
header("content-type:text/html;charset=".$this->charset);
}else{
header("content-type:text/html;charset=utf-8");
}
if(isset($username)){
$this->username=$username;
}
if(isset($pwd)){
$this->pwd=$pwd;
}
}
/*
*採集數據,非表單提交方式,直接採集的
*/
publicfunctionget_info(){
#初始化curl
$ch=curl_init();
#請求url地址
$params[CURLOPT_URL]=$this->url;
#是否返回響應頭信息
$params[CURLOPT_HEADER]=true;
#是否將結果返回
$params[CURLOPT_RETURNTRANSFER]=true;
#是否重定向
$params[CURLOPT_FOLLOWLOCATION]=true;
#偽造瀏覽器
$params[CURLOPT_USERAGENT]='Mozilla/5.0(WindowsNT5.1;rv:9.0.1)Gecko/20100101Firefox/9.0.1';
//判斷是否有cookie,有的話直接使用
//if(isset($_COOKIE['cookie_jar'])&&($_COOKIE['cookie_jar']||is_file($_COOKIE['cookie_jar']))){
//$params[CURLOPT_COOKIEFILE]=$_COOKIE['cookie_jar'];//這里判斷cookie
//}else{
//$cookie_jar=tempnam($this->cookie_path,'cookie');//產生一個cookie文件
//$params[CURLOPT_COOKIEJAR]=$cookie_jar;//寫入cookie信息
//setcookie('cookie_jar',$cookie_jar);//保存cookie路徑
//}
#開始發送請求,傳入curl參數
curl_setopt_array($ch,$params);
$content=curl_exec($ch);
preg_match_all($this->preg,$content,$arr);
return$arr;
}

/**
*採集遠程圖片
*@param$img圖片路徑是一個數組
*@param$save_path圖片保存在你本地的路徑
*@returnbool
*/
publicfunctionget_img($img,$save_path){
for($i=0;$i<count($img);$i++){
$res=@file_get_contents($img[$i]);
$img_type=substr($img[$i],strrpos($img[$i],"."));
$path=$save_path.time().rand(1,9999999).mt_rand().$img_type;
$img[$i]=$path;
file_put_contents($path,$res);
}
return$img;
}

//登錄後採集
publicfunctionregister_info(){
//採集的信息需要先登錄的就要先模擬登錄
//設置cookie保存路徑
$ch=curl_init();

//組裝用戶名和密碼
$info['username']=$this->username;
$info['password']=$this->pwd;
//模擬表單提交
$params[CURLOPT_URL]=$this->url;//請求url地址
$params[CURLOPT_HEADER]=true;//是否返回響應頭信息
$params[CURLOPT_RETURNTRANSFER]=true;//是否將結果返回
$params[CURLOPT_FOLLOWLOCATION]=true;//是否重定向
$params[CURLOPT_USERAGENT]='Mozilla/5.0(WindowsNT5.1;rv:9.0.1)Gecko/20100101Firefox/9.0.1';
$postfields='';
//將表單要提交的數據編程URL拼接方式
foreach($infoas$key=>$value){
$postfields.=urlencode($key).'='.urlencode($value).'&';
}
$params[CURLOPT_POST]=true;
$params[CURLOPT_POSTFIELDS]=$postfields;
//判斷是否有cookie,有的話直接使用
if(isset($_COOKIE['cookie_jar'])&&($_COOKIE['cookie_jar']||is_file($_COOKIE['cookie_jar']))){
$params[CURLOPT_COOKIEFILE]=$_COOKIE['cookie_jar'];//這里判斷cookie
}else{
$cookie_jar=tempnam($this->cookie_path,'cookie');//產生一個cookie文件
$params[CURLOPT_COOKIEJAR]=$cookie_jar;//寫入cookie信息
setcookie('cookie_jar',$cookie_jar);//保存cookie路徑
}
curl_setopt_array($ch,$params);//傳入curl參數
$content=curl_exec($ch);//執行
return$content;
}
}

⑷ 如何用php 編寫網路爬蟲

  1. pcntl_fork或者賀返swoole_process實現多進程並發。按照每個網頁抓取耗時500ms,開200個進程,可以實現每秒400個頁面的抓取。

  2. curl實現頁面抓取,設置cookie可以實現模擬登錄

  3. simple_html_dom 實現頁面的解析和DOM處理

  4. 如果想嫌磨要禪者飢模擬瀏覽器,可以使用casperJS。用swoole擴展封裝一個服務介面給PHP層調用

在這里有一套爬蟲系統就是基於上述技術方案實現的,每天會抓取幾千萬個頁面。

⑸ PHP抓取網頁指定內容

<?php
/*
* 如下: 方法有點笨
* 抓取網頁內容用 PHP 的正則
* 用JS每隔5分鍾刷新當前頁面---即重新獲取網頁內容
*
* 註: $mode中--<title></title>-更改為所需內容(如 $mode = "#<a(.*)</a>#";>獲取所有鏈接)
*
* window.location.href="http://localhost//refesh.php";中的http://localhost//refesh.php
* 更改為自己的URL----作用:即刷新當前頁面
*
* setInterval("ref()",300000);是每隔300000毫秒(即 5 * 60 *1000 毫秒即5分鍾)執行一次函數 ref()
*
* print_r($arr);輸出獲得的所有內容 $arr是一個數組 可根據所需輸出一部分(如 echo $arr[1][0];)
* 若要獲得所有內容 可去掉
* $mode = "#<title>(.*)</title>#";
if(preg_match_all($mode,$content,$arr)){
print_r($arr);
echo "<br/>";
echo $arr[1][0];
}
再加上 echo $content;
*/
$url = "http://www..com"; //目標站
$fp = @fopen($url, "r") or die("超時");

$content=file_get_contents($url);
$mode = "#<title>(.*)</title>#";
if(preg_match_all($mode,$content,$arr)){
//print_r($arr);
echo "<br/>";
echo $arr[1][0];
}
?>
<script language="javaScript" type="text/javascript">
<--
function ref(){
window.location.href="http://localhost//refesh.php";
}
setInterval("ref()",300000);
//-->
</script>

⑹ 你好,我如何用php來實現網路爬蟲呢具體一點

以下是訪問某音樂網站,並獲取其歌曲名等數組的示例,你可以參考:

<?php
header('Content-type:text/html;charset=utf-8');
$doc = file_get_contents('http://www.songtaste.com/music/');
$pa = '{MSL\((.*)\);}';
preg_match_all($pa,$doc,$r);
for($i=0;$i<count($r[1]);$i++)
{
$r1 = explode(', ',$r[1][$i]);
echo '歌曲標題:'. iconv('gb2312','utf-8',$r1[0]) .' 歌曲ID:'.$r1[1].'<br/>';
}
?>

⑺ PHP爬蟲 post提交 form data裡面的數據是這樣的,怎麼抓取到數據顯示在控制台中preview

$str = file_get_contents($url);
preg_match_all( '/.../' , $str , $ar );
insert into tb (content) values ('$ar[1]');

⑻ 使用PHP的cURL庫進行網頁抓取

使用模明仿PHP的cURL庫可以簡單和有效地去抓網頁 你只需要運行一個腳本 然後分析一下你所抓取的網頁 然後就可以以程序的方式得到你想要的數據了 無論是你想從從一個鏈接上取部分數據 或是取一個XML文件並把其導入資料庫 那怕就是簡單的獲取網頁內容 cURL 是一個功能強大的PHP庫 本文主要講述如果使用這個PHP庫

啟用 cURL 設置

首先 我們得先要確定我們的PHP是否開啟了這個庫 你可以通過使用php_info()函數來得到這一信息

﹤?phpphpinfo();?﹥

如果你可以在網頁上看到下面的輸出 那麼表示cURL庫已被開啟

如果你看到的話 那麼你需要設置你的PHP並開啟這個庫 如果你是在Windows平台下 那麼非常簡單 你需要改一改你的php ini文件的設置 找到php_curl dll 並取消前面的分號注釋就行了 如下所示

//取消下在的注釋extension=php_curl dll

如果你旦纖是在Linux下面 那麼 你需要重新編譯你的PHP了 編輯時 你需要打開編譯參數——在configure命令上加上 –with curl 參數

一個小示例

如果一切就緒 下面是一個小常式

﹤?php// 初始化一個 cURL 對象$curl = curl_init();

// 設置你需要抓取的URLcurl_setopt($curl CURLOPT_URL //cocre );

// 設置headercurl_setopt($curl CURLOPT_HEADER );

// 設置cURL 參數 要求結果保存到字元串中還是輸出到屏幕上槐鏈 curl_setopt($curl CURLOPT_RETURNTRANSFER );

// 運行cURL 請求網頁$data = curl_exec($curl);

// 關閉URL請求curl_close($curl);

// 顯示獲得的數據var_mp($data);

如何POST數據

上面是抓取網頁的代碼 下面則是向某個網頁POST數據 假設我們有一個處理表單的網址// example /sendSMS php 其可以接受兩個表單域 一個是電話號碼 一個是簡訊內容

﹤?php$phoneNumber = ;$message = This message was generated by curl and php ;$curlPost = pNUMBER= urlencode($phoneNumber) &MESSAGE= urlencode($message) &SUBMIT=Send ;$ch = curl_init();curl_setopt($ch CURLOPT_URL // example /sendSMS php );curl_setopt($ch CURLOPT_HEADER );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_POST );curl_setopt($ch CURLOPT_POSTFIELDS $curlPost);$data = curl_exec();curl_close($ch);?﹥

從上面的程序我們可以看到 使用CURLOPT_POST設置HTTP協議的POST方法 而不是GET方法 然後以CURLOPT_POSTFIELDS設置POST的數據

關於代理伺服器

下面是一個如何使用代理伺服器的示例 請注意其中高亮的代碼 代碼很簡單 我就不用多說了

﹤?php $ch = curl_init();curl_setopt($ch CURLOPT_URL // example );curl_setopt($ch CURLOPT_HEADER );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_HTTPPROXYTUNNEL );curl_setopt($ch CURLOPT_PROXY fakeproxy : );curl_setopt($ch CURLOPT_PROXYUSERPWD user:password );$data = curl_exec();curl_close($ch);?﹥ 關於SSL和Cookie

關於SSL也就是HTTPS協議 你只需要把CURLOPT_URL連接中的//變成//就可以了 當然 還有一個參數叫CURLOPT_SSL_VERIFYHOST可以設置為驗證站點

關於Cookie 你需要了解下面三個參數

CURLOPT_COOKIE 在當面的會話中設置一個cookie

CURLOPT_COOKIEJAR 當會話結束的時候保存一個Cookie

CURLOPT_COOKIEFILE Cookie的文件

HTTP伺服器認證

最後 我們來看一看HTTP伺服器認證的情況

﹤?php $ch = curl_init();curl_setopt($ch CURLOPT_URL // example );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_HTTPAUTH CURLAUTH_BASIC);curl_setopt(CURLOPT_USERPWD [username]:[password] )

$data = curl_exec();curl_close($ch);?﹥

關於其它更多的內容 請參看相關的cURL手冊 lishixin/Article/program/PHP/201311/21491

⑼ 如何用PHP做網路爬蟲

其實用PHP來爬會非常方便,主要是PHP的正則表達式功能在搜集頁面連接方面很方便,另外PHP的fopen、file_get_contents以及libcur的函數非常方便的下載網頁內容。

⑽ 如何利用php抓取網站動態產生的數據

$url = "網站地址目錄";
$queryServer = curl_init();
curl_setopt($queryServer, CURLOPT_URL, $url);
curl_setopt($queryServer, CURLOPT_HEADER, 0);
curl_setopt($queryServer, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($queryServer, CURLOPT_RETURNTRANSFER, true);
curl_setopt($queryServer, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($queryServer, CURLOPT_TIMEOUT, 30);
$html = curl_exec($queryServer);
$html = iconv('UTF-8','GBK//IGNORE',$html); //如果你需要是的數據是utf-8編碼的,這一行可以注銷,如果需要gbk編碼的,請保留.如果出現亂碼,就是一行的問題,你自己調著試吧
//echo $holder;exit; 此處可以輸出來測試.
$html = str_replace(array("\n","\r","\t"),"",$html);
$preg = '/<table\s+width=\"800\"[^>]+>(.*?)<\/table>/';
preg_match_all($preg,$html,$out);
//匹配每行
preg_match_all('/<tr[^>]+>(.*?)<\/tr>/',$out[1][0],$tr);
//匹配每個td
$result = array();
$match = '/<td.+>([^<]+)<\/td>/U';
foreach( $tr[0] as $key => $value ){
preg_match_all($match,$value,$arr);
$result[] = $arr[1];
}
//輸出測試,$result就是你要的數據,至於你要怎麼輸出顯示格式,那就隨心調就好了。
foreach( $result as $key => $value ){
echo implode("\t",$value);
echo "<br>";
}
exit;

閱讀全文

與php爬蟲抓取數據相關的資料

熱點內容
單片機的反向編譯 瀏覽:461
subsample演算法 瀏覽:897
蘋果免費看書app哪個最好 瀏覽:881
c語言加密怎麼弄 瀏覽:838
c語言編譯的錯誤提示 瀏覽:765
驗機蘋果app哪個最好 瀏覽:664
光遇國際服安卓如何購買禮包 瀏覽:53
163app怎麼下載 瀏覽:245
電腦程序員下場 瀏覽:43
編譯原理ll1文法判斷 瀏覽:725
qt用vs2015編譯 瀏覽:549
結婚日子最好的演算法 瀏覽:792
安卓怎麼把數據傳到蘋果里 瀏覽:502
編譯器標識 瀏覽:790
編程珠璣第三章 瀏覽:783
windows如何開啟tftp伺服器 瀏覽:108
歐姆龍plc編程指令表 瀏覽:187
程序員遠程收入不穩定 瀏覽:861
演算法原理怎麼寫 瀏覽:470
有個動漫女主藍頭發是程序員 瀏覽:999