一些网址的file_get_content奇怪的问题!! - php

时间:2018-01-26 19:41:47

标签: php web-scraping

我有一个网址,可以使用file_get_contents()废弃它并收集内部链接:

http://www.140online.com/Class/450/%D8%B3%D9%88%D8%A8%D8%B1%20%D9%85%D8%A7%D8%B1%D9%83%D8%AA

这是结果数组:

Array
(
    [0] => /company/C79955/المصرية ماركت - امام منصور امام/
    [1] => /company/C574901/مريم ماركت/
    [2] => /company/C1131/سوبر ماركت اولاد رجب/
    [3] => /company/C19699/البركه/
    [4] => /company/C21707/سوبر ماركت بست باى/
    [5] => /company/C23552/الشامل مى ماركت/
    [6] => /company/C21714/سوبر ماركت التميمى/
    [7] => /company/C171121/الجزيره/
    [8] => /company/C172099/الحمد ماركت/
    [9] => /company/C172325/الخشاب ماركت/
    [10] => /company/C174805/الدكان ماركت/
    [11] => /company/C183996/اسواق الشمس المركزيه/
    [12] => /company/C184039/اسواق مرحبا/
    [13] => /company/C189580/البحيرى ماركت/
    [14] => /company/C216371/سوق زمزم/
    [15] => /company/C216941/سيتى ارت/
    [16] => /company/C226223/وجينات محمد سعيد محمد موسى/
    [17] => /company/C297432/ماركت اولاد محمود/
    [18] => /company/C326553/سوبر ماركت عمرو عبد السلام سالم محمد/
    [19] => /company/C326566/سوبر ماركت عونى عزيز هنرى/
)

然后我需要废弃每个链接以获取一些数据,但这是问题所在!

使用我之前添加域名的任何链接。

http://www.140online.com/company/C79955/المصريةماركت - اماممنصورامام/

但是当我尝试获取它的内容时,它会向我发送此错误:

file_get_contents(http://www.140online.com/company/C79955/%D8%A7%D9%84%D9%85%D8%B5%D8%B1%D9%8A%D8%A9%20%D9%85%D8%A7%D8%B1%D9%83%D8%AA%20-%20%D8%A7%D9%85%D8%A7%D9%85%20%D9%85%D9%86%D8%B5%D9%88%D8%B1%20%D8%A7%D9%85%D8%A7%D9%85/):无法打开流:HTTP请求失败! HTTP / 1.1 500内部服务器错误

虽然我按照爆炸显示的方式对阿拉伯语部分进行编码:

    $url_ex = explode("/", $itm_url[$i]);
    $i_url = 'http://'.$url_ex[2].'/'.$url_ex[3].'/'.$url_ex[4].'/'.rawurlencode($url_ex[5]).'/';

另一个奇怪的事情是我可以获得一些链接的内容,但不是所有

请帮助

1 个答案:

答案 0 :(得分:0)

我在使用file_get_contents进行网页抓取方面遇到了一些问题。我建议使用CURL。该库返回HTTP错误代码以了解您遇到的问题。

http://php.net/manual/en/book.curl.php

这是一个如何使用CURL的例子,我希望它有效。

$ch1 = curl_init('string_url');
$options1 = array(CURLOPT_POST => true,
                     CURLOPT_HEADER => $request_headers,
                     CURLOPT_RETURNTRANSFER => true,
                     CURLOPT_FOLLOWLOCATION => true,                     
                     CURLOPT_POSTFIELDS => (if u need to send params)
                    );
curl_setopt_array($ch1, $options1);
$page = curl_exec($ch1); 

if(curl_exec($ch1) === false)
{
    \print_r(curl_error($ch1));
    //HTTP and many other errors if you have it
}

curl_close($ch1);
$dom = new \DOMDocument();
$dom->validateOnParse = true;
$dom->preserveWhiteSpace = false;
$dom->substituteEntities = false;
//Load Document Object Model
$dom->loadHTML($page); 
$domxPath = new \DOMXPath($dom);

$urls = $domxPath->query("/html/body//div[@class='urls']"); 
//Example here searchs all divs which has urls class
//You need to specify which element of DOM contains URLS

//$urls variable must contains an array with urls that you need