我试图制作某种页面解析器(更具体 - 突出显示页面上的某些单词),并且我遇到了一些问题。我使用curl从网址获取整页数据,大多数网页都很合作,而其他网页则没有。
我的目标是获取所有页面HTML,就像浏览器获取它一样,并且我试图匿名使用它 - 就像浏览器一样。我的意思是 - 如果某些页面需要登录以显示我不感兴趣的浏览器数据。问题是,我无法通过常规浏览器匿名访问Twitter或Facebook页面,即使我将所有标题设置为正常通过Firefox或Chrome发送。
有没有办法简单地模仿浏览器从这一侧获取页面,或者我必须使用OAuth(有人可以解释为什么浏览器不需要使用它)?
修改
我得到了解决方案!如果有人会遇到问题,你应该:
- >尝试将协议从https切换到http
- >如果url中有一个,则删除/#!/元素
- >对于我的curl元素" Accept-Encoding:gzip,deflate"也造成了问题..不知道为什么,但现在一切都好了
我的代码:
if (substr($this->url,0,5) == 'https')
$this->url = str_replace('https://', 'http://', $this->url);
$this->url = str_replace('/#!/', '/', $this->url);
//check, if a valid url is provided
if(!filter_var($this->url, FILTER_VALIDATE_URL))
return false;
$curl = curl_init();
$header = array();
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
// -> gives an error: $header[] = "Accept-Encoding: gzip, deflate";
$header[] = "Accept-Language: pl,en-us;q=0.7,en;q=0.3";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Pragma: "; // browsers keep this blank.
curl_setopt($curl, CURLOPT_HTTPHEADER,$header);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_URL, $this->url);
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl, CURLOPT_COOKIESESSION,true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$response = curl_exec($curl);
curl_close($curl);
if ($response) return $response;
return false;
所有都在课堂上,但你可以很容易地提取代码。对我来说,它很好地得到了(推特和脸书)。
答案 0 :(得分:3)
是的,这可以模拟浏览器:但是您需要仔细观察浏览器发送的所有http标头(包括cookie),并且还要处理重定向。其中一些可以通过cUrl函数“自动化”,其余的你需要手动处理。
注意:我不是在谈论代码中的HTML标头;这些是浏览器发送和接收的HTTP标头。
发现这些信息的最简单方法是让用户fiddler监控流量。选择一个URL并在右侧查看“inspect element”,您将看到发送的标头和收到的标头。
Facebook使iFrames的mirad变得更加复杂,所以我建议你从一个更简单的网站开始!
答案 1 :(得分:0)
我得到了解决方案!如果有人会遇到问题,你应该:
- >尝试将协议从https切换到http
- >如果url中有一个,则删除/#!/元素
- >对于我的curl元素“Accept-Encoding:gzip,deflate”也引起了问题..不知道为什么,但现在一切都还好
我的代码:
if (substr($this->url,0,5) == 'https')
$this->url = str_replace('https://', 'http://', $this->url);
$this->url = str_replace('/#!/', '/', $this->url);
//check, if a valid url is provided
if(!filter_var($this->url, FILTER_VALIDATE_URL))
return false;
$curl = curl_init();
$header = array();
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
// -> gives an error: $header[] = "Accept-Encoding: gzip, deflate";
$header[] = "Accept-Language: pl,en-us;q=0.7,en;q=0.3";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Pragma: "; // browsers keep this blank.
curl_setopt($curl, CURLOPT_HTTPHEADER,$header);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_URL, $this->url);
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl, CURLOPT_COOKIESESSION,true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$response = curl_exec($curl);
curl_close($curl);
if ($response) return $response;
return false;
所有都在课堂上,但你可以很容易地提取代码。对我而言,它(twitter和facebook)都很好。