2016-08-01 19 views
6

Chcę uzyskać dostęp do zawartości zasobów strony internetowej za pomocą Pythona poprzez protokół debugowania Chrome, z tej strony method-getResourceContent, zauważyłem tę metodę: getResourceContent, potrzebuję params frameId i url.i myślę, że ta metoda jest tym co potrzebuję. więc to uczynił:jak uzyskać zawartość zasobów strony internetowej poprzez zdalne debugowanie chrome

1.Get uruchomieniu Chrome jako serwera. \ Chrome.exe --remote-debugowanie-port = 9222

2.write kodu testu python:

# coding=utf-8 
""" 
chrome --remote-debugging api test 
""" 

import json 
import requests 
import websocket 

import pdb 

def send(): 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.navigate' 
    request['params'] = {"url": 'http://global.bing.com'} 
    ws = websocket.create_connection(websocketURL) 
    ws.send(json.dumps(request)) 
    res = ws.recv() 
    ws.close() 
    print res 

    frameId = json.loads(res)['result']['frameId'] 
    print frameId 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    req = {} 
    req['id'] = 1 
    req['method'] = 'Page.getResourceContent' 
    req['params'] = {"frameId":frameId,"url": 'http://global.bing.com'} 
    header = ["User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"] 
    pdb.set_trace() 
    ws = websocket.create_connection(websocketURL,header=header) 
    ws.send(json.dumps(req)) 
    ress = ws.recv() 
    ws.close() 
    print ress 
if __name__ == '__main__': 
    send() 

3.Page.navigate praca w porządku, mam coś takiego: { "id": 1, "wynik": { "frameId": "8504,2"}}

4.When próbuję metodę: getResourceContent , wystąpił błąd: {"error": {"code": - 32000, "message": "Agent nie jest włączony . "}," id ": 1}

Próbowałem dodać User-Agent, nadal nie działa.

Dzięki.

Odpowiedz

2

Komunikat o błędzie "Agent nie jest włączony" nie ma nic wspólnego z nagłówkiem HTTP User-Agent, ale odnosi się do agenta w chrome, który musi być włączony, aby pobrać zawartość strony.

Termin „środek” jest nieco mylące, ponieważ protocol documentation mówi o domenach, które muszą być włączony żeby je debugowania (określenie „środek” odnosi się do sposobu, jest to realizowane w Chrome wewnętrznie, jak przypuszczam)

Pytanie więc, która domena musi być włączona, aby uzyskać dostęp do zawartości strony? Z perspektywy czasu jest to dość oczywiste: domena Page musi być włączona, ponieważ wywołujemy metodę w tej domenie. Znalazłem to dopiero po potknięciu się o this example.

Po dodaniu żądania Page.enable do skryptu, aby aktywować domenę Page, komunikat o błędzie zniknął. Ja jednak napotkał dwa inne problemy:

  1. Połączenie WebSockets musi być otwarte między żądaniami jak Chrome utrzymują pewien stan pomiędzy wywołaniami (takich jak to, czy agent jest włączony)
  2. Podczas nawigacji do http://global.bing.com/ przeglądarka jest przekierowywana pod numer http://www.bing.com/ (przynajmniej jest na moim komputerze). Powoduje to, że Page.getResourceContent nie może pobrać zasobu, ponieważ żądany zasób nie jest dostępny.

Po naprawieniu tych problemów udało mi się odzyskać zawartość strony. To jest mój kod:

# coding=utf-8 
""" 
chrome --remote-debugging api test 
""" 

import json 
import requests 
import websocket 

def send(): 
    # Setup websocket connection: 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    ws = websocket.create_connection(websocketURL) 

    # Navigate to global.bing.com: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.navigate' 
    request['params'] = {"url": 'http://global.bing.com'} 
    ws.send(json.dumps(request)) 
    result = ws.recv() 
    print "Page.navigate: ", result 
    frameId = json.loads(result)['result']['frameId'] 

    # Enable page agent: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.enable' 
    request['params'] = {} 
    ws.send(json.dumps(request)) 
    print 'Page.enable: ', ws.recv() 

    # Retrieve resource contents: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.getResourceContent' 
    request['params'] = {"frameId": frameId, "url": 'http://www.bing.com'} 
    ws.send(json.dumps(request)) 
    result = ws.recv() 
    print("Page.getResourceContent: ", result) 

    # Close websocket connection 
    ws.close() 

if __name__ == '__main__': 
    send() 
Powiązane problemy