2016-06-18 4 views
1

NYC의 건물에 관한 정보를 얻기 위해 스크립트를 작성하고 있습니다. 내 코드가 작동하고 내가 원하는 것을 반환한다는 것을 알고있다. 이전에 수동 입력을하고 있었는데 작동했습니다. 지금은 텍스트 파일에서 주소를 읽게하고 그 정보를 웹 사이트에 액세스하려고 해요 그리고 난이 오류 받고 있어요 :HTTP 오류 400 : 잘못된 요청 (urllib)

urllib.error.HTTPError : HTTP 오류 400 : 잘못된 요청

I을 그것이 브라우저가 아닌 무언가로부터 많은 접근을 좋아하지 않는 웹 사이트와 관련이 있다고 믿습니다. 사용자 에이전트에 대해 들었지만 사용 방법을 모릅니다. 내 코드는 다음과 같습니다.

+0

코드를 독자적으로 실행했기 때문에 서버가 사용자 에이전트에만 기반한 요청을 중단하고있는 것은 아닌지 의심 스럽습니다. 더 많은 가능성이 귀하의 클라이언트 또는 귀하의 요청을 건설하는 방법에 버그가 제한 속도입니다 ... 당신은 귀하의 링크 및 파일에서 샘플 라인에 대한 실제 코드를 넣어 주시겠습니까? –

+0

내일 아침에 다시 연락 드리겠습니다! – Harrison

답변

2

400 오류는 서버가 요청 (예 : 형식이 잘못된 구문)을 이해할 수 없음을 의미합니다. 즉, 개발자가 상태 코드를 반환하기를 원하는지, 불행히도 모든 사람이 의도 한 의미를 엄격하게 따르는 것은 아닙니다.

HTTP 상태 코드에 대한 자세한 내용은 page을 확인하십시오.

사용자 에이전트를 설정하는 방법 : 사용자 에이전트는 요청 헤더에 설정되며 기본적으로 요청하는 클라이언트를 정의합니다. 다음은 인정 된 User Agents의 목록입니다. urllib 대신 urllib2을 사용해야하지만 urllib2도 기본 제공 패키지입니다. 이 모듈을 사용하여 헤더를 설정하기 위해 getBuilding 함수를 업데이트하는 방법을 알려 드리겠습니다. 그러나 requests 라이브러리를 확인하는 것이 좋습니다. 나는 단지 그것이 곧장 앞으로 나아갈 수 있다는 것을 알게되고 그것은 매우 채택/지원된다.

파이썬 2 :

from urllib2 import Request, urlopen 

def getBuilding(link):   
    q = Request(link) 
    q.add_header('User-Agent', 'Mozilla/5.0') 
    r = urlopen(q).read() 
    soup = BeautifulSoup(r, "html.parser") 
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text) 

파이썬 3 :

from urllib.request import Request, urlopen 

def getBuilding(link):   
    q = Request(link) 
    q.add_header('User-Agent', 'Mozilla/5.0') 
    r = urlopen(q).read() 
    soup = BeautifulSoup(r, "html.parser") 
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text) 

참고 : 파이썬 v2 및 v3의 사이의 유일한 차이는 import 문이다.

+0

urllib2라는 모듈이 없다는 것을 알려줍니다. 그건 내가 파이썬 3을 사용하기 때문에 맞을까요? – Harrison

+0

Yup - 파이썬 2와 3의 import 문을 모두 보여주기 위해 필자의 대답을 업데이트했습니다. 또는 @ cees-timmerman [여기]에서 제공하는 솔루션과 같은 것을 할 수 있습니다 (http://stackoverflow.com/questions/7933417/how-do-i-set-headers-using-pythons-urllib/24870196#24870196).) 두 버전 모두에서 호환되는 import 문 가져 오기 –

+0

ImportError : 'Request'이름을 가져올 수 없습니까? – Harrison