php数据采集难点,php采集网页数据
php curl 大量数据采集
这个需要配合js,打开一个html页面,首先js用ajax请求页面,返回第一个页面信息确定处理完毕(ajax有强制同步功能),ajax再访问第二个页面。(或者根据服务器状况,你可以同时提交几个URL,跑几个相同的页面)
成都创新互联主要从事成都网站设计、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务榆中,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
参数可以由js产生并传递url,php后台页面根据URL抓页面。然后ajax通过php,在数据库或者是哪里设一个标量,标明检测到哪里。由于前台的html页面执行多少时候都没问题,这样php的内存限制和执行时间限制就解决了。
因为不会浪费大量的资源用一个页面来跑一个瞬间500次的for循环了。(你的500次for循环死了原因可能是获取的数据太多,大过了php限制的内存)
不过印象中curl好像也有强制同步的选项,就是等待一个抓取后再执行下一步。但是这个500次都是用一个页面线程处理,也就是说肯定会远远大于30秒的默认执行时间。
php采集是运行一段时间就会卡住!如何解?
卡住的原因很多,主要可能有以下几个原因 : 1、浏览器内存容量占用问题,当一个页面不停不停的增加内容时,浏览器有可能因渲染引擎的问题而卡住 。比如你打开一个大型的JS程序,里面不停的加截图片等资源 。 2、采集远程文件时候,对方进行了限制。有些服务器为了防止 非正常用户访问,会对访问者进行拦截,比如有些页面,用户停留时间才十几MS,或一个用户有几十个HTTP请求,那么服务器会暂停返回数据 。 3、所写的采集程序挂了。 具体 是哪一个原因 ,可以写log跟一下
php采集大数据的方案
1、建议你读写数据和下载图片分开,各用不同的进程完成。
比如说,取数据用get-data.php,下载图片用get-image.php。
2、多进程的话,php可以简单的用pcntl_fork()。这样可以并发多个子进程。
但是我不建议你用fork,我建议你安装一个gearman worker。这样你要并发几个,就启几个worker,写代码简单,根本不用在代码里考虑thread啊,process等等。
3、综上,解决方案这样:
(1)安装gearman worker。
(2)写一个get-data.php,在crontab里设置它每5分钟执行一次,只负责读数据,然后把读回来的数据一条一条的扔到 gearman worker的队列里;
然后再写一个处理数据的脚本作为worker,例如叫process-data.php,这个脚本常驻内存。它作为worker从geraman 队列里读出一条一条的数据,然后跟你的数据库老数据比较,进行你的业务逻辑。如果你要10个并发,那就启动10个process-data.php好了。处理完后,如果图片地址有变动需要下载图片,就把图片地址扔到 gearman worker的另一个队列里。
(3)再写一个download-data.php,作为下载图片的worker,同样,你启动10个20个并发随便你。这个进程也常驻内存运行,从gearman worker的图片数据队列里取数据出来,下载图片
4、常驻进程的话,就是在代码里写个while(true)死循环,让它一直运行好了。如果怕内存泄露啥的,你可以每循环10万次退出一下。然后在crontab里设置,每分钟检查一下进程有没有启动,比如说这样启动3个process-data worker进程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'
不知道你明白了没有
PHP 数据采集 太慢
一页一页采啊,你要是想把N个网页一下子采下来,在浏览器中肯定不行,你可以用php.exe在命令行下运行你的采集脚本。如果你想在浏览器上采,你得一次采集一个页面,然后用window.location.href转向,把下一个要采集的地址传过去,这样一页一页的循环来采集。
文章标题:php数据采集难点,php采集网页数据
本文网址:http://ybzwz.com/article/hoseip.html