2015-01-04 2 views
1

브라우저로 웹 사이트에 액세스하는 데 문제가 없지만 프로그래밍 방식으로 스크래핑을 위해 웹 사이트에 액세스하려고하면 다음 오류가 발생합니다.오류 500 웹 요청으로 웹 사이트를 스크래핑 할 수 없음

The remote server returned an error: (500) Internal Server Error. 

다음은 내가 사용하고있는 코드입니다.

using System.Net; 

string strURL1 = "http://www.covers.com/index.aspx"; 
WebRequest req = WebRequest.Create(strURL1); 

// Get the stream from the returned web response 
StreamReader stream = new StreamReader(req.GetResponse().GetResponseStream()); 
System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
string strLine; 
// Read the stream a line at a time and place each one 
while ((strLine = stream.ReadLine()) != null) 
{ 
    if (strLine.Length > 0) 
    sb.Append(strLine + Environment.NewLine); 
} 

stream.Close(); 

이 하나가 저를 곤혹스럽게합니다. TIA

답변

4

그것의 사용자 에이전트.

스크래핑하려는 사이트와 같은 많은 사이트는 사용자 에이전트 문자열을 스크래핑하지 못하도록하기 위해 사용자 에이전트 문자열의 유효성을 검사합니다. 그것이 여러분과 마찬가지로, 이것은 중학교 프로그래머들이 긁기를 시도하는 것을 빨리 멈 춥니 다. 그 긁힘을 멈추게하는 것은 매우 단단한 방법이 아닙니다.

사용자 에이전트 문자열을 설정하면 작동합니다. 코드를 다음과 같이 변경하십시오 :

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strURL1); 
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; // Chrome user agent string 

그리고 괜찮습니다.

+0

:

는에 UserAgent 속성을 설정하려고합니다. 그들은이 "중학교 프로그래머"를 멈출 수 없었습니다. StackOverflow에 대한 액세스 권한이 있습니다. –

0

URL에서 HTML을 가져 오려고하는 경우.

요청에 서버가 제공하지 못한 헤더가 필요한지 확인해보십시오. 여기

, 당신은 매우 유사한 질문에 대한 해결책을 찾을 수 있습니다

get HTML code through HttpWebRequest

2

일종의 사용자 에이전트 확인을하고있는 것처럼 보입니다. PowerShell에서 문제를 재현 할 수 있었지만 PowerShell cmdlet Invoke-WebRequest이 정상적으로 작동하는 것으로 나타났습니다.

그래서 나는 Fiddler를 연결하고 reran하고 Fiddler에서 사용자 에이전트 문자열을 훔쳤습니다. 그것을 고정 User-Agent: Mozilla/5.0 (Windows NT; Windows NT 6.2; en-US) WindowsPowerShell/4.0