求助php無法抓取網頁,問了幾個人都沒解決

來源:互聯網
上載者:User
本帖最後由 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()

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.