크롬 퍼즐 팀 클럽 수수께끼 퍼즐 게임을 가져옵니다 헤더없는 브라우저를 사용하여

제로, 어떤 도구 웹 사이트를 크롤링

  ,보고있는 수수께끼 앞의 두 게임은 수동으로 약간의 불편 함을 가지고,이 퍼즐에 들어갔다. 특히 특별한 매일 전투의 종류, 같은 큰 수수께끼이다는 매우 시간이 많이 소요되는 물품. 빨리 수수께끼를 얻을 수있는 방법, 그리고 파일의 수수께끼 직접 출력이 있습니까? 대답은 파충류, 웹 크롤입니다.

  그냥 퍼즐 팀 웹 크롤러 조치 안티 클럽의 캡처 패킷 분석 (나는 너무 많은 패킷의 수라고 할) 수없는, 수수께끼의 웹 페이지에 대한 정보가없는, 좋은 일을, 오직 헤드리스로 볼 수 있습니다 장치.

  다음과 같이 시작 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)
View Code

  这里为了以后使用谜面方便,使用了稍微不兼容上述格式的排布:每行的星星数+排布

추천

출처www.cnblogs.com/dgutfly/p/11978537.html