天天看點

CURL 采集

........行符以外的任意字元

\w  比對字母或數字或下劃線【應該是word的首字母】

\s  比對任意的空白符    【space首字母】

\d  比對數字          【英文Digital的首位字母】

\b  比對單詞的開始或結束 【begin首字母】

^   比對字元串的開始

$   比對字元串的結束

*   重複零次或更多次

+   重複一次或更多次

?   重複零次或一次

{n} 重複n次

{n,}    重複n次或更多次

{n,m}   重複n到m次

//反義

\W  比對任意不是字母,數字,下劃線

\S  比對任意不是空白符的字元

\D  比對任意非數字的字元

\B  比對不是單詞開頭或結束的位置

[^x]    比對除了x以外的任意字元

[^aeiou]    比對除了aeiou這幾個字母以外的任意字元

PHP正規表達式模式後面通常帶有 /i, /is, /s, /isU等參數說明

i  比對大小寫

s 模式中的圓點元字元(.)比對所有的字元,包括換行符

x 模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略,在未轉義的字元類之外的 # 以及下一個換行符之間的所有字元,包括兩 頭,也都被忽略

A (PCRE_ANCHORED) 如果設定了此修正符,模式被強制為“anchored”,即強制僅從目标字元串的開頭開始比對即自動在模式開頭加上^。

D (PCRE_DOLLAR_ENDONLY) 如果設定了此修正符,模式中的美元元字元僅比對目标字元串的結尾。沒有此選項時,如果最後一個字元是換行符的話,美元符号也會比對此字元之前(但不會比對 任何其它換行符之前)。如果設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。  S 當一個模式将被使用若幹次時,為加速比對起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored 模式有用。 

U (PCRE_UNGREEDY) 本修正符反轉了比對數量的值使其不是預設的重複,而變成在後面跟上“?”才變得重複。這和 Perl 不相容。也可以通過在模式之中設定 (?U) 修正符來啟用此選項。

X (PCRE_EXTRA) 此 修正符啟用了一個 PCRE 中與 Perl 不相容的額外功能。模式中的任何反斜線後面跟上一個沒有特殊意義的字母導緻一個錯誤,進而保留此組合以備将 來擴充。預設情況下,和 Perl 一樣,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。目前沒有其它特性受此修正符控制。即:貪婪模式,最 大限度比對 如:/a[/w]+?e/U比對abceadeddd中的abceade而不是abce,如果不加U修正,則比對abce  u (PCRE_UTF8) 此修正符啟用了一個 PCRE 中與 Perl 不相容的額外功能。模式字元串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。

php的正則相關的函數

PCRE 函數

函數 描述
preg_filter 執行一個正規表達式搜尋和替換
preg_grep 傳回比對模式的數組條目
preg_last_error 傳回最後一個PCRE正則執行産生的錯誤代碼
preg_match_all【正規表達式比對多次】 執行一個全局正規表達式比對
preg_match【正規表達式比對一次】 執行一個正規表達式比對
preg_quote 轉義正規表達式字元
preg_replace_callback_array 執行一個正規表達式搜尋并且使用一個回調進行替換
preg_replace_callback 執行一個正規表達式搜尋并且使用一個回調進行替換
preg_replace 執行一個正規表達式的搜尋和替換
preg_split 通過一個正規表達式分隔字元串

重點函數的文法:

int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

搜尋 subject 中所有比對 pattern 給定正規表達式的比對結果并且将它們以 flag 指定順序輸出到 matches 中。

在第一個比對找到後, 子序列繼續從最後一次比對位置搜尋。

參數說明:

  • $pattern: 要搜尋的模式,字元串形式。
  • $subject: 輸入字元串。
  • $matches: 多元數組,作為輸出參數輸出所有比對結果, 數組排序通過flags指定。
  • $flags:可以結合下面标記使用(注意不能同時使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
    1. PREG_PATTERN_ORDER: 結果排序為$matches[0]儲存完整模式的所有比對, $matches[1] 儲存第一個子組的所有比對,以此類推。
    2. PREG_SET_ORDER: 結果排序為$matches[0]包含第一次比對得到的所有比對(包含子組), $matches[1]是包含第二次比對到的所有比對(包含子組)的數組,以此類推。
    3. PREG_OFFSET_CAPTURE: 如果這個标記被傳遞,每個發現的比對傳回時會增加它相對目标字元串的偏移量。
  • offset: 通常, 查找時從目标字元串的開始位置開始。可選參數offset用于 從目标字元串中指定位置開始搜尋(機關是位元組)。

preg_match 函數用于執行一個正規表達式比對。

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

  • $pattern: 要搜尋的模式,字元串形式。
  • $subject: 輸入字元串。
  • $matches: 如果提供了參數matches,它将被填充為搜尋結果。 $matches[0]将包含完整模式比對到的文本, $matches[1] 将包含第一個捕獲子組比對到的文本,以此類推。
  • $flags:flags 可以被設定為以下标記值:
    1. PREG_OFFSET_CAPTURE: 如果傳遞了這個标記,對于每一個出現的比對傳回時會附加字元串偏移量(相對于目标字元串的)。 注意:這會改變填充到matches參數的數組,使其每個元素成為一個由 第0個元素是比對到的字元串,第1個元素是該比對字元串 在目标字元串subject中的偏移量。
  • offset: 通常,搜尋從目标字元串的開始位置開始。可選參數 offset 用于 指定從目标字元串的某個未知開始搜尋(機關是位元組)。

兩個函數的差別:

preg_match 比對到一次就會停止,設定比對到的一個比對

preg_match_all 會一直比對下去。直到字元串結束,設定比對到的所有比對【推薦】

curl [Client URL Library Functions]

PHP 支援 Daniel Stenberg 建立的 libcurl 庫,能夠連接配接通訊各種伺服器、使用各種協定。libcurl 目前支援的協定有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時支援 HTTPS 證書、HTTP POST、HTTP PUT、 FTP 上傳(也能通過 PHP 的 FTP 擴充完成)、HTTP 基于表單的上傳、代理、cookies、使用者名+密碼的認證。

curl是用戶端向伺服器端請求的一個工具

 cURL是一個強大的庫,能夠連接配接通訊各種伺服器、使用各種協定。同時支援 HTTPS 證書、HTTP POST、HTTP PUT、 FTP 上傳(也能通過 PHP 的 FTP 擴充完成)、HTTP 基于表單的上傳、代理、cookies、使用者名+密碼的認證。

對于網頁資源

--編寫爬蟲

websevice資料接口資源

--可以動态擷取接口上的資料,比如天氣預報、号碼歸屬地、短信

ftp伺服器 裡面的檔案資源

--下載下傳ftp伺服器裡面的檔案

其他的資源

--所有網絡的資源都可以用curl通路和下載下傳。

curl( curl is a command ling tool for transferrng data whih URL ) 采集url傳輸資料的指令工具

常用函數

采集

$curl=curl_init('http://www.baidu.com/');//初始化一個curl 參數可以直接寫采集的位址 //在這裡采集注意是 http還是https的協定 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);//設定采集不直接輸出 $data=curl_exec($curl);//執行采集 print_r($data);

天氣預報查詢

前台html頁面

<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"> </script> 城市 <input type="text" name="weaid" class="weaid"><input type="button" class="btn "value="查詢"> <table> <tr> <td>溫度</td> <td class="temperature"></td> </tr> <tr> <td>天氣</td> <td class="weather_curr"></td> </tr> <tr> <td>圖示</td> <td class="weather_icon"><img ></td> </tr> </table> <script> $('.btn').click(function(){ var weaid = $('.weaid').val();//擷取使用者輸入的城市的資訊 $.get('weather.php',{weaid:weaid},function (data) { console.log(data); temperature =data.result.temperature; $('.temperature').text(temperature); weather_curr =data.result.weather_curr; $('.weather_curr').text(weather_curr); weather_icon =data.result.weather_icon; $('.weather_icon img').attr('src',weather_icon); },'json') }) </script>

背景php頁面,接收資料,傳回給前台頁面

$ch=curl_init();//初始化curl $weaid=$_GET['weaid']; $appkey='42767'; $sign='f2c0982883594a157d5a7909345b74e1'; $url="http://api.k780.com/?app=weather.today&weaid=$weaid&appkey=$appkey&sign=$sign&format=json";//采集的位址 curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//将采集的資料不直接輸出 curl_setopt($ch,CURLOPT_URL,$url);//設定采集的位址 $data = curl_exec($ch); echo $data;

百度翻譯接口

<?php $q="banana"; $from="en"; $to="zh"; $appid="20190529000302898"; $salt=rand(1000000000,9999999999); $sign1="OlcAZuodFb2vaOmXYPBS"; $sign=md5($appid.$q.$salt.$sign1); $url="http://api.fanyi.baidu.com/api/trans/vip/translate?q=$q&from=$from&to=$to&appid=$appid&salt=$salt&sign=$sign"; echo $url; $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $data=curl_exec($ch); echo $data;

curl采集入庫

源碼采集

$ch = curl_init();//初始化curl $url="https://www.huodongxing.com/search?ps=12&pi=0&list=list&qs=it&st=1,4&city=%E4%B8%8A%E6%B5%B7"; curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//不直接輸出 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//關閉ssl認證 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//關閉ssl認證 curl_setopt($ch,CURLOPT_URL,$url);//設定采集的位址 $data = curl_exec($ch); $reg='#<div class="search-tab-content-item flex">.*<img class="item-logo" src="(.*)" alt=".*" title=".*">.*<a class="item-title" href="(.*)" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" title=".*">(.*)</a>.*<p class="item-data flex"><span class="item-data-icon icon"></span>(.*)</p>.*<p class="user-name" style="max-width:120px;" title=".*">(.*)</p>.*</div>.*</div>#isU'; preg_match_all($reg,$data,$reslut);//正則表達是比對 參數 1正則 參數2 資料 參數 3 比對的内容 $src=$reslut[1]; $title=$reslut[3]; $href=$reslut[2]; $time=$reslut[4]; $author=$reslut[5]; $sql="insert into news3(title,href,`time`,author,img) values"; foreach($src as $k=>$value){ $href="https://www.huodongxing.com" target="_blank" rel="external nofollow" .$href[$k]; $sql.="('$title[$k]','$href','$time[$k]','$author[$k]','$value'),"; } $sql = substr($sql,0,-1); $dbh = new PDO('mysql:host=127.0.0.1;dbname=1901a', 'root', 'root'); $dbh->setAttribute(PDO::ATTR_ERRMODE,true); $res = $dbh->exec($sql); if($res){ echo "OK"; }else{ echo "no"; }

在架構中采集

public function getInfo() { $url="https://www.cnblogs.com/jiangshiguo/";//采集的網址 $ch = curl_init();//初始化curl curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//将結果不直接輸出 curl_setopt($ch,CURLOPT_URL,$url); //因為采集的網址是https的ssl證書認證 關閉 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); $data =curl_exec($ch); $reg='#<div class="day">.*<div class="dayTitle">.*<a href="(.*)" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >(.*)</a>.*</div>.*<div class="postTitle">.*<a class="postTitle2 vertical-middle" href=".*" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >.*<span>(.*)</span>.*</a>.*</div>.*<div class="postCon">.*<div class="c_b_p_desc">(.*)<a href=".*" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" class="c_b_p_desc_readmore">閱讀全文</a>.*</div>.*<div class="postDesc">(.*)<span data-post-id=".*" class="post-view-count">.*</span>#isU'; preg_match_all($reg,$data,$result); //print_r($result); $href=$result[1]; $time=$result[2]; $title=$result[3]; $desction=$result[4]; $author=$result[5]; $arr=[]; foreach($href as $k=>$v){ $arr[$k]['href']=$v; $arr[$k]['time']=$time[$k]; $arr[$k]['title']=trim($title[$k]); $arr[$k]['desction']=trim($desction[$k]); $arr[$k]['author']=trim(substr($author[$k],26)); } print_r($arr); DB::table('news3')->insert($arr); }

Querylist采集資料

laravel架構配置querylist

将querylist架構放入vendor目錄下

CURL 采集

在入口檔案引入自動加載檔案

CURL 采集

入口檔案添加引入【注意仔細檢查autoload.php檔案的位置】

require __DIR__.'/../vendor/QueryList/vendor/autoload.php';

控制器層代碼

public function getNews(){ $data=QueryList::get('https://www.huodongxing.com/search?ps=12&pi=3&list=list&qs=it&st=1,4') ->rules([ 'images'=>['.search-tab-content-item .item-logo','src'], 'title'=>['.search-tab-content-item .item-title','text'], 'href'=>['.search-tab-content-item .item-title','href'], 'times'=>['.search-tab-content-item .item-data','text'], 'address'=>['.search-tab-content-item .item-dress','text'], 'author'=>['.search-tab-content-item .user-name','text'], ]) ->queryData(); $res=Fours::add($data); if($res){ echo "添加成功"; }else{ echo "添加失敗"; } }

模型層

protected $table="news"; public $timestamps=false;//關閉時間戳 public static function add($data){ return self::insert($data); }

單條采集

CURL 采集