2012-04-26 7 views
0

특정 작업을 자동화하기 위해 Python을 사용하고 싶습니다. 특히, 파이썬을 사용하여 웹 사이트와 상호 작용하여 페이지에서 특정 정보를 얻고, 요청 (POST 데이터 및 응답 읽기), 다운로드 및 업로드와 같은 작업을 수행하고자합니다. 지금까지 파이썬을 사용하여 urllib2를 사용하여 페이지에서 HTML을 가져올 수있었습니다. 내가 시도한 다음 것은 페이지에 요청을 보내는 것입니다. 몇 차례 시도했지만 실패했습니다.Python의 urllib2를 사용하여 웹 페이지에 요청 보내기

>>> import urllib2 
    >>> import urllib 
    >>> url = "http://www.stackoverflow.com/" 
    >>> values = {} 
    >>> values["input"] = "foo" 
    >>> data = urllib.urlencode(values) 
    >>> request = urllib2.Request(url + "search/", data) 
    >>> response = urllib2.urlopen(request) 
    >>> html = response.read() 
    >>> print html 

내가 지금까지 일을 이해하는 방법은 내가 필드와 입력의 이름 사전을 만들고 urllib.urllencode (값)로 인코딩 할 필요가 있다는 것입니다. urllib2.Request (urlReceivingTheRequest, data, headers)를 사용하여 요청을해야합니다. URL 만 주어진 경우 GET 만 가능하지만 주어진 데이터가 POST 인 경우 헤더를 제공 할 수 있습니다. Firefox 나 IE와 같은 일반적인 브라우저. 그런 다음 urllib2.urlopen (요청)을 사용하여 객체와 같은 파일을 반환하는 응답을받습니다. 결과적으로 읽을 수 있습니다(). 내가 이해할 수 있도록 .addheaders ("User-Agent", "")를 사용하여 헤더를 추가하는 핸들러를 수신 할 수있는 urllib2.build_opener()를 사용할 수도 있습니다. 나는 결국이 모든 것을 할 수 있기를 바랄 것입니다. 그러나 우선, 나는 제출 된 양식을 얻고 싶습니다. 위의 코드에서 파이썬과의 대화식 세션에서 올바른 절차를 수행 했습니까? (stackoverflow의 프론트 페이지에있는 검색 필드에 "foo"에 대한 검색을 입력하려고 시도했습니다.)

+1

특별히 어떤 효과가 있습니까? 오류가 있습니까? – Todd

답변

0

GET 메소드를 사용하여 검색 결과를 얻고 싶다면 FORM의 html 코드를 검사 할 수 있습니다 : <form id="search" action="/search" method="get" autocomplete="off"> <div> <input autocomplete="off" name="q" class="textbox" placeholder="search" tabindex="1" type="text" maxlength="140" size="28" value="foo" style="width: 200px; max-width: 200px; "> </div> </form>

조치가 "/ 검색"요청 URL

https://stackoverflow.com/search?q=foo 그래서 그냥 작동됩니다 위의 URL을 열고 urllib2를 사용할 수 있도록 입력 이름은, "Q"입니다입니다.

"사용자 에이전트"와 같은 요청 헤더에 대해 걱정할 필요가 없습니다. urllib2가이를 추가하므로, set it explicitly 수 있습니다.

작동 시키려면 "입력"을 "q"로 변경하고 요청에서 "데이터"매개 변수를 사용하지 않아야합니다. 그렇지 않으면 GET 이외의 POST가 사용되며 프로그램은 다음과 같습니다.

import urllib2 
import urllib 
url = "http://www.stackoverflow.com/" 
values = {} 
values["q"] = "foo" 
data = urllib.urlencode(values) 
request = urllib2.Request(url + "search" +"?"+ data) 
response = urllib2.urlopen(request) 
html = response.read() 
print html 

enter code here 
+0

그래서 올바르게 이해하면 페이지의 소스를보고 "

? 입니다. 그게 맞습니까? – user1359801

+0

로그인 페이지이고 사용자 이름과 암호를 보내야하는 경우 어떻게해야합니까? POST로 실제 요청을 보내지 않거나 데이터를 반환 한 양식을 작성해야하는 경우 어떻게해야합니까? (심지어 실제 페이지의 URL을 변경하지 않고 결과를 반환하는 양식이있는 일부 페이지를 보았습니다. 어떻게 파이썬을 사용하여 해당 사이트에 액세스합니까?) – user1359801

+0

네, 맞습니다. 양식의 "메소드"를 확인하십시오. 일반적으로 검색은 GET을 사용하고 로그인은 POST를 사용합니다. POST 요청의 경우 'urllib2.Request (url, data)'를 사용하면 urllib2가 url 핸들러에 "data"를 POST합니다. –

6

urllib2 대신 requests을 사용하면 생활이 더 쉬울 것입니다. 다음은 요청 API에 대한 귀하의 예입니다.

import requests 
r=requests.post("http://www.stackoverflow.com/search/",data={'input':'foo'}) 
print r.text 
관련 문제