제로, 어떤 도구 웹 사이트를 크롤링
,보고있는 수수께끼 앞의 두 게임은 수동으로 약간의 불편 함을 가지고,이 퍼즐에 들어갔다. 특히 특별한 매일 전투의 종류, 같은 큰 수수께끼이다는 매우 시간이 많이 소요되는 물품. 빨리 수수께끼를 얻을 수있는 방법, 그리고 파일의 수수께끼 직접 출력이 있습니까? 대답은 파충류, 웹 크롤입니다.
그냥 퍼즐 팀 웹 크롤러 조치 안티 클럽의 캡처 패킷 분석 (나는 너무 많은 패킷의 수라고 할) 수없는, 수수께끼의 웹 페이지에 대한 정보가없는, 좋은 일을, 오직 헤드리스로 볼 수 있습니다 장치.
다음과 같이 시작 phantomJS는 파이썬 코드 페이지 코드 섹션을 얻을 :
데프 getChessByPhantomJS () : 드라이버 = webdriver.PhantomJS () driver.get ( ' https://www.puzzle-dominosa.com/?size=8 ' ) 소스 = driver.page_source driver.quit () #
그러나 운영은 불행한 결과, 궁극적으로 만 웹 페이지에 대한 기본 템플릿에 수수께끼가 아닙니다.
어떻게에 크롬 효과? (I 오른쪽 바이두를 설정할 수 있습니다 크롬 헤드리스 브라우저를 구성하는 방법을 모른다)
데프 getChessByChrome () : 경로 = R & LT ' D : \ chromedriver.exe ' chrome_options = 옵션 () # 후자의 두 고정 표현이 기록되어야되도록 chrome_options.add_argument ( ' --headless ' ) chrome_options.add_argument ( ' --disable-GPU ' ) 드라이버 = webdriver.Chrome (executable_path = 경로, chrome_options = chrome_options) 시도 : driver.get ( ' https://www.puzzle-dominosa.com/?size=8 ' ) 를 제외한 전자와 같은 예외 : 인쇄 (전자) 소스 = driver.page_source driver.quit () 반환 소스
운영 결과 (이 프로세스를 실행하는 것입니다으로이 B를 종료하지 않았기 때문에)
DevTools로는 WS에서 수신 : //127.0.0.1 : 62344 / DevTools로 / 브라우저 / 8c9f8f4a-407a 내지-4045-B 41C-b9f898d4d37b [1203 / 174652.884 : INFO : 콘솔 (1)] "처리되지 않는 오류 : I window.googletag.pubads 함수 "아니다, 소스 : https://www.puzzle-dominosa.com/build/js/public/new/d ominosa-95ac3646ef.js (1)
당신은 프로그램을 종료 타임 아웃을 추가 할 수 있습니다 :
데프 getChessByChrome () : 경로 = R & LT ' D : \ chromedriver.exe ' chrome_options = 옵션 () # 후자의 두 고정 표현이 기록되어야되도록 chrome_options.add_argument ( ' --headless ' ) chrome_options.add_argument ( ' --disable-GPU ' ) 드라이버 = webdriver.Chrome (executable_path = 경로, chrome_options = chrome_options) 시도 : driver.set_page_load_timeout ( 30 ) driver.get ( ' https://www.puzzle-dominosa.com/?size=8 ' ) 를 제외한 전자와 같은 예외 : 인쇄 (전자) 소스 = driver.page_source driver.quit () 반환 소스
이것은 페이지 분석 함수 코드, 수수께끼의 출력을 허용한다.
첫째, 어떻게 dominosa의 수수께끼를 얻을 수 있습니다
그러나 그것은 우리가 원하는 것은 수수께끼이다, 여기서 끝나지 않았다. 이를 위해, 우리는 코드를 분석 할 필요가 :
수수께끼 코드의 그림 1.dominosa 게임
를 참조하십시오? 여기 수수께끼 직접 수수께끼 (3)의 셀 (3)에 대응하는 클래스 코드의 이름으로 반사되고, 수수께끼보다 단위 길이 당 동위 원소, 수수께끼 래핑 때.
코드를 작성할 수 있습니다 :
DEF ) (해결 : 소스 = getChessByChrome () htree = etree.HTML (소스) chessSize = LEN (htree.xpath ( ' // DIV [@ ID = "게임"] / DIV / DIV / DIV / .. ' )) puzzleId = htree.xpath ( ' // DIV [@ 클래스 = "puzzleInfo"] / P / 폭 / 텍스트 () ' ) [0] X = (라운드 ((4 * chessSize + 1) ** 0.5) - 1) // 2 잉크 (X) 인쇄 (X + 1 ) 체스 = ' 위한 I, 클래스 명 에서 열거 (htree.xpath ( ' // DIV [ID = @ "게임"] / DIV / DIV / DIV / .. ' )) : 값 = className.xpath ( ' ./@class ' ) [0] .split ( ' ' ) [1] [4 :] 만약 I % (X + 1) == X : 체스 + = 값 + ' \ n ' 다른 사람 : 체스 + = + 값 '을 ' (오픈으로 ' dominosaChess ' + puzzleId + ' 가 .txt ' , ' w ' )로서 F : f.write (체스 [- 1])
그래서 당신은 얻을 수 dominosa 게임 해결하기 위해 사용 춤 링크 X (체인 춤을) 이 문서의 요구 사항 내부 수수께끼.
또한, 여기서, 문의 수수께끼, 수수께끼 ID와 출력 파일 이름을 용이하게하기 위해서이다.
둘째, 방법 별 전투 수수께끼를 얻을 수 있습니다
라인에 타 스타 전투 게임의 해결 깊이 우선 검색 DFS 사용 이 파일이 일을 지출하는 데 필요한 내부 수수께끼.
이제 아래 그림을 보자 :
도에 2.star 전투 수수께끼 코드
왼쪽은 분할 선 (BL)을 나타내는 등 여기 BR은 분할 라인의 오른쪽을 나타내며, 코드 클래스 이름의 수수께끼가 특정 의미가 있습니다.
여기에 단지 우리가 필요한 것은 각 상자 라벨의 종류가있는 블록 배열에 속하고, 분할 선을 우리에게 제공한다. 이를 위해, 우리는 BFS, 폭 우선 검색을 사용합니다.
DEF ) (해결 : 만약 url.find ( ' 크기 = ' ) == -1 : limit = 1 else: size = url.split('size=')[1] size = int(size) if size >= 1 and size <= 4: limit = 1 elif size <= 6: limit = 2 elif size <= 8: limit = 3 else: limit = size - 5 source = getChessByFile() htree = etree.HTML(source) chessSize = len(htree.xpath('//div[@id="game"]/div/div')) puzzleId = htree.xpath('//div[@class="puzzleInfo"]/p/span/text()')[0] chessSize = round(chessSize**0.5) chess = [[-1 for _ in range(chessSize)] for __ in range(chessSize)] borderss = [['' for _ in range(chessSize)] for __ in range(chessSize)] chessStr = '' maxBlockNumber = 0 # br: on the right; bl: on the left; bb: on the down; bt: on the up for i,className in enumerate(htree.xpath('//div[@id="game"]/div/div[contains(@class,"cell")]')): x = i // chessSize y = i % chessSize value = className.xpath('./@class')[0] if value[:4] != 'cell': continue value = value.replace('cell selectable','') value = value.replace('cell-off','') borderss[x][y] = value for i in range(chessSize): for j in range(chessSize): if chess[i][j] != -1: continue queue = [(i, j)] chess[i][j] = str(maxBlockNumber) while len(queue) > 0: oldQueue = deepcopy(queue) queue = [] for pos in oldQueue: x, y = pos[0], pos[1] # if x > 0 and borderss[x][y].find('bt') == -1 and chess[x-1][y] == -1: queue.append((x-1, y)) chess[x-1][y] = chess[i][j] # if x < chessSize - 1 and borderss[x][y].find('bb') == -1 and chess[x+1][y] == -1: queue.append((x+1, y)) chess[x+1][y] = chess[i][j] # if y > 0 and borderss[x][y].find('bl') == -1 and chess[x][y-1] == -1: queue.append((x, y-1)) chess[x][y-1] = chess[i][j] # if y < chessSize - 1 and borderss[x][y].find('br') == -1 and chess[x][y+1] == -1: queue.append((x, y+1)) chess[x][y+1] = chess[i][j] # maxBlockNumber += 1 chessStr = '\n'.join(' '.join(chessRow) for chessRow in chess) with open('starBattleChess' + puzzleId + '.txt','w') as f:f.write(str(limit)+'\n'+chessStr)
这里为了以后使用谜面方便,使用了稍微不兼容上述格式的排布:每行的星星数+排布