你是否也曾碰到过想要去扒取某个网页的源码,然而却发觉file_get_contents直接就报错了,又或者是抓下来的内容全部都是乱码呢?别着急,就在今天会把PHP抓取网页源码这件事情给你讲述透彻,从最为简单的函数开始,一直到能够绕开反爬的cURL实战,全部都是通俗易懂的干货。
先试试最简单的file_get_contents
这种方式最为径直,恰似借由浏览器去开启网页进而查看源码一样容易便捷。其前提条件是你的PHP环境开启了allow_url_fopen配置,通常于虚拟主机之中都是默认予以开启的。编制一行代码便能够获取到百度首页的HTML,即:echo file_get_contents('https://www.baidu.com')。
但是存在一个需要留意的坑,要是面向的目标网站所返回的并非UTF - 8编码,举例来说老站点依旧在使用GBK,那么你直接进行输出就会目睹一堆乱码。在这种时候能够运用mb_convert_encoding函数加以转换,将GBK转换为UTF - 8,这样页面显示才会恢复正常。
这个办法虽说简易,然而要是碰到设有反爬机制或者求取繁杂请求头的站点那就无果了。举个例子 ,你若打算抓取淘宝的商品页面,采用这种方式直接操作大多都会返回403错误,服务器压根就不理会你。
用cURL实现更灵活的抓取
cURL如同是给你的PHP配备了一个专门的浏览器内核,它能够模拟各类HTTP请求。首先通过curl_init初始化一场会话,接着运用curl_setopt设定各种选项,最终借助curl_exec执行并将结果返还给变量。
极其重要的一个步骤是将CURLOPT_RETURNTRANSFER设定为true,如此一来cURL并非直接输出结果,而是会将网页源码当作字符串回传给你。抓取完成之后要记得运用curl_close去关闭资源,不然的话会占用服务器连接。
利用这个方式,你能够自行作超时时间的设定,能够进行跟随重定向的操作,甚至还能够开展cookie的设置。举例而言,要是抓取那种需要登录的网站,那么你先模拟登录从而获取cookie,之后带着cookie去抓取目标页面。
伪装浏览器绕过基础反爬
于当前,稍微具备点规模的网站,皆会对User - Agent展开检查,倘若你运用默认的cURL请求头,那么一眼便会被识别为爬虫。而解决的办法乃是要将自身伪装成Chrome或者Firefox浏览器。
构造一个HTTP头数组,在其中写入常见的浏览器User - Agent,像"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" ,接着借助stream_context_create创建上下文,随后将其传递给file_get_contents。
更加高级别的伪装,还需要带上Accept-Language、Referer这类头。比如说,你要是想对知乎进行抓取,最好将Referer设置成知乎首页,不然的话,就有可能触发防盗链机制。通过这一系列的组合操作,大部分基础的反爬就能够被绕开了。
处理HTTPS证书验证问题
进行针对HTTPS站点的抓取操作之际,常常会碰到SSL证书错误的状况,尤其是自签名证书或者证书过期这类情形。cURL会直接给出报错并终止请求,在这个时候,就需要于测试环境之中暂时把证书验证予以关闭。
使用curl_setopt函数,将其中的$ch参数,搭配CURLOPT_SSL_VERIFYPEER选项,设为false,如此便能够禁用证书验证,接着再把CURLOPT_SSL_VERIFYHOST设为0,以此关闭主机名校验。然而要记住,这种做法仅仅适用于本地开发,对于线上环境而言,千万不要这样去做,不然的话,中间人攻击就能够直接窃取你的数据。
下载CA证书包这种正规的做法,在cURL里面要通过配置CURLOPT_CAINFO来指向证书文件,如此一来,既能保障安全,又能够正常抓取HTTPS站点,而好多云服务器厂商都提供了CA证书的自动更新服务。
处理动态加载内容的难题
讲述的那些均是针对抓取静态HTML而言,可不现在好多网站运用Ajax进行动态数据加载嘛。你直接去抓取源码仅仅能够获取到空的框架,而真正的内容乃是借助JS以异步方式请求的JSON接口呀。
这时就需要借助开发者工具去剖析网络请求,进而寻觅到真实的数据接口,像是某新闻网站的文章内容,或许隐匿于api.xxx.com/getArticle这个接口之中,直接抓取该接口返回的JSON数据,随后进行解析便可。
要是碰到更厉害的,比如说像抖音这种全站都是进行JS渲染的情况,那就得使用Headless浏览器了。PHP能够借助调用Nodejs的Puppeteer服务,或者采用Selenium来驱动真实的浏览器,不过这样做的代价就是抓取速度会慢上许多了。
抓取频率控制与法律风险
万万别开启那种会陷入无止境循环、持续抓取他人网站的行为,小型站点很有可能会因你的抓取而直接陷入瘫痪状态,大型企业则会直接封禁你的网络协议地址。恰当的做法是在两次发出请求的期间加入一段等待一秒的代码,每秒钟最多抓取一个网页页面,如此一来既不会对对方的服务器运作产生干扰,自身也不太容易遭遇被封禁的情况。
更是需要予以留意的是版权方面的问题,举例来说,像是把小说网站的内容进行抓取后,拿去用于自身建站,这属于毫无遮掩的侵权行为,在2023年的时候,就存在有程序员因爬取数据库并公开售卖而被判刑的相关案例,建议仅仅抓取公开的数据,并且要遵循网站的robots.txt协议。
提及此处,你是否已然跃跃欲试,摩拳擦掌想要尝试一番了呢?你于抓取网页之际,所遭遇的最为奇葩的反爬机制究竟是什么呢?热烈欢迎在评论区域分享你那踩坑的经历,点赞并收藏这篇文章,如此一来,下次撰写爬虫之时便能够直接拿来运用了!


还没有评论,来说两句吧...