Heim > Backend-Entwicklung > PHP-Tutorial > php stream_context_create 无法作用于 stream_socket_client

php stream_context_create 无法作用于 stream_socket_client

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 20:45:58
Original
1430 Leute haben es durchsucht

想通过本地代理,抓取远程网页内容,代码如下:

<code class="lang-php"><?php $options = array(
    'http'=>array(
        'proxy'=>'tcp://192.168.1.108:8087',
        'request_fulluri '=>true,
        "method"  => "GET", 
        "timeout" => 2,
    ),
);

$context = stream_context_create($options);

$fp = stream_socket_client("tcp://www.bigxu.com:80", $errno, $errstr, 30,STREAM_CLIENT_CONNECT,$context);
// print_r(stream_context_get_options($fp)); exit;

if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.bigxu.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>
</code>
Nach dem Login kopieren
Nach dem Login kopieren

php file.php

nginx访问日志是:
15.196.206.102 [26/Apr/2014:12:04:45 +0800] http://www.bigxu.com/ 200 20630 0.241 "-" "-"

15.196.206.102 是我的本机IP.
$context没有起到作用。
代理是绝对可以用的。
因为通过下面代码,$context会起作用

<code class="lang-php">$options = array(
     'http'=>array(
         'proxy'=>'tcp://192.168.1.108:8087',
         'request_fulluri '=>true,
         "method"  => "GET",
         "timeout" => 2,
     ),
 );
 $context = stream_context_create($options);

 if ( $fp = fopen("http://www.bigxu.com", 'r', false, $context) ) {
     print "well done";
    while (!feof($fp)) {
         echo fgets($fp, 1024);
     }
 }

</code>
Nach dem Login kopieren
Nach dem Login kopieren

php file.php
bigxu.com nginx访问日志是:
8.35.201.32 [26/Apr/2014:12:03:03 +0800] http://www.bigxu.com/ 200 7070 0.122 "-" "AppEngine-Google; (+http://code.google.com/appengine; appid: s~goagent0527)"
8.35.201.32 是我的代理IP

比较大型的爬虫项目,我肯定会用stream_socket_client来连接,大家帮我看一下,这个函数,我怎么用错了呢?

回复内容:

想通过本地代理,抓取远程网页内容,代码如下:

<code class="lang-php"><?php $options = array(
    'http'=>array(
        'proxy'=>'tcp://192.168.1.108:8087',
        'request_fulluri '=>true,
        "method"  => "GET", 
        "timeout" => 2,
    ),
);

$context = stream_context_create($options);

$fp = stream_socket_client("tcp://www.bigxu.com:80", $errno, $errstr, 30,STREAM_CLIENT_CONNECT,$context);
// print_r(stream_context_get_options($fp)); exit;

if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.bigxu.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>
</code>
Nach dem Login kopieren
Nach dem Login kopieren

php file.php

nginx访问日志是:
15.196.206.102 [26/Apr/2014:12:04:45 +0800] http://www.bigxu.com/ 200 20630 0.241 "-" "-"

15.196.206.102 是我的本机IP.
$context没有起到作用。
代理是绝对可以用的。
因为通过下面代码,$context会起作用

<code class="lang-php">$options = array(
     'http'=>array(
         'proxy'=>'tcp://192.168.1.108:8087',
         'request_fulluri '=>true,
         "method"  => "GET",
         "timeout" => 2,
     ),
 );
 $context = stream_context_create($options);

 if ( $fp = fopen("http://www.bigxu.com", 'r', false, $context) ) {
     print "well done";
    while (!feof($fp)) {
         echo fgets($fp, 1024);
     }
 }

</code>
Nach dem Login kopieren
Nach dem Login kopieren

php file.php
bigxu.com nginx访问日志是:
8.35.201.32 [26/Apr/2014:12:03:03 +0800] http://www.bigxu.com/ 200 7070 0.122 "-" "AppEngine-Google; (+http://code.google.com/appengine; appid: s~goagent0527)"
8.35.201.32 是我的代理IP

比较大型的爬虫项目,我肯定会用stream_socket_client来连接,大家帮我看一下,这个函数,我怎么用错了呢?

解决了,很难想像,我居然在一个日本的网站找到了答案,所以不要随意抵制日本知识,哈哈!经过测试完全可以实现,你看看:

<code><?php $sock = stream_socket_client('tcp://127.0.0.1:8123', $errno, $errstr, 10, STREAM_CLIENT_CONNECT);  
  
if(!$sock) exit();  
  
$request = array();  
$request[] = 'GET http://www.example.com HTTP/1.1';  
$request[] = 'Host: www.example.com';  
$request[] = 'User-Agent: TestClient';  
  
if(!fwrite($sock, implode("\r\n", $request)."\r\n\r\n")){  
    exit();  
}  
  
$response = '';  
while(!feof($sock)){  
    $response .= fgets($sock, 4096);  
}  
  
echo $response;  
  
fclose($sock);  
  
?></code>
Nach dem Login kopieren

原文地址:http://pe5974.sakura.ne.jp/contents/proxy-https.php

说到采集,首先应该想到的是php的curl函数
最好的办法就是模拟爬虫(比如:百度蜘蛛爬虫或者google蜘蛛爬虫),同样也支持代理配置
通过爬虫模拟浏览器的head请求,没有什么抓去不到(理论上只要能通过浏览器请求到的数据,不管是要登录还是不要登录都是可以抓去到内容的)

不确定是不是这个代理有问题,配置个自己的代理看一下?
或者跟进一下? stream_socket_client 空了继续弄吧

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
PHP-Datenerfassung?
Aus 1970-01-01 08:00:00
0
0
0
PHP-Erweiterung intl
Aus 1970-01-01 08:00:00
0
0
0
Wie man PHP gut lernt
Aus 1970-01-01 08:00:00
0
0
0
Mehrere PHP-Versionen
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage