2017-08-09 4 views
1

Je dois configurer la connexion avec différents sites Web de la liste. Envoyez un paquet et un paquet de reniflement pour ce site Web seulement jusqu'à ce que je ne parte pas pour le prochain site Web (itération). Quand je vais à l'itération suivante (site web) je veux renifler et filtrer pour cette adresse seulement. Puis-je réaliser cela dans un seul code python?envoi de paquets et reniflage dans le même code python

sniff(filter="ip and host " + ip_addr,prn=print_summary) 
req = "GET/HTTP/1.1\r\nHost: "+ website +"\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/58.0.3029.110 Chrome/58.0.3029.110 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\n\r\n" 
url = (website, 80) 
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=socket.IPPROTO_TCP) 
c.settimeout(5.0) 
c.connect(url) 
c.setsockopt(socket.SOL_IP, socket.IP_TTL, i) 
c.send(req) 
print str(c.recv(4096)) 
c.close() 

Je cours le code ci-dessus dans la boucle. Mais lors de sa première course, il se bloque dans la fonction de reniflement. Est-ce que quelqu'un peut m'aider avec ça?

+0

utilisez-vous ce code pour vérifier si le site Web est en place? – Stack

+0

non, je vais utiliser cela à des fins d'analyse. Pour cela, je veux analyser les paquets pour une liste de sites lors de la configuration de la connexion et trouver quelques faits. – tarun14110

+0

Qu'est-ce que 'sniff()'? Où est-ce défini? – randomir

Répondre

1

OK J'ai modifié la réponse.

Il n'est pas facile de renifler des paquets pour un seul site Web, car la syntaxe Berkley Packet Filter utilisée par scrapy n'a pas d'option simple pour HTTP. Voir this question pour quelques suggestions sur les options disponibles.

Une possibilité est de renifler les paquets TCP vers/depuis votre serveur proxy web; Je l'ai fait dans l'exemple de code ci-dessous, qui enregistre les paquets TCP pour une liste d'URL différentes pour les fichiers nommés individuels. Je n'ai mis aucune logique pour détecter quand le chargement de la page se termine, j'ai juste utilisé un délai de 60 secondes. Si vous voulez quelque chose de différent, vous pouvez l'utiliser comme point de départ. Si vous n'avez pas de serveur proxy à renifler, vous devrez modifier la variable bpf_filter.

NB si vous souhaitez enregistrer les données par paquets brutes, au lieu de la version convertie à chaîne, puis modifiez la ligne concernée (qui est commenté dans le code.)

from scapy.all import * 
import urllib 
import urlparse 
import threading 
import re 

proxy = "http://my.proxy.server:8080" 
proxyIP = "1.2.3.4" # IP address of proxy 

# list of URLs 
urls = ["http://www.bbc.co.uk/news", 
     "http://www.google.co.uk"] 

packets = [] 

# packet callback 
def pkt_callback(pkt): 
    packets.append(pkt) # save the packet 

# monitor function 
def monitor(fname): 
    del packets[:] 
    bpf_filter = "tcp and host " + proxyIP  # set this filter to capture the traffic you want 
    sniff(timeout=60, prn=pkt_callback, filter=bpf_filter, store=0) 
    f=open(fname+".data", 'w') 
    for pkt in packets: 
     f.write(repr(pkt)) # or just save the raw packet data instead 
     f.write('\n') 
    f.close() 

for url in urls: 
    print "capturing: " + url 
    mon = threading.Thread(target=monitor, args=(re.sub(r'\W+', '', url),)) 
    mon.start() 
    data = urllib.urlopen(url, proxies={'http': proxy}) 
    # this line gets IP address of url host, might be helpful 
    # addr = socket.gethostbyname(urlparse.urlparse(data.geturl()).hostname) 
    mon.join() 

Hope this vous donne un bon point de départ.

+0

Disons que je fais 'urllib.urlopen' en boucle sur une liste de sites web. Et au moment où je me connecte à un site Web spécifique, je veux juste renifler des paquets de ce site Web (peut être un filtre ip.addr, qui change à chaque itération), calculer des données et stocker des données individuellement pour chaque site. Pouvez-vous s'il vous plaît m'aider avec ça? – tarun14110

+0

@ tarun14110 J'ai modifié la réponse pour ce faire, mais vous devrez peut-être essayer différentes configurations pour le filtre scrapy (format BPF) –