2009-07-08 5 views
46

Sto provando a eseguire la scansione dei siti Web utilizzando un crawler scritto in Python. Voglio integrare Tor con Python, il che significa che voglio eseguire la scansione del sito in modo anonimo usando Tor.Come effettuare richieste urllib2 tramite Tor in Python?

Ho provato a farlo. Non sembra funzionare. Ho controllato il mio IP, è ancora lo stesso di quello usato prima. L'ho controllato tramite Python.

import urllib2 
proxy_handler = urllib2.ProxyHandler({"tcp":"http://127.0.0.1:9050"}) 
opener = urllib2.build_opener(proxy_handler) 
urllib2.install_opener(opener) 
+5

Giusto per comunicarti i termini di servizio di whatismyipaddress: non puoi utilizzare uno script, un agente, un'applicazione o altrimenti consultare questo sito Web in modo automatizzato senza previa autorizzazione scritta. – LiraNuna

+5

Duplicato di http://stackoverflow.com/questions/711351/using-urllib-with-tor – LiraNuna

+6

Dato che non c'erano risposte accettate o particolarmente utili su quell'altro thread, voterei per mantenere aperto questo thread poiché è ancora valido secondo me – jrista

risposta

1

Forse si verificano problemi di connettività di rete? Lo script precedente ha funzionato per me (ho sostituito un URL diverso - ho usato http://stackoverflow.com/ - e ottengo la pagina come previsto:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > 
<html> <head> 

<title>Stack Overflow</title>   
<link rel="stylesheet" href="/content/all.css?v=3856"> 

(etc.)

2

usare privoxy come http-proxy di fronte a tor funziona per me - ecco un cingolato-template:.


import urllib2 
import httplib 

from BeautifulSoup import BeautifulSoup 
from time import sleep 

class Scraper(object): 
    def __init__(self, options, args): 
     if options.proxy is None: 
      options.proxy = "http://localhost:8118/" 
     self._open = self._get_opener(options.proxy) 

    def _get_opener(self, proxy): 
     proxy_handler = urllib2.ProxyHandler({'http': proxy}) 
     opener = urllib2.build_opener(proxy_handler) 
     return opener.open 

    def get_soup(self, url): 
     soup = None 
     while soup is None: 
      try: 
       request = urllib2.Request(url) 
       request.add_header('User-Agent', 'foo bar useragent') 
       soup = BeautifulSoup(self._open(request)) 
      except (httplib.IncompleteRead, httplib.BadStatusLine, 
        urllib2.HTTPError, ValueError, urllib2.URLError), err: 
       sleep(1) 
     return soup 

class PageType(Scraper): 
    _URL_TEMPL = "http://foobar.com/baz/%s" 

    def items_from_page(self, url): 
     nextpage = None 
     soup = self.get_soup(url) 

     items = [] 
     for item in soup.findAll("foo"): 
      items.append(item["bar"]) 
      nexpage = item["href"] 

     return nextpage, items 

    def get_items(self): 
     nextpage, items = self._categories_from_page(self._START_URL % "start.html") 
     while nextpage is not None: 
      nextpage, newitems = self.items_from_page(self._URL_TEMPL % nextpage) 
      items.extend(newitems) 
     return items() 

pt = PageType() 
print pt.get_items() 
21

Si sta tentando di connettersi a una porta SOCKS - Tor rifiuta qualsiasi tipo di traffico non-SOCKS È possibile connettersi tramite un intermediario - Privoxy - tramite la porta 8118.

Esempio:

proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"}) 
opener = urllib2.build_opener(proxy_support) 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
print opener.open('http://www.google.com').read() 

Inoltre si prega di notare proprietà passati a ProxyHandler, non anteponendo il ip http: porta

+1

8118 non è una porta Tor, è una porta privoxy! Tor ascolta su 9050 per impostazione predefinita. Devi comunque connetterti a 8118, perché stai provando a connetterti tramite il Proxy HTTP, che è ciò che fornisce Withoutxy. – Pankaj

+6

Questa risposta è male, e dovresti sentirti male. La porta di controllo Tor è 9051, non 9050. 9050 è la porta dei socks che puoi usare come questa http://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy- with-urllib2 – s3v3n

+0

I'll edit. Ho scambiato Privoxy con la porta di Tor, tuttavia, il risultato finale è lo stesso nonostante l'intermediario. Soprattutto, dal momento che la maggior parte delle installazioni Tor vengono fornite in bundle insieme a Privoxy. –

2

Ecco un codice per il download di file utilizzando il proxy Tor in python: (aggiornamento url)

import urllib2 

url = "http://www.disneypicture.net/data/media/17/Donald_Duck2.gif" 

proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8118'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 

file_name = url.split('/')[-1] 
u = urllib2.urlopen(url) 
f = open(file_name, 'wb') 
meta = u.info() 
file_size = int(meta.getheaders("Content-Length")[0]) 
print "Downloading: %s Bytes: %s" % (file_name, file_size) 

file_size_dl = 0 
block_sz = 8192 
while True: 
    buffer = u.read(block_sz) 
    if not buffer: 
     break 

    file_size_dl += len(buffer) 
    f.write(buffer) 
    status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100./file_size) 
    status = status + chr(8)*(len(status)+1) 
    print status, 

f.close() 
0

è possibile utilizzare torify

eseguire il programma con

~$torify python your_program.py