本帖最後由 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=&q=liz claiborne&page=1&showMode=list) [function.file-get-contents]: 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 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=". 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 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一般也是可接受的
那就是說查詢字串不管是什麼字元,
伺服器都可以全部原樣接收到是嗎?
分行符號和/符,你覺得如何,當然不是任何字元
這個問題我以前遇到過,把“&”單獨拿出來就可以比方說http://www.123.com?id=123&num=123;
寫成$url='http://www.123.com?id=123'.“&”.'num=123';這樣編譯器會把它當字串算不給轉換。
轉碼即可 urlencode()