출력

2014-12-01 2 views
-3

나는이 게시물 검색 한 형태로 규정 및 검색 결과를 그 다음 스크립트 :출력

import mechanize 

url = "http://www.taliesin-arlein.net/names/search.php" 
br = mechanize.Browser() 
br.set_handle_robots(False) # ignore robots 
br.open(url) 
br.select_form(name="form") 
br["search_surname"] = "*" 
res = br.submit() 
content = res.read() 
with open("surnames.txt", "w") as f: 
    f.write(content) 

그러나 렌더링 된 웹 페이지, 여기에 따라서 스크립트로 검색을 제한 250 결과. 이 제한을 무시하고 모든 결과를 검색 할 수있는 방법이 있습니까?

고맙습니다.

+0

귀하의 질문을 이해할 수 있을지 확실하지 않습니다. 웹 요청이 단지 250 개의 결과를 반환합니까? –

+0

당신은 2 가지 가능성이 있습니다 : 1 www.taliesin-arlein.net의 웹 마스터에게 편지를 쓰고 모든 결과를 묻습니다; 2 사이트를 해킹하고 모든 성을 훔칩니다 .... 진지하게 : 그것은 스크립트의 답변을 최대 크기를 변경하는 모든 인수를 dosn't 나에게 솔기. –

+0

권자는 아무것도 훔치고 싶지 않습니다. 웹 사이트에서 허용하는대로 반복 된 쿼리를 수행하여 모든 데이터를 가져올 수 있기 때문에 가정 했었습니다. 그런 다음 한 번에 모든 작업을 수행 할 수있는 방법이있을 것입니다. 예, 웹 요청은 처음 250 개의 결과 만 반환합니다. – brucezepplin

답변

1

가능한 접두어를 반복하여 한계를 극복 할 수 있습니다. 검색어 당 270,000 개의 이름과 250 개의 결과가 있으므로 최소 1080 개의 요청을해야합니다. 26 자의 알파벳이 있습니다. 따라서 균등 한 분포가 있다고 가정하면 조금만 사용하면됩니다. 두 글자를 접두어로 사용합니다 (log (1080)/log (26)).하지만 그 수는 (얼마나 많은 사람들이 결국 ZZ로 시작하는 성을 가졌는지) 알 수 있습니다.

이 해결하기 위해 우리 사용과 같이 수정 된 깊이 우선 탐색 :

import string 
import time 
import mechanize 

def checkPrefix(prefix): 
    #Return list of names with this prefix. 
    url = "http://www.taliesin-arlein.net/names/search.php" 
    br = mechanize.Browser() 
    br.open(url) 
    br.select_form(name="form") 
    br["search_surname"] = prefix+'*' 
    res = br.submit() 
    content = res.read() 
    return extractSurnames(content) 

def extractSurnames(pageText): 
    #write function to extract text from html 


Q=[x for x in string.ascii_lowercase] 
listOfSurnames=[] 
while Q: 
    curPrefix=Q.pop() 
    print curPrefix 
    curSurnames=checkPrefix(curPrefix) 
    if len(curSurnames)<250: 
     #store surnames could also write to file. 
     listOfSurnames+=curSurnames 
    else: 
     #We clearly didnt get all of the names need to subdivide more 
     Q+=[curPrefix+x for x in string.ascii_lowercase] 
    time.sleep(5) # Sleep here to avoid overloading the server for other people. 

는 따라서 우리가 표시 할 너무 많은 결과가있는 장소에서 더 많은 쿼리하지만,이 경우 우리가 ZZZZ을 조회하지 않습니다 ZZZ (또는 더 짧음)로 시작하는 250 개 미만의 성 이름 분포가 얼마나 비뚤어져 있는지 알지 못하면 얼마나 오래 걸릴지 예측하기는 어렵지만 5 초 수면을 1080 배로 늘린 것은 1.5 시간 정도이므로 적어도 반나절 이상은보고있을 것입니다.

참고 : 브라우저를 전역으로 선언하면 더 효율적으로 만들 수 있지만이 코드가 배치 될 위치에 따라 적절한 지 여부가 결정됩니다.

+0

와우 - 아주 좋습니다. 그것을 흡수해야하지만 불가피하게 불규칙적 인 배포판이 생겨날 것이라고 생각했습니다. 덕분에 대단히 - 이것은 좋은 독서를 위해 만들 것입니다. – brucezepplin