1. 程式人生 > >php 實現簡單爬蟲

php 實現簡單爬蟲

大部分是由他人部落格轉載而來,  只是根據目前自己的情況進行了部分修改.

<?php
/**
 * 爬蟲程式 -- 原型
 *
 * 從給定的url獲取html內容
 * 
 * @param string $url 
 * @return string 
 */
function _getUrlContent($url) {
    $handle = fopen($url, "r");
    if ($handle) {
        $content = stream_get_contents($handle, 1024 * 1024);
        return $content;
    } else {
        return false;
    } 
} 
/**
 * 從html內容中篩選連結
 * 
 * @param string $web_content 
 * @return array 
 */
function _filterUrl($web_content) {
    $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
    $result = preg_match_all($reg_tag_a, $web_content, $match_result);
    if ($result) {
        return $match_result[1];
    } 
} 

function _filterimg($web_content){
	$reg_tag_img =  "/<img[^>]*src\=\"(([^>]*)(jpg|gif|png|bmp|jpeg))\"/i";
	$result = preg_match_all($reg_tag_img, $web_content, $match_result);
	if($result){
		return $match_result[1];
	}
}
/**
 * 修正相對路徑
 * 
 * @param string $base_url 
 * @param array $url_list 
 * @return array 
 */
function _reviseUrl($base_url, $url_list) {
    $url_info = parse_url($base_url);
    $base_url = $url_info["scheme"] . '://';
    if ($url_info["user"] && $url_info["pass"]) {
        $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";
    } 
    $base_url .= $url_info["host"];
    if ($url_info["port"]) {
        $base_url .= ":" . $url_info["port"];
    } 
    $base_url .= $url_info["path"];
    print_r($base_url);
    if (is_array($url_list)) {
        foreach ($url_list as $url_item) {
            if (preg_match('/^http/', $url_item)) {
                // 已經是完整的url
                $result[] = $url_item;
            } else {
                // 不完整的url
                $real_url = $base_url . '/' . $url_item;
                $result[] = $real_url;
            } 
        } 
        return $result;
    } else {
        return;
    } 
} 
/**
 * 爬蟲
 * 
 * @param string $url 
 * @return array 
 */
function crawler($url) {
    $content = _getUrlContent($url);
    if ($content) {
        $url_list = _reviseUrl($url, _filterUrl($content));
        if ($url_list) {
            return $url_list;
        } else {
            return ;
        } 
    } else {
        return ;
    } 
} 

function crawler_img($url){
	$content = _getUrlContent($url);
    if ($content) {
        $img_list = _filterimg($content);;
        if ($img_list) {
            return $img_list;
        } else {
            return ;
        } 
    } else {
        return ;
    } 
}
/**
 * 測試用主程式
 */
function main() {
    $current_url = "https://hao.360.cn/"; //初始url
    $fp_puts = fopen("url.txt", "ab"); //記錄url列表
    $fp_gets = fopen("url.txt", "r"); //儲存url列表
	$fp_puts_img = fopen("url-img.txt", "ab");
    do {
		$content = _getUrlContent($current_url);
        $img_url = _filterimg($content);
		foreach($img_url as $url){
			fputs($fp_puts_img, $url."\r\n");
			//echo $url;
			//echo "<br >";
			//GrabImage($url,$filename="");
		}
		
        $result_url_arr = crawler($current_url);
        if ($result_url_arr) {
            foreach ($result_url_arr as $url) {
				fputs($fp_puts, $url."\r\n");
            } 
        } 
		
    } while ($current_url = fgets($fp_gets, 1024)); //不斷獲得url
	//echo "ok";
} 


