一、准备
1.弄清自己需要的数据
2.分析数据的规律
3.分析保存数据的方式(文本文件或数据库)
二、模拟http请求,获得源码
这里模拟http请求我用的是curl模拟的,具体实现代码:
/**
* Curl请求
*
* @param string $requesturl //请求URL
* @param string $reuqestmothed //请求方法 默认false(为GET) true(为POST)
* @param int $httpcode http状态码 以引用的形式传递
* @param int $postdata post的数据
* @return string or false
*/
function curlRequest($requesturl,$reuqestmethod=false,& $httpcode=0,$postdata=NULL) {
try {
$options = array(
CURLOPT_URL => $requesturl,
CURLOPT_RETURNTRANSFER => true,//启用回去返回数据
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_POST => $reuqestmethod
);
if(true===$reuqestmethod){
$options[CURLOPT_POSTFIELDS] = $postdata;
}
$ch = curl_init();//初始化
curl_setopt_array($ch,$options);//参数设置
$rs = curl_exec($ch);//执行s
$httpcode =curl_getinfo($ch,CURLINFO_HTTP_CODE); //http状态码
curl_close($ch);
unset($ch);
return $rs;
}catch (Exception $ex){
throw $ex;
}
}
$url = 'http://www.html5tricks.com/page/1'; //要扒取数据的网页
$res = curlRequest($url);
var_dump($res);//返回的就是html源码
三、分析源码规律
分析html源码的规律,一般数据都是有规律的显示在页面上,可以正则匹配获取需要的数据,也可根据规律字符串拆分,这里我放一个我的做的实例:
/**
* 扒数据
*/
public function readTxt()
{
for ($i = 0; $i < 108; $i ++) {
$url = 'http://www.html5tricks.com/page/' . $i;
$res = curlRequest($url);
$html = preg_replace("/[\t\n\r]+/", "", $res);
$array1 = explode("<article", $html);
foreach ($array1 as $key => $val) {
if ($key > 0) {
$array2 = explode("</h1>", $val);
$i1 = preg_match('/(\"+(.*?)*\"+)/i', $array2[0], $matches);
// id
$id = str_replace('"', '', $matches[0]);
// 标题
$title = strip_tags($array2[0]);
$title = explode(">", $title);
$title = $title[1];
// 内容
$c = explode('<div class="entry-content">', $array2[1]);
preg_match_all('/<p>(.*?)<\/p>/', $c[1], $arr3);
$content = strip_tags($arr3[0][0]);
// 图片---下载保存图片,图片以id命名
preg_match_all('/(src\=\"+(.*?)*\"+)/i', $arr3[0][1], $img);
// 特例:直接返回
if (empty($img[0])) {
continue;
}
$imgurl = $img[0][0];
$imgurl = explode('"', $imgurl);
$imgurl = $imgurl[1];
// $res = $this->http_get_data($imgurl);
$dir = "E:\\dataimg2\\";
$filename = $dir . $id . ".png";
$imgfilename = '\\' . $id . ".png";
// $fp = @fopen($filename, "a"); // 将文件绑定到流
// fwrite($fp, $res); // 写入文件
// fclose($fp);
// 演示地址
$d = explode('</div>', $c[1]);
$d = explode('<p class="tricksButtons">', $d[0]);
//特例:直接返回
if (! isset($d[1])) {
continue;
}
preg_match_all('/(href\=\"+(.*?)*\"+)/i', $d[1], $demo);
if (empty($demo[0])) {
continue;
}
$demoUrl = $demo[0][0];
$demoUrl = explode('"', $demoUrl);
$demoUrl = $demoUrl[1];
// 源码下载
$downloadUrl = $demo[0][1];
$downloadUrl = explode('"', $downloadUrl);
$downloadUrl = $downloadUrl[1];
// exit();
$this->insert($id, $title, $content, $imgfilename,
$demoUrl, $downloadUrl, time());//将结果保存数据库
}
}
// exit();
// sleep(1); 防止ip限制,休息一秒
}
exit();
}
四、保存结果到数据库
$mysql_server_name = 'localhost'; // 改成自己的mysql数据库服务器
$mysql_username = 'root'; // 改成自己的mysql数据库用户名
$mysql_password = ''; // 改成自己的mysql数据库密码
$mysql_database = 'test'; // 改成自己的mysql数据库名
$conn = mysql_connect($mysql_server_name, $mysql_username,
$mysql_password) or die("error connecting"); // 连接数据库
mysql_query("set names 'utf8'"); // 数据库输出编码
mysql_select_db($mysql_database); // 打开数据库
set_time_limit(0);
/**
* 插入数据库
*
* @param unknown $keyword
*/
public function insert($Did, $Title, $Content, $Img, $DemoUrl, $DownloadUrl, $AddTime)
{
try {
$sql = "insert into data(Did,Title,Content,Img,DemoUrl,DownloadUrl,AddTime)values('" . $Did . "','" . $Title . "','" . $Content . "','" . $Img . "','" . $DemoUrl . "','" . $DownloadUrl . "'," . $AddTime . ")"; // SQL语句
show_bug(mysql_query($sql));
show_bug(mysql_error());
echo '<hr/>';
} catch (Exception $e) {
echo $e;
}
}
获得最终数据后,还要根据自己的需求进一步对数据进行改正处理