php爬虫代码
凌晨三点,虫代我盯着终端里滚动的虫代数字,心跳跟着加速。虫代那是虫代我写的第一个php爬虫,正从某个电商网站抓取商品价格。虫代那一刻我突然明白——爬虫不是虫代技术,是虫代跟服务器玩捉迷藏的游戏。
php写爬虫,虫代最朴素的虫代方式就是file_get_contents。一行代码,虫代把整个网页当字符串吞进来。虫代但现实没那么温柔。虫代目标网站可能返回403,虫代可能给你一堆压缩乱码,虫代可能直接扔过来一个验证码页面。虫代我第一次跑就被教育了——那个网站检查User-Agent,默认的PHP标识被秒拒。
于是得伪装。构造HTTP头,把User-Agent改成Chrome浏览器的样子。代码大概是这样的:
$context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)' ] ]); $html = file_get_contents($url, false, $context); 这招对付简单站点够用,但遇到动态加载的内容就抓瞎。页面框架拿到了,数据却是JavaScript后填的。这时候得换思路——用cURL模拟完整请求,或者直接找接口。我有个习惯,打开浏览器开发者工具,盯着Network面板看XHR请求。很多时候,数据源就藏在那里,往往是个返回JSON的API。
解析HTML是另一道坎。正则表达式最灵活,但脆弱得离谱。改一个class名,整段匹配就崩了。后来我改用DOMDocument配合XPath,虽然啰嗦,但稳定得多。比如抓所有商品标题,先loadHTML,再query('//h2[@class="title"]'),逐个节点取文本。这过程像做精细解剖,每刀都得准。
有个项目让我印象特别深。某个旅游网站,分页数据藏在JavaScript变量里,不是标准的HTML。我花了三个小时调试,最后发现页面源码里有段json数据,用正则抠出来就能用。那种感觉——像是找到隐藏的保险柜密码,爽。
爬虫跑得慢是常态。目标服务器不是你家后院,得有礼貌。我习惯在每次请求之间sleep(1),加个随机延迟。有时候被反爬机制盯上,IP被封,那就得换代理。代理池的质量参差不齐,免费的经常失效,付费的又肉疼。最惨一次,我爬了半小时,发现存下来的全是同一张验证码图片——早就被识破了。
php的优势在于部署简单,虚拟主机就能跑cron定时任务。我常写个脚本,每天凌晨抓一次竞品价格,存到MySQL里。然后写个简单的报表页面,趋势图一目了然。这种小工具,用php做最顺手。缺点是长任务容易超时,内存控制也得留意。真要爬百万级数据,还是换Python或者Go靠谱。
写爬虫这几年,我总结出一条经验:先看robots.txt,尊重网站的规则。不是为了道德,是为了省事。被拉黑名单的滋味不好受。还有,抓到的数据别乱存,涉及用户隐私的赶紧删。去年有个同行因为爬取个人信息被起诉,赔了不少钱。技术无罪,但用技术的人得有分寸。
现在我的爬虫代码里,永远有一行注释——"最后修改:某个深夜"。那不是装酷,是提醒自己,每个能跑的爬虫背后,都是跟反爬机制的拉锯战。有时候睡一觉起来,昨天的代码就失效了,得重新分析页面结构。这活计不轻松,但当你看到数据稳稳落进数据库的那一刻,什么疲惫都值了。
php爬虫,说到底就是一场猫鼠游戏。你永远不知道下一版网页会改成什么样,但总有办法绕过去。这种持续较劲的感觉,大概就是程序员的本能吧。
