2011-04-12 3 views
4

필자는 파이썬 스크립트를 처음 마쳤습니다. 필자는 선거 자료를 스크랩하는 사람이었습니다. 프로그래밍에 대한 배경 지식이 없으며, 통계 분석을 위해 통계를 사용했고 요즘 일부 스위치를 원할 때 R을 약간 썼습니다. 그러나 웹 사이트 및 기타 소스에서 데이터를 추출하는 Python을 배우고 싶습니다. 지금까지 필자는 Python 튜토리얼을 탐색했을 뿐이 었습니다. O'Reilly의 "Learning Python"은 내 선반에서 기다리고 있습니다. 필자는 다른 사람들의 스크립트에서 영감을 얻고 포함 된 패키지 문서를 탐색하여 다음 스크립트를 작성했습니다.첫 번째 파이썬 스크립트, 스크레이퍼, 추천 환영

기본적으로 찾고있는 것은 일반적인 조언입니다. 스크립트는 작동하지만 불필요한 부분이 있습니까? 다르게 구조해야합니까? 어떤 전형적인 (또는 바보 같은) 초보자 실수가 있습니까?

나는 스크립트 후에 나열한 몇 가지 질문을 직접 작성했습니다. 내가 스크립트를 실행하면

import mechanize 
import lxml.html 
import csv 

site = "http://www.comelec.gov.ph/results/2004natl/2004electionresults_local.aspx" 

br = mechanize.Browser() 
response = br.open(site) 

output = csv.writer(file(r'output.csv','wb')) 


br.select_form(name="ctl00") 
provinces = br.possible_items("provlist") 

for prov in provinces: 
    br.select_form(name="ctl00") 
    br["provlist"] = [prov] 
    response = br.submit() 
    br.select_form(name="ctl00") 
    pname = str(br.get_value_by_label("provlist")).strip("[]") 
    municipalities = br.possible_items("munlist") 
    for mun in municipalities: 
     br.select_form(name="ctl00") 
     br["munlist"] = [mun] 
     response = br.submit(type="submit", name="ctl01") 
     html = response.read() 
     root = lxml.html.fromstring(html) 
     try: 
      table = root.get_element_by_id(id="dlistCandidates") 
      data = [ 
         [td.text_content().strip() for td in row.findall("td")] 
         for row in table.findall('tr') 
        ] 
     except KeyError: 
      print "Results not available yet." 
      data = [ [ "." for i in range(5) ] ] 
     br.select_form(name="ctl00") 
     mname = str(br.get_value_by_label("munlist")).strip('[]') 
     print pname, mname, data, "\n" 
     for row in data: 
      if row: 
       row.append(pname) 
       row.append(mname) 
       output.writerow([s.encode('utf8') if type(s) is unicode else s for s in row]) 
  1. , 나는 오류 메시지 "DeprecationWarning를 얻을 : [item.name를 self.items의 항목] 이유가 있고 난 그것에 대해 걱정해야합니까

  2. .?

    이제 지방 번호 키를 반복 한 다음 매번 이름을 가져옵니다. 처음에는 사전을 작성하고 반복해야합니까?

  3. "ene"문자를 쉽게 인코딩 할 수 있습니까? N 물결 모양)을 정상적인 N?

  4. "데이터"를 매번 대체하는 방법으로 모든 것을 가장 잘 모으고 마지막에 CSV 파일을 작성하는 방법은 무엇입니까? 그것이 더 나은 해결책이 될 것입니까?

  5. 사이트는 각 요청에 응답하는 데 꽤 오래 걸립니다. 모든 데이터를 가져 오는 데는 약 한 시간이 걸립니다. 나는이 스크립트를 실행하고 지방 목록을 concatening하여 속도를 높일 수 있습니다. 하나의 스크립트에서 병렬 요청을 보내는 방법은 무엇입니까? 결국에는 해당 사이트에서 더 많은 데이터를 얻으 려하고 프로세스 속도를 높이는 것이 좋습니다.

  6. 나는 BeautifulSoup와 lxml 모듈을 모두 시험해 보았지만 lxml 솔루션을 더 좋아했습니다. 이러한 종류의 작업에 유용한 다른 모듈은 무엇입니까?

  7. 내장 된 모듈과 다른 모듈 모두에 대한 문서/도움말 파일에 대한 중앙 레지스터가 있습니까? 나는 그 문서가 사방에 흩어져있는 것처럼 보였고 다소 불편했습니다. 도움 (무언가)을 쓰는 것은 종종 "발견되지 않은 것"을 초래했습니다.

모든 추천과 비평은 대단히 감사합니다. 영어가 모국어가 아니지만 최소한 실수를 저 지르기를 바랍니다.

+0

7. 도움 "을 (를) 찾을 수 없습니다 무엇인가"의 결과로 (뭔가). 어떤 문서도 일반적으로 나쁜 모듈의 흔적이 아닙니다. 그들을 피하는 경향이있다. 또는 문서를 제공하십시오. – smci

답변

6
  1. DeprecationWarningmechanize 모듈에서오고, 당신은 possible_items를 호출 할 때 발행되고있다. 동일한 효과를 얻는 더 좋은 방법을 제안합니다. 나는 왜 저자가 그것을 더 명백하게하지 않았는지 모른다.

  2. 별로 차이가 없다고 생각합니다.

  3. http://effbot.org/zone/unicode-convert.htm을 볼 수 있습니다.

  4. 점진적으로 글을 쓰면서, 저에게 잘 보입니다. 대신 행 목록을 만들고 루프에 추가 한 다음 끝까지 한 번에 모든 것을 쓸 수 있습니다. 주요 이점은 모듈성이 약간 증가하는 것입니다. (같은 긁기 작업을하고 다른 방법으로 결과를 사용하기를 원한다면 코드를 더 쉽게 재사용 할 수 있습니다.)

  5. (a) 원격 사이트가 응답하는 데 오랜 시간이 걸리고 모든 스크래핑이 원격 사이트에서 병렬로 여러 요청을 실행하면 실제로 도움이 될 것입니까? (b) 문제의 사이트 소유자가 공손함과 이의를 제기 할 경우 귀하가하고있는 일을 파악하여 차단할 수 있기 때문에 이러한 종류의 근근이 거리는 것에 대해 반대하지 않는지 확인하고 싶을 수 있습니다. 아마 정부 사이트이기 때문에 아마 괜찮을 것 같습니다. (c) Python 표준 라이브러리에서 threadingmultiprocessing 모듈을 살펴보십시오.

  6. 잘 모르겠다. 죄송합니다. 당신이 지방과 지방 자치 단체를 결정하기 위해 앞뒤로 약간의 작업을 수행하는 것처럼

  7. 번호 (당신이 구글을 계산하지 않는 한.)

것 같습니다. 스크립트 호출간에 변경되지 않으면 매번 원격 웹 사이트에 묻는 대신 로컬 어딘가에 저장하는 것이 좋습니다. (이득은 아마도 그럴만 한 가치가 없을 것입니다. 그러나 그 정보를 얻는 데 걸리는 시간을 측정하고 싶을 수도 있습니다.)

HTML 모양을 후보 목록으로 바꾸는 코드를 추출해보십시오 (그것이 무엇인지)를 별도의 함수로 변환합니다.

당신은 별도의 함수로 이런 일을 추출하는 것이 좋습니다 :이 같은

def select_item(br, form, listname, value, submit_form=None): 
    br.select_form(form) 
    br[listname] = [value] 
    return br.submit(type="submit", name=(submit_form or form)) 

어쩌면 뭔가 :

def get_name(br, formname, label): 
br.select_form(formname) 
    return str(br.get_value_by_label(label)).strip("[]")