抓取
抓取文章分页的时候,之前的我用的是正则匹配,但是对正则的熟练程度不是很高
,效率比较低,于是就用simple dom ,simple dom的语法比较简单,容易上手.
抓取文章分页的时候主要是根据它的下一页这个节点进行判断,若有,把下一页的节点的链接匹配出来,继续往下判断(递归)….分页过多的时候,我们不在浏览器下执行,我们可以在cli 执行
当然别人不会乖乖免费给你抓数据的,有各种防抓取的方法。
1.可以在header伪造X-FORWARDED-FOR,并伪造referer
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:111.222.333.4', 'CLIENT-IP:111.222.333.4'));
curl_setopt($ch, CURLOPT_REFERER, "http://www.test.com");
2.上面的方法大多数能糊弄过去,但也有抓到了真实IP的。就使用代理,麻烦在于你有一个有效的代理ip和端口号,有的还需要用户名密码,代码如下
curl_setopt($ch, CURLOPT_PROXY, "http://111.222.333.4:110");
3.另外还有一种情况,就是用浏览器可以访问,用curl就是不行,发现对方检查了useragent,如果没有就认为是抓取等非法来源,那么我们就自己在header加上useragent,代码如下:
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11");
cli环境
首先我们需要将系统ini 文件进行替换,不然一些模块方法加载的时候会报错
然后进入cmd,输入
E:\wamp\bin\php\php5.3.10\php cli.php "request_uri=/Curl/car"
如果出现
Allowed memory size of 67108864 bytes exhausted
错误,我们可以通过使用
ini_set("memory_limit","512M");
或者我们可以在php.ini文件中把memory_limit参数默认的128M修改为256M或者更大:
注:如果运行过程中出现mysql has gone away 的状况,请断开连接,重新连接数据库一次。
OK ~~~nice