1. 程式人生 > >php爬蟲爬取豆瓣電影top250內容

php爬蟲爬取豆瓣電影top250內容

檢視豆瓣api文件

我們直接選擇top250之後往下翻閱可以看到引數需求,有兩個引數,start和count,分別代表請求開始的起始地址,這裡是從0開始的,count代表請求的數目。<br/><br/>

這裡寫圖片描述

返回資料有我們輸入的引數start、count,還有電影資料總數total和排行榜名稱,其中我們需要的關於電影的具體資料都在subjects下面。
這裡寫圖片描述

可以從瀏覽器上返回的結果看出我們已經得到了想要的返回資料,接下來我們要做的就是解析返回的json資料並且從其中得到我們想要的資料。

根據需要新建資料表

這裡寫圖片描述
id作為主索引,自增。

從網頁獲取資料然後解析格式

我們選擇用curl來獲取資料,然後對返回的json資料進行分析。

header("Content-type:text/html;charset=utf-8");
$url = "https://api.douban.com/v2/movie/top250start=6&count=1";
$ch = curl_init();
//設定引數
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$result = json_decode($result
,true); var_dump($result);

這裡寫圖片描述

由於我現在還學藝未精,不知道怎麼解析json資料最快,所以用的很笨也很慢的方法,就轉化為陣列進行提取,所以如果有大神看到這篇文章希望能指教一下我。

<?php
$con = mysql_connect('localhost','...','...');
if (!$con) {
            die('could not connect'.mysql_error());
} 
mysql_select_db('資料庫名',$con);
for ($i=0; $i<250; $i++) {  
    //echo $i."<br/>";
$url = "https://api.douban.com/v2/movie/top250? start=".$i."&count=1"; $ch = curl_init(); //設定引數 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //呼叫介面 $result = curl_exec($ch); $result = json_decode($result,true); $result = $result['subjects']; $genres = array_column($result, 'genres');//電影標籤 $gen = $genres[0]; $movieTag = ""; foreach ($gen as $key => $value) { if ($movieTag == null) { $movieTag .= $value; } else { $movieTag .= "、".$value; } } $title = array_column($result, 'title');//電影標題 $movieTitle = $title[0]; $original = array_column($result, 'original_title');//原始標題 $originTitle = $original[0]; $aver = array_column($result, 'rating');//電影評分 $aver1 = array_column($aver, 'average'); $average = $aver1[0]; $casts = array_column($result, 'casts');//電影主角姓名,字串 $actorName = ""; foreach ($casts as $key => $value) { $cast = array_column($value, 'name'); foreach ($cast as $key => $value) { if ($actorName == null) { $actorName .= $value; } else { $actorName .= "、".$value; } } } $director = array_column($result, 'directors');//導演姓名 $direc = $director[0][0]; $direc_name = $direc['name']; $year = array_column($result, 'year');//上映年份 $movie_date = $year[0]; $image = array_column($result, 'images');//電影海報 $images = $image[0]['medium']; $id = array_column($result, 'id');//電影豆瓣id $movie_id = $id[0]; $sql = "insert into bookData (id,title,movietag,origintitle,average,actorname,direcname,year,image)value ('$movie_id','$movieTitle','$movieTag','$originTitle','$average','$actorName','$direc_name','$movie_date','$images')"; if (!mysql_query($sql,$con)) { die('error.'.mysql_error()); } } curl_close($ch); mysql_close($con); ?>

問題總結

1、在進行多次測試的時候,遇到了豆瓣的錯誤返回程式碼, rate_limit_exceeded2 IP訪問速度限制,然後貌似是被禁止訪問了,但是差不多過了一個小時之後在測試就可以通過了。

2、上面的程式碼在測試的時候發現插入資料庫的時候出現了錯誤,導致我多次初始化i的值之後才獲取到所有的電影資訊。

3、不會使用正則表示式所以在提取主要內容的時候使用了比較繁瑣的方法,不過這也激勵了我去學習正則,目前還是太瓜皮,繼續進步。