PHP利用Curl实现多线程抓取网页和下载文件
PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件.
至于具体实现过程,请参考下面几个例子:
1、实现抓取多个URL并将内容写入指定的文件
- $urls = array(
- '路径地址',
- '路径地址',
- '路径地址'
- ); // 设置要抓取的页面URL
- $save_to='/test.txt'; // 把抓取的代码写入该文件
- $st = fopen($save_to,"a");
- $mh = curl_multi_init();
- foreach ($urls as $i => $url) {
- $conn[$i] = curl_init($url);
- curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
- curl_setopt($conn[$i], CURLOPT_HEADER ,0);
- curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
- curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
- curl_multi_add_handle ($mh,$conn[$i]);
- } // 初始化
- do {
- curl_multi_exec($mh,$active);
- } while ($active); // 执行
- foreach ($urls as $i => $url) {
- curl_multi_remove_handle($mh,$conn[$i]);
- curl_close($conn[$i]);
- } // 结束清理
- curl_multi_close($mh);
- fclose($st);
2、利用 PHP 的 Curl 实现抓取网页URL并保存内容
下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件
- $urls = array(
- '路径地址',
- '路径地址',
- '路径地址'
- );
- $save_to='/test.txt'; // 把抓取的代码写入该文件
- $st = fopen($save_to,"a");
- $mh = curl_multi_init();
- foreach ($urls as $i => $url) {
- $conn[$i] = curl_init($url);
- curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
- curl_setopt($conn[$i], CURLOPT_HEADER ,0);
- curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
- curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
- curl_multi_add_handle ($mh,$conn[$i]);
- }
- do {
- curl_multi_exec($mh,$active);
- } while ($active);
- foreach ($urls as $i => $url) {
- $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
- fwrite($st,$data); // 将字符串写入文件
- } // 获得数据变量,并写入文件
- foreach ($urls as $i => $url) {
- curl_multi_remove_handle($mh,$conn[$i]);
- curl_close($conn[$i]);
- }
- curl_multi_close($mh);
- fclose($st);
3、利用 PHP 的 Curl 实现并发多线程下载文件
- $urls=array(
- '路径地址5w.zip',
- '路径地址5w.zip',
- '路径地址5w.zip'
- );
- $save_to='./home/';
- $mh=curl_multi_init();
- foreach($urls as $i=>$url){
- $g=$save_to.basename($url);
- if(!is_file($g)){
- $conn[$i]=curl_init($url);
- $fp[$i]=fopen($g,"w");
- curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
- curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
- curl_setopt($conn[$i],CURLOPT_HEADER ,0);
- curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
- curl_multi_add_handle($mh,$conn[$i]);
- }
- }
- do{
- $n=curl_multi_exec($mh,$active);
- }while($active);
- foreach($urls as $i=>$url){
- curl_multi_remove_handle($mh,$conn[$i]);
- curl_close($conn[$i]);
- fclose($fp[$i]);
- }
- curl_multi_close($mh);$urls=array(
- '路径地址5w.zip',
- '路径地址5w.zip',
- '路径地址5w.zip'
- );
- $save_to='./home/';
- $mh=curl_multi_init();
- foreach($urls as $i=>$url){
- $g=$save_to.basename($url);
- if(!is_file($g)){
- $conn[$i]=curl_init($url);
- $fp[$i]=fopen($g,"w");
- curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
- curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
- curl_setopt($conn[$i],CURLOPT_HEADER ,0);
- curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
- curl_multi_add_handle($mh,$conn[$i]);
- }
- }
- do{
- $n=curl_multi_exec($mh,$active);
- }while($active);
- foreach($urls as $i=>$url){
- curl_multi_remove_handle($mh,$conn[$i]);
- curl_close($conn[$i]);
- fclose($fp[$i]);
- }
- curl_multi_close($mh);
PHP利用Curl实现多线程抓取网页和下载文件的更多相关文章
- 通过curl模拟多线程抓取网页(curl_multi_*)
curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...
- curl模拟多线程抓取网页(优化)
通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...
- php curl_multi系列函数实现多线程抓取网页
最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...
- PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据
From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_ ...
- php curl多线程抓取网页
PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...
- 简单的使用php多线程抓取网页
PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...
- 使用Python3爬虫抓取网页来下载小说
很多时候想看小说但是在网页上找不到资源,即使找到了资源也没有提供下载,小说当然是下载下来用手机看才爽快啦! 于是程序员的思维出来了,不能下载我就直接用爬虫把各个章节爬下来,存入一个txt文件中,这样, ...
- python多线程抓取网页信息
#!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requ ...
- 抓取网页数据C#文件
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...
随机推荐
- 【BZOJ-3709】Bohater 贪心
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 835 Solved: ...
- 【BZOJ-2055】80人环游世界 上下界费用流 (无源无汇最小费用最大流)
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 321 Solved: 201[Submit][Status][Discus ...
- JDBC链接MySQL
首先,这里的JavaWeb使用JDBC的方法与Java的使用方法相似,但是有不同之处: 在Java中导入驱动包以后,直接用DriverManager.getConnection()获取连接对象, 而在 ...
- HFSS使用记录
一.基本设置 1.Tools \ Options,各种基本设置 1.1 Tools \ Options \ HFSS Options-> Duplicate boundaries/mesh op ...
- Linux下动态库查找路径的问题
说到和动态库查找路径相关的问题,总体上可以分为两类: 第一类: 通过源代码编译程序时出现的找不到某个依赖包的问题,而如果此时你恰好已经按照它的要求确确实实.千真万确.天地良心地把依赖库给装好了, ...
- python抓取网页过程
准备过程 1.抓取网页的过程 准备好http请求(http request)->提交对应的请求->获得返回的响应(http response)->获得网页源码 2.GET还是POST ...
- HTML之:fieldset——一个不常用的HTML标签
2016年4月14日17:10:02记录 一个不常用的HTML标签fieldset,不过我觉得比较有意思,其语法如下: <fieldset><legend>fieldset名称 ...
- React Native 开发之 (05) flexbox布局
一 flexbox布局 1 flex布局 flexbox是ReactNative 应用开发中必不可少的内容,也是最常用的内容. 传统的页面布局是基于盒子模型,依赖定位属性,流动属性和显示属性来解决. ...
- POJ2528Mayor's posters(离散化 + 线段树)
题目链接: 题意:给定一些高度都相同的海报去贴,问最后能看见几张海报 The picture below illustrates the case of the sample input. { 8,9 ...
- css中关于居中的那点事儿
css中关于居中的那点事儿 关于居中,无论是水平居中,还是垂直居中都有很多方式,下面我来介绍一些常用的. 第一部分:水平居中 1.实现行内元素的居中.方法:在行内元素外面的块元素的样式中添加:text ...