ホームページ >バックエンド開発 >PHPチュートリアル >phpでWebページをクロールできないということで何人かに相談しましたが解決できませんでした。

phpでWebページをクロールできないということで何人かに相談しましたが解決できませんでした。

WBOY
WBOYオリジナル
2016-06-23 14:17:17980ブラウズ

本帖最后由 dz215136304 于 2013-06-11 11:35:47 编辑

url必须为以下代码中的url,经测试,在抓取时,如果q后面的参数带空格,他会自动把"&"转换成"&",从而造成数据无法抓取,在网页中直接输入网址是可以得到内容的,求解决方法
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list";echo Post($url);function Post($url, $post = null)//请求的网页{$context = array();	if (is_array($post))	{		ksort($post);				$context['http'] = array		(				'timeout'=>60,		'method' => 'POST',		'header'=>">Accept-language: en/r/n",		'content' => http_build_query($post, '', '&'),		);	}return file_get_contents($url, false, stream_context_create($context));}


错误提示:
Warning: file_get_contents(http://110.75.65.8/search_turn_page_iphone.htm?sort=&amp;q=liz claiborne&amp;page=1&amp;showMode=list) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.1 505 HTTP Version Not Supported in F:\wwwroot\getTaobao\test.php on line 25

回复讨论(解决方案)

你可以先看看html 字符实体


file_get_contents ? 将整个文件读入一个字符串


说明

string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )

和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents()将返回 FALSE。 

file_get_contents()函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。 


Note: 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。



另外
'header'=>" >Accept-language: en /r/n"
红字部分是什么?
>是多余的,/r/n应为\r\n
header不正确的话,服务器端返回错误(505)就是正常的了

file_get_contents ? 将整个文件读入一个字符串


说明

string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )

和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents()将返回 FALSE。 

file_get_contents()函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。 


Note: 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。



另外
'header'=>" >Accept-language: en /r/n"
红字部分是什么?
>是多余的,/r/n应为\r\n
header不正确的话,服务器端返回错误(505)就是正常的了

通过url编码后一样无法获得数据 ,代码如下

$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=lizclaiborne&page=1&showMode=list";echo Post(urlencode($url));function Post($url, $post = null)//请求的网页{$context = array();	if (is_array($post))	{		ksort($post);				$context['http'] = array		(				'timeout'=>60,		'method' => 'POST',		'header'=>"Accept-language: en\r\n",		'content' => http_build_query($post, '', '&'),		);	}return file_get_contents($url, false, stream_context_create($context));}

实际的错误是:HTTP/1.1 505 HTTP Version Not Supported

file_get_contents(str_replace(' ', '%20', $url));

现在可以了,刚才可能是他的服务器出现了问题

