我正在尝试制作某种页面解析器(更具体 - 突出显示页面上的某些单词),但我遇到了一些问题。我使用curl 从 url 获取整个页面数据,大多数页面都能很好地配合,而其他页面则不然。
我的目标是获取所有页面 html,就像浏览器获取它一样,并且我尝试匿名使用它 - 就像浏览器一样。我的意思是 - 如果某些页面需要登录才能显示我不感兴趣的浏览器数据。问题是我无法访问可以从常规浏览器匿名访问的 Twitter 或 Facebook 页面,即使我设置了所有 header ,就像它们通常从 Firefox 或 Chrome 发送的那样。
有什么方法可以简单地模拟浏览器从这些端获取页面,或者我必须使用 OAuth(有人可以解释为什么浏览器不需要使用它)吗?
编辑
我得到了解决方案!如果有人遇到问题,你应该:
-> 尝试将协议(protocol)从 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)都很好。
最佳答案
是的,可以模拟浏览器:但您需要仔细观察浏览器发送的所有 http header (包括 cookie),并处理重定向。其中一些可以通过 cUrl 函数“自动化”,其余的您需要手动处理。
注意:我不是在谈论代码中的 HTML header ;而是在讨论 HTML header 。这些是浏览器发送和接收的 HTTP header 。
发现这些的最简单方法是使用 fiddler来监控流量。选择一个 URL 并在右侧查找“检查元素”,您将看到发送的 header 和接收的 header 。
Facebook 通过 iFrame 使这一切变得更加复杂,所以我建议您从一个更简单的网站开始!
关于php - 通过curl匿名从twitter或facebook获取页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911277/