//以下是抓取網路圖片到本地


    // $url 是遠端圖片的完整URL地址,不能為空。
    // $filename 是可選變數: 如果為空,本地檔名將基於時間和日期
    // 自動生成.
    function GrabImage($url,$filename="") {
    if($url==""):return false;endif;
    $path="download/"; //指定儲存資料夾
    //若檔案不存在,則建立;
    if(!file_exists($path)){
    mkdir($path);
    }
    if($filename=="") {
    $ext=strrchr($url,".");
    if($ext!=".gif" && $ext!=".jpg" && $ext!=".bmp" && $ext!=".jpeg" && $ext!=".png"):return false;endif;
    $filename=$path.date("dMYHis").$ext;
    }
    ob_start();
    readfile($url);
    $img = ob_get_contents();
    ob_end_clean();
    $size = strlen($img);
    
[email protected]
($filename, "a"); fwrite($fp2,$img); fclose($fp2); return $filename; } function main_1(){ $current_url = "https://hao.360.cn/"; //初始url $content = _getUrlContent($current_url); $img_url = _filterimg($content); foreach($img_url as $url){ //echo $url; //echo "<br >"; GrabImage($url,$filename=""); } } //main_1(); main(); ?>

main() 是主程式,  該程式主要是通過 輸入一個起始地址, 比如 www.hao123.com 然後進行url 的搜尋 ,將頁面中所有url 儲存到 url.txt檔案中, 將所有頁面的圖片地址 儲存到url-img.txt 中  

儲存到本地的方式被登出了, 即 取消  //GrabImage($url,$filename=""); 這個的登出 就是進行儲存 不過目前經常只能儲存30張左右, 還不知道是網路問題還是檔案命名的問題.

明天可以繼續嘗試.

-------------------------------------------------------------------

昨天準備今天繼續嘗試, 結果今天做客有事 忙了一天, 所以php 的爬蟲目前就完成到這, 我明天準備開始用python寫爬蟲.因為畢竟主流的爬蟲程式還是不太用php的..

相關推薦

使用php實現簡單爬蟲(一種通用的爬蟲思想)

概述 現在爬蟲技術算是一個普遍的技術了,各個語言的爬蟲百家爭鳴,但是根據筆者自己的感覺還是python是主流。爬蟲涉及到太多的東西,筆者並不是專業的爬蟲工程師,只不過個人興趣分享一下。由於筆者是php工作,所以就使用php來進行簡單爬蟲。不過我的方法應該是很通用的,我相信java,

php 實現簡單爬蟲

大部分是由他人部落格轉載而來,  只是根據目前自己的情況進行了部分修改. <?php /** * 爬蟲程式 -- 原型 * * 從給定的url獲取html內容 * * @param string $url * @return string */

PHP 實現簡單的樹形列表。

開發 記錄 動態 數據庫設計 在線 最近在為公司開發一個在線瀏覽PDF文檔的小web系統。在構建動態列表的時候犯了愁,很久沒寫代碼了,手有些生了,搞了半天才搞出來,寫篇博文記錄一下。首先是數據庫設計我設計的一個列數為三列的表Treenodes,這三列分別用來存儲當前節點的id、節點名稱、父

PHP 實現簡單的樹形列表 之二

服務器 數據庫 字符串 小項目 function 2017.5.22 北京 大雨來到公司之後, 準備把代碼移植到公司的小項目裏,移植的過程中發現了一處設計有問題的地方,調整一下。第一處錯誤是:構建葉子節點的時候,只保存了節點的名稱,沒有存ID, 如果頁面跟後臺交互的時候,當存在節點名稱一樣

PHP實現簡單的評論與回復功能還有刪除信息

技術分享 mit [0 ech ges get values width 錯誤 我們首先先看一下功能 上面黑色的是評論的下面紅色的字體是回復的 再來看看怎麽實現的 1.發布評論 <form action="pinglunchili.php" method="po

Jquery+PHP實現簡單的前後臺數據交互實現註冊登錄,添加留言功能

.html 獲取系統時間 沒有 username explode 註冊賬號 trap ++ 方法   頁面樣式應用了BootStrap框架。   首先看登錄頁(登錄頁用於賬號登錄,也可以跳轉到註冊賬號頁): <!DOCTYPE html> <html&g

python實現簡單爬蟲功能

我們 目錄 size .com all 本地文件 使用 url alt  在我們日常上網瀏覽網頁的時候,經常會看到一些好看的圖片,我們就希望把這些圖片保存下載,或者用戶用來做桌面壁紙,或者用來做設計的素材。   我們最常規的做法就是通過鼠標右鍵,選擇另存為。但有些圖片鼠標右

php實現簡單的驗證碼功能

mage isset pat ech ace ring bcd ont es2017 1.根據php中的GD庫對圖片進行處理,繪制出驗證碼的圖片,code.php中2.表單界面,簡單的session保存及與用戶輸入對比,確定是否驗證正確,form.php中<?php

Python學習 —— 實現簡單爬蟲

發現 guid openssl 取圖 lib 列表 了解 菜鳥 頁面數據   為了加快學習python3.x於是直接看了許多有實際操作的小項目,查了許多資料後寫了這個腳本,這個腳本主要是爬取百度圖片‘東方幻想鄉‘的圖片,但發現有幾個問題:     1.圖片會重復兩次。

PHP實現簡單的雙色球機選號碼

tex ima 實現簡單 組成 輸出 img 簡單的 push each <?php header(‘Content-Type: text/html; charset=utf-8‘); //PHP實現雙色球機選號碼 $red = range(1, 33);//

PHP實現簡單的socket與異步應用

ins pos 結構 data timeout 撥號 而是 recv tcp 1.socket應用 (1)簡單概念     網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。   建立網絡通信連接至少要一對端口號(socket)。so

Python實現簡單爬蟲功能--批量下載百度貼吧裡的圖片

在上網瀏覽網頁的時候,經常會看到一些好看的圖片,我們就希望把這些圖片儲存下載,或者使用者用來做桌面桌布,或者用來做設計的素材。   我們最常規的做法就是通過滑鼠右鍵,選擇另存為。但有些圖片滑鼠右鍵的時候並沒有另存為選項,還有辦法就通過就是通過截圖工具擷取下來,但這樣就降低圖片的清晰度

初學PHP實現簡單的留言板 -> php+MySQL+Apache

效果圖: 1.在文字框輸入內容後,點擊發表留言,效果如下如所示.  2.資料庫中則將資料記錄了下來.     實現程式碼: gbook.php -> 資料視覺化介面 <

Node實現簡單爬蟲

1、新建一個專案 新建一個資料夾 安裝依賴 cnpm i --save PACKAGE_NAME 寫應用邏輯 2、核心邏輯 實現爬蟲需要用到三個依賴,分別是express、superagent、cheerio superagent是個http方面的庫,可以發

PHP實現簡單雙向連結串列

用PHP實現雙向連結串列,在實現上,與C++的區別,主要在指標與this的使用上的不同。在資料結構方面雙向連結串列要考慮兩個方向四個指向,每次增減節點時注意每個指向都要照顧到。 實現檔案DoubleLinkList.php <?php /** * **雙向連結串列 * @au

通過scrapy實現簡單爬蟲

Scrapy概述 網路爬蟲,大概很多人都聽說過吧。 它是通過一定的規則,自動抓取網際網路網站上的文章、資訊、圖片等等內容。 常見的應用就是搜尋引擎。 而Scrapy則是實現網路爬蟲的方式之一。 官方描述的Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可

php實現簡單的搶紅包

/** * 簡單 搶紅包 示例 */ header("Content-Type: text/html;charset=utf-8");//輸出不亂碼,你懂的 $total=10;//紅包總額

爬蟲系統基礎框架 & 何時使用爬蟲框架?& requests庫 + bs4來實現簡單爬蟲

www ica try 藍色 scrapy 定時 調度器 find use 轉載請註明出處https://www.jianshu.com/p/88f920936edc,謝謝! 一、 爬蟲用途和本質: 網絡爬蟲顧名思義即模仿???在網絡上爬取數據,網絡爬蟲的本質是一段自動抓

使用tornado實現簡單爬蟲

程式碼在官方文件的示例程式碼中有,但是作為一個tornado新手來說閱讀起來還是有點困難的,於是我在程式碼中添加了註釋,方便理解,程式碼如下: # coding=utf-8 #!/usr/bin/env python import time from da

用JAVA實現簡單爬蟲多執行緒抓取

在迴圈爬取得基礎上進行多執行緒爬蟲,本程式中使用的三個執行緒,執行緒為實現runnable介面,並使用物件鎖防止併發共同去訪問同一個物件。讓三個執行緒同時爬去同一個url並且得到的新的url不重複。 import java.io.*; import j