$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=lizclaiborne&page=1&showMode=list";echo file_get_contents($url);
{"result":"true","totalPage":"100","catmap":"","ppath":"","category":"","auctionTagFlag1":"","auctionTagFlag2":"","auctionTagFlag3":"","listItem":[
           {"name":"团购价美国真品liz claiborne丽资克莱本女款中款钱包 liz钱包" ,"img":"http://q.i02.wimg.taobao.com/bao/uploaded/i1/T18ZyyXfXgXXXc8SLa_122312.jpg_90x90.jpg","img2":"http://q.i04.wimg.taobao.com/bao/uploaded/i1/T18ZyyXfXgXXXc8SLa_122312.jpg","iswebp":"","url":"http://a.m.taobao.com/i2431550873.htm?rn=bwHGEi1-ZClPeKBbGc1lfJhm45-D1gLR8O-pug7&sid=8b9c27255c655b1e","previewUrl":"http://a.m.taobao.com/ajax/pre_view.do?itemId=2431550873&sid=8b9c27255c655b1e","favoriteUrl":"http://fav.m.taobao.com/favorite/to_collection.htm?itemNumId=2431550873&sid=8b9c27255c655b1e",
    "icon":["0" ],
    "price":"39.00","originalPrice":"39.00","freight":"10","area":"天津","act":"月售1","itemNumId":"2431550873","nick":"金缕衣_2007",
..........

嗯,粘错了数据
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list";
这个不行 HTTP/1.1 505 HTTP Version Not Supported

这样都行
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz +claiborne&page=1&showMode=list";
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz %20claiborne&page=1&showMode=list";

他的服务器不知做了什么设置,不接受未经 url 编码的数据


嗯,粘错了数据
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list";
这个不行 HTTP/1.1 505 HTTP Version Not Supported

这样都行
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz +claiborne&page=1&showMode=list";
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz %20claiborne&page=1&showMode=list";

他的服务器不知做了什么设置,不接受未经 url 编码的数据

服务器可以接受“未经 url 编码的数据”吗?
怎么我理解的是服务器只能接受经过url编码的数据呢,
如果我们直接把带空格的地址在浏览器打开,
那浏览器已经自动把url编码了,
所以打开正常,
但是php并不是浏览器,
所以它不会自动做这些事情,
需要手动进行编码,
难道不是这样的吗?




嗯,粘错了数据
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list";
这个不行 HTTP/1.1 505 HTTP Version Not Supported

这样都行
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz +claiborne&page=1&showMode=list";
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz %20claiborne&page=1&showMode=list";

他的服务器不知做了什么设置,不接受未经 url 编码的数据

服务器可以接受“未经 url 编码的数据”吗?
怎么我理解的是服务器只能接受经过url编码的数据呢,
如果我们直接把带空格的地址在浏览器打开,
那浏览器已经自动把url编码了,
所以打开正常,
但是php并不是浏览器,
所以它不会自动做这些事情,
需要手动进行编码,
难道不是这样的吗?


空格符(\x20)是url合法字符,怎么处理视乎服务器
你做过http socket的话就知道了,header发送带空格的url一般也是可接受的



間違ったデータを貼り付けました
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list"
これは機能しません HTTP/1.1 505 HTTPサポートされていないバージョン

これは機能します
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz +claiborne&page=1&showMode=list";
$url="http://110.75.65.8/ search_turn_page_iphone.htm ?sort=&q=liz %20claiborne&page=1&showMode=list";

URL エンコードなしのデータを受け入れないようにサーバーでどのような設定が行われているかわかりません

サーバーは「URL エンコードなしのデータ」を受け入れることができますか「?
私が理解しているのは、サーバーは URL エンコードされたデータのみを受け入れることができるということです
ブラウザでスペースを含むアドレスを直接開くと、
ブラウザは自動的に URL をエンコードしているため、
正常に開きますが、
php ではそうではありません。ブラウザは、
これらのことを自動的に実行しないため、
手動でコーディングする必要があります、
そうではありませんか?


スペース文字 (x20) は URL 内で有効な文字です。これを処理する方法はサーバーによって異なります
http ソケットを使用したことがある場合は、スペースを含む URL を送信することが一般的に許容されることがわかります。ヘッダー


ということは、クエリ文字列は関係ありません それは何の文字ですか?
サーバーはそれらをすべてそのまま受け取ることができますよね?


正しい書き方は:

$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=" urlencode('liz claiborne') "&page=1&showMode=list ";



さて、間違ったデータを貼り付けました
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz claiborne&page=1&showMode=list";
これは HTTP では機能しません/1.1 505 HTTP バージョンはサポートされていません

これは動作します
$url="http://110.75.65.8/search_turn_page_iphone.htm?sort=&q=liz +claiborne&page=1&showMode=list";
$url="http:/ /110.75.65.8/search_turn_page_iphone. htm?sort=&q=liz %20claiborne&page=1&showMode=list";

URL エンコードなしのデータを受け入れないようにサーバーでどのような設定が行われているかわかりません

サーバーは受け入れられますか「URLエンコーディングのないデータ」?
私が理解しているのは、サーバーは URL エンコードされたデータのみを受け入れることができるということです
ブラウザでスペースを含むアドレスを直接開くと、
ブラウザは自動的に URL をエンコードしているため、
正常に開きますが、
php ではそうではありません。ブラウザは、
これらのことを自動的に実行しないため、
手動でコーディングする必要があります、
そうではありませんか?


スペース文字 (x20) は URL 内で有効な文字です。これを処理する方法はサーバーによって異なります
http ソケットを使用したことがある場合は、スペースを含む URL を送信することが一般的に許容されることがわかります。ヘッダー


ということは、クエリ文字列は関係ありません それは何の文字ですか?
サーバーはそれらをすべてそのまま受け取ることができますよね?



改行と / 文字についてどう思いますか? もちろん文字ではありません

以前にもこの問題に遭遇したことがあります。たとえば http://www.123.com のように、「&」だけを取り出してください。 ?id =123&num=123;

$url='http://www.123.com?id=123'."&".'num=123';と書くと、コンパイラはそれを文字列として扱います。そしてそれを変換しません。

urlencode() をトランスコードするだけです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。