2014-09-30 6 views
2

웹 사이트에서 일부 데이터를 긁어 내고 POST가 작동하지 않을 수 있습니다. 입력 데이터를 제공하지 않은 것처럼 작동합니다. ("appnote").인코딩 된 POST URL 대 파이썬을 통한 라인 기반 텍스트 데이터 요청

POST 데이터를 조사 할 때 실제 webform의 POST가 "URL 인코딩 됨"으로 표시되고 각 양식 입력이 나열된다는 점을 제외하고는 상대적으로 같습니다. 반면 광산은 "라인 기반 텍스트 데이터"로 표시됩니다.

  • : 나는 와이어 샤크에 무슨 말인지의 이미지

    import requests 
    import cookielib 
    
    
    jar = cookielib.CookieJar() 
    url = 'http://www.vivotek.com/faq/' 
    headers = {'content-type': 'application/x-www-form-urlencoded'} 
    
    post_data = {#'__EVENTTARGET':'', 
          #'__EVENTARGUMENT':'', 
          '__LASTFOCUS':'', 
          '__VIEWSTATE':'', 
          '__VIEWSTATEGENERATOR':'', 
          '__VIEWSTATEENCRYPTED':'', 
          '__PREVIOUSPAGE':'', 
          '__EVENTVALIDATION':'' 
          'ctl00$HeaderUc1$LanguageDDLUc1$ddlLanguage':'en', 
          'ctl00$ContentPlaceHolder1$CategoryDDLUc1$DropDownList1':'-1', 
          'ctl00$ContentPlaceHolder1$ProductDDLUc1$DropDownList1':'-1', 
          'ctl00$ContentPlaceHolder1$Content':'appnote', 
          'ctl00$ContentPlaceHolder1$Search':'Search' 
          } 
    response = requests.get(url, cookies=jar) 
    
    response = requests.post(url, cookies=jar, data=post_data, headers=headers) 
    
    print(response.text) 
    

    링크가 필요합니다 (애플리케이션 노트) 및 검색 (검색) 가장 관련성이 부분은 다음과 같습니다 여기

    내 코드입니다 Wireshark Form

  • Wireshark Line

같은 결과를 가진 wget을 사용해 보았습니다.

답변

2

중요한 문제는 __VIEWSTATE과 같이 중요한 숨김 필드 값을 설정하지 않는다는 것입니다.

requests을 사용하려면이 페이지를 구문 분석하고 적절한 입력 값을 얻어야합니다.

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.vivotek.com/faq/' 
query = 'appnote' 

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36'} 

session = requests.Session() 
response = session.get(url, headers=headers) 

soup = BeautifulSoup(response.content) 

post_data = {'__EVENTTARGET':'', 
      '__EVENTARGUMENT':'', 
      '__LASTFOCUS':'', 
      '__VIEWSTATE': soup.find('input', id='__VIEWSTATE')['value'], 
      '__VIEWSTATEGENERATOR': soup.find('input', id='__VIEWSTATEGENERATOR')['value'], 
      '__VIEWSTATEENCRYPTED': '', 
      '__PREVIOUSPAGE': soup.find('input', id='__PREVIOUSPAGE')['value'], 
      '__EVENTVALIDATION': soup.find('input', id='__EVENTVALIDATION')['value'], 

      'ctl00$HeaderUc1$LanguageDDLUc1$ddlLanguage': 'en', 
      'ctl00$ContentPlaceHolder1$CategoryDDLUc1$DropDownList1': '-1', 
      'ctl00$ContentPlaceHolder1$ProductDDLUc1$DropDownList1': '-1', 
      'ctl00$ContentPlaceHolder1$Content': query, 
      'ctl00$ContentPlaceHolder1$Search': 'Search' 
      } 

response = session.post(url, data=post_data, headers=headers) 

soup = BeautifulSoup(response.content) 
for item in soup.select('a#ArticleShowLink'): 
    print item.text.strip() 

를 인쇄 appnote 쿼리에 대한 구체적인 결과 : 멋지고 일

How to troubleshoot when you can't watch video streaming? 
Recording performance benchmarking tool 
... 
+0

, 감사

여기 BeautifulSoup HTML 파서와 requests를 사용하여 솔루션입니다! 그래서 내가 놓친 핵심은 세션 데이터입니다. 그건 의미가 있습니다! – Ganeshvara