学了挺久,发现自己的理论基础确实很薄弱,基本功没有打好,就一直开发新东西,虽然能用,但是在资源和效率方面没做好。还有,现在做的东西,要用到的知识点太少了,很多以前学的,慢慢忘记了。很怀疑自己的记忆力,可是却又无从改变,只能写写博客,多记笔记了。
最近,刚做了个爬58网站的php爬虫,虽然效率没有python快,但是基本够用了。用到的技术有,ajax , curl 还有image的画布创建加水印的一些函数。
由于在抓包的时候,需要控制cpu的使用,所以不能连续抓包,只能够采用分段抓取的策略。这里,我用了ajax 和settimout() ,来定期地发送抓取请求到自己的服务器,触发抓取操作(间隔时间为(10s)。
curl是模拟浏览器,直接发送http请求,获取返回数据。其中配置方面:
$Curl=curl_init();//实例化cURL curl_setopt($Curl, CURLOPT_URL, $url);//初始化路径 curl_setopt($Curl, CURLOPT_RETURNTRANSFER, 1);//0获取后直接打印出来 curl_setopt($Curl, CURLOPT_HEADER, 0);//0关闭打印相应头,直接打印需为1, $result=curl_exec($Curl);//执行一个cURL会话 curl_close($Curl);//关闭cURL会话
在curl的配置上,还是很多记不住的东西。还要在研究一番。
对于抓取的包该这么处理好呢?如果用正则的话,信息量太大,会相当较麻烦,这里我用到了一个php解析DOM 树的框架 simple_html_dom 。它是将所有的html标签,类,id,直接转化成数组的形式,原理和操作跟Jquery相似。效果挺好的!
$houseCon = curl_get_content($houseUrl); $houseHtml = str_get_html($houseCon); $houseHtml->find('.tel-num',0)->plaintext; $houseHtml->find('article',0)->innertext; $houseHtml->find('.broker_sec_left img',0)->src;
$houseHtml->clear();
unset($houseHtml);
对于图片的处理,用到的函数
$dst = imagecreatefromstring(file_get_contents($imgDst)); $src = imagecreatefromstring(file_get_contents($imgSrc)); list($src_w, $src_h) = getimagesize($imgSrc); list($dst_w, $dst_h, $dst_type) = getimagesize($imgDst); imagecopy($dst, $src, $dst_x, $dst_y, 0, 0, $src_w, $src_h);//加上水印
之后就是输出图片
整个过程,差不多就这样。