2013-06-18 9 views
-6

나는 Symfony2 구성 요소를 기반으로 PHP 웹 크롤러 인 Goutte을 시험 중입니다. Google을 일반 텍스트 형식과 SSL 형식으로 모두 성공적으로 검색했습니다. 그러나로드되지 않는 ASP/SSL 페이지를 발견했습니다. 여기 Goutte가 ASP SSL 페이지를로드하지 않습니다

내 코드입니다 :

잘못된 요청 (잘못된 헤더 이름)

:

// Load a crawler/browser system 
require_once 'vendor/goutte/goutte.phar'; 

// Here's a demo of a page we want to parse 
$uri = '(removed)'; 

use Goutte\Client; 

$client = new Client(); 
$crawler = $client->request('GET', $uri); 
echo $crawler->text() . "\n"; 

대신, 위의 코드의 끝 부분에있는 에코,이 사이트, 저에게이 있습니다

Firefox에서 사이트를 잘 볼 수 있으며, HTML은 wget --no-check-certificate을 사용하여 괜찮게 검색 할 수 있습니다 (헤더 또는 사용자 에이전트 설정, 예).

Goutte에 일부 HTTP 헤더를 설정해야한다고 생각합니다. 누구에게 내가 시도해야 할 아이디어가 있습니까?

+0

(:

여기에 전체 코드입니다. 사람이 여기 downvotes에 대해 궁금하면, 나는이 질문은 내가 정당화 편집하거나 내 계정에 대한 보복 downvotes에 대한 번개로드가되었다 의심 downvote 누군가가 싫어한다,이 질문은 복수를 쳤다.) :!)'). – halfer

답변

3

내 브라우저와 wget이 모두 비어 있지 않은 사용자 에이전트 필드를 헤더에 추가 했으므로 여기서는 Goutte가 아무것도 설정하지 않는다고 가정합니다. 이전 가져 오기 수정으로 브라우저 객체에 문제를이 헤더를 추가 :

// Load a crawler/browser system 
require_once 'vendor/goutte/goutte.phar'; 

// Here's a demo of a page we want to parse 
$uri = '(removed)'; 

use Goutte\Client; 

// Set up headers 
$client = new Client(); 
$headers = array(
    'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0', 
); 
foreach ($headers as $header => $value) 
{ 
    $client->setHeader($header, $value); 
} 

$crawler = $client->request('GET', $uri); 
echo $crawler->text() . "\n"; 
여기

내 브라우저 에이전트 문자열에 복사 한하지만,이 경우에는 아무것도 작동 거라고 생각 -이 설정 한대로.

덧붙여 말하자면이 특정 문제를 디버깅하기 위해 브라우저 환경을 정확하게 복제하려고 시도하면서 브라우저 UA를 사용했습니다. 일단 그것이 작동하면 나는 관례 UA로 전환했다, 그래서 목표 사이트는 그들이 원한다면 봇으로 그것을 탐지 할 수있다 (나는이 프로젝트를 위해 누구도 가지고 있다고 생각하지 않는다).

1

이 문제도 발생했습니다.

User-Agent 헤더를 추가하는 것으로 충분하지 않았습니다. 나는 setServerParameter 기능을 사용하여 HTTP_USER_AGENT을 추가했으며 매력처럼 작동했습니다. 이외에도

// Load a crawler/browser system 
require_once 'vendor/goutte/goutte.phar'; 

// Here's a demo of a page we want to parse 
$uri = '(removed)'; 
$ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0'; 

use Goutte\Client; 

// Set up headers 
$client = new Client(); 
$client->setHeader('User-Agent', $ua); 
$client->setServerParameter('HTTP_USER_AGENT', $ua); 

$crawler = $client->request('GET', $uri); 
echo $crawler->text() . "\n"; 
+0

흠, 그것은 이상합니다. 그것은 하나 또는 다른 것이어야합니다. 'setServerParameter()'가 독자적으로 작동합니까? 나는 그들이 똑같은 일을한다고 상상한다. – halfer

+0

그 외 : 브라우저 UA가 개발에 적합하지만 스크래퍼는 원하는 경우 대상을 쉽게 차단할 수 있어야하므로 제작하기에 좋은 습관이라고 생각하지 않습니다. 나는 이것을 메모하기 위해 나의 대답을 편집했다. – halfer

+0

그들은 동일해야하지만 내 경우에는 다르다. 그렇습니다. SSL에서만 ASP에서만 발생했기 때문에 이상합니다. –