重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一页一页采啊,你要是想把N个网页一下子采下来,在浏览器中肯定不行,你可以用php.exe在命令行下运行你的采集脚本。如果你想在浏览器上采,你得一次采集一个页面,然后用window.location.href转向,把下一个要采集的地址传过去,这样一页一页的循环来采集。
成都创新互联是一家集网站建设,宝鸡企业网站建设,宝鸡品牌网站建设,网站定制,宝鸡网站建设报价,网络营销,网络优化,宝鸡网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
php数据采集常见技术要领:
1、熟练正则表达式提取数据技术:提取内容关键步骤
2、熟练字符编码转换分析技术:兼容性管理以及数据有效性控制
3、熟练数据出库入库整理技术:对已采集内容的存储管理,包括数据库以及文件和进度
4、发掘数据以及网站爬行技术:分析网站结构,简化爬行手法,提高效率
5、反反采集处理技术:对于存在反采集的目标对象而设计的反反采集技术
6、多服务器并发采集管理技术:提高效率的工作方法
7、数据整理分析技术:查漏验证数据正确性有效性
8、自我身份保护技术:自身信息的保护
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'
不知道你明白了没有
用fopen/file/file_get_contents/curl之类的函数将远程页面获得内容, 采用正则或过滤之类的获得自己所需要的东西, 最好写入相应的数据库保存起来。
其实用不着这么麻烦的,采集时,你看到的图片路径是相对地址,是相对当前域名的一个相对路径而已,你只要在前面加上
http://当前域名(采集内容的域名,比如zhidao.baidu.com)/
就是它的绝对地址了,
就像/abc.jpg一样
http://当前域名(采集内容的域名,比如zhidao.baidu.com)/abc.jpg就是绝对地址了
没必要搞复杂
简单的分了几个步骤:
1、确定采集目标
2、获取目标远程页面内容(curl、file_get_contents)
3、分析页面html源码,正则匹配你需要的内容(preg_match、preg_match_all),这一步最为重要,不同页面正则匹配规则不一样
4、入库