it-swarm.com.de

Wie mache ich urllib2-Anfragen über Tor in Python?

Ich versuche, Websites mit einem in Python geschriebenen Crawler zu crawlen. Ich möchte Tor mit Python integrieren, was bedeutet, dass ich die Website anonym mit Tor durchsuchen möchte.

Ich habe es versucht. Es scheint nicht zu funktionieren. Ich habe meine IP überprüft, es ist immer noch die gleiche wie vor meiner Benutzung. Ich habe es per Python überprüft.

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

Sie versuchen, eine Verbindung zu einem SOCKS-Port herzustellen - Tor weist jeglichen Nicht-SOCKS-Verkehr zurück. Sie können über einen Zwischenhändler - Privoxy - über Port 8118 eine Verbindung herstellen.

Beispiel:

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()

Beachten Sie auch die Eigenschaften, die an ProxyHandler übergeben werden, kein http: IP-Anschluss

21
Dmitri Farkov
pip install PySocks

Dann:

import socket
import socks
import urllib2

ipcheck_url = 'http://checkip.amazonaws.com/'

# Actual IP.
print(urllib2.urlopen(ipcheck_url).read())

# Tor IP.
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9050)
socket.socket = socks.socksocket
print(urllib2.urlopen(ipcheck_url).read())

Verwenden Sie nur urllib2.ProxyHandler wie in https://stackoverflow.com/a/2015649/895245 schlägt fehl mit:

Tor is not an HTTP Proxy

Erwähnt bei: Wie kann ich einen SOCKS 4/5-Proxy mit urllib2 verwenden?

Getestet auf Ubuntu 15.10, Tor 0.2.6.10, Python 2.7.10.

Die folgende Lösung funktioniert für mich in Python 3. Angepasst von CiroSantillis Antwort :

Mit urllib (Name von urllib2 in Python 3):

import socks
import socket
from urllib.request import urlopen

url = 'http://icanhazip.com/'

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9150)
socket.socket = socks.socksocket

response = urlopen(url)
print(response.read())

Mit requests:

import socks
import socket
import requests

url = 'http://icanhazip.com/'

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9150)
socket.socket = socks.socksocket

response = requests.get(url)
print(response.text)

Mit Selenium + PhantomJS:

from Selenium import webdriver

url = 'http://icanhazip.com/'

service_args = [ '--proxy=localhost:9150', '--proxy-type=socks5', ]
phantomjs_path = '/your/path/to/phantomjs'

driver = webdriver.PhantomJS(
    executable_path=phantomjs_path, 
    service_args=service_args)

driver.get(url)
print(driver.page_source)
driver.close()

Hinweis: Wenn Sie planen, Tor häufig zu verwenden, sollten Sie eine Spende machen, um ihre großartige Arbeit zu unterstützen!

2
J0ANMM

Hier ist ein Code zum Herunterladen von Dateien mit Tor Proxy in Python: (Aktualisierungs-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()
2
carloona

Update - Die neueste (ab v2.10.0) requests -Bibliothek unterstützt Sockenproxys mit der zusätzlichen Anforderung requests[socks] .

Installation -

pip install requests requests[socks]

Grundlegende Verwendung -

import requests
session = requests.session()
# Tor uses the 9050 port as the default socks port
session.proxies = {'http':  'socks5://127.0.0.1:9050',
                   'https': 'socks5://127.0.0.1:9050'}

# Make a request through the Tor connection
# IP visible through Tor
print session.get("http://httpbin.org/ip").text
# Above should print an IP different than your public IP

# Following prints your normal public IP
print requests.get("http://httpbin.org/ip").text

Alte Antwort - Auch wenn dies ein alter Beitrag ist, antworten Sie, weil niemand die Bibliothek requesocks erwähnt zu haben scheint.

Es ist im Grunde ein Port der requests Bibliothek. Bitte beachten Sie, dass es sich bei der Bibliothek um eine alte Abzweigung (letzter Stand 2013-03-25) handelt, die möglicherweise nicht die gleichen Funktionen wie die letzte Anforderungsbibliothek aufweist.

Installation -

pip install requesocks

Grundlegende Verwendung -

# Assuming that Tor is up & running
import requesocks
session = requesocks.session()
# Tor uses the 9050 port as the default socks port
session.proxies = {'http':  'socks5://127.0.0.1:9050',
                   'https': 'socks5://127.0.0.1:9050'}
# Make a request through the Tor connection
# IP visible through Tor
print session.get("http://httpbin.org/ip").text
# Above should print an IP different than your public IP
# Following prints your normal public IP
import requests
print requests.get("http://httpbin.org/ip").text
2
shad0w_wa1k3r

Die Verwendung von privoxy als http-proxy vor tor funktioniert für mich - hier ist eine Crawler-Vorlage:


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()
2

Der folgende Code arbeitet zu 100% mit Python 3.4

(Sie müssen TOR Browser geöffnet lassen, um diesen Code zu verwenden.)

Dieses Skript stellt über socks5 eine Verbindung zu TOR her. Rufen Sie die IP-Adresse von checkip.dyn.com ab, ändern Sie die Identität und senden Sie die Anforderung erneut, um eine neue IP-Adresse zu erhalten.

Sie müssen die entsprechenden Bibliotheken installieren, damit dies funktioniert. (Genießen und nicht missbrauchen)

import socks
import socket
import time
from stem.control import Controller
from stem import Signal
import requests
from bs4 import BeautifulSoup
err = 0
counter = 0
url = "checkip.dyn.com"
with Controller.from_port(port = 9151) as controller:
    try:
        controller.authenticate()
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150)
        socket.socket = socks.socksocket
        while counter < 10:
            r = requests.get("http://checkip.dyn.com")
            soup = BeautifulSoup(r.content)
            print(soup.find("body").text)
            counter = counter + 1
            #wait till next identity will be available
            controller.signal(Signal.NEWNYM)
            time.sleep(controller.get_newnym_wait())
    except requests.HTTPError:
        print("Could not reach URL")
        err = err + 1
print("Used " + str(counter) + " IPs and got " + str(err) + " errors")
2
Amine

Möglicherweise haben Sie Probleme mit der Netzwerkverbindung? Das obige Skript funktionierte für mich (ich habe eine andere URL verwendet - ich verwendete http://stackoverflow.com/ -) und erhalte die Seite wie erwartet:

<!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">

(usw.)

1
Vinay Sajip

Ich dachte, ich würde einfach eine Lösung teilen, die für mich funktionierte (python3, windows10):

Schritt 1: Aktivieren Sie Ihren Tor ControlPort unter 9151

Der Tordienst wird am Standardport 9150 und ControlPort auf 9151 ausgeführt. Sie sollten die lokale Adresse 127.0.0.1:9150 und 127.0.0.1:9151 sehen können, wenn Sie netstat -an ausführen.

[go to windows terminal]
cd ...\Tor Browser\Browser\TorBrowser\Tor
tor --service remove
tor --service install -options ControlPort 9151
netstat -an 

Schritt 2: Python-Skript wie folgt.

# library to launch and kill Tor process
import os
import subprocess

# library for Tor connection
import socket
import socks
import http.client
import time
import requests
from stem import Signal
from stem.control import Controller

# library for scraping
import csv
import urllib
from bs4 import BeautifulSoup
import time

def launchTor():
    # start Tor (wait 30 sec for Tor to load)
    sproc = subprocess.Popen(r'.../Tor Browser/Browser/firefox.exe')
    time.sleep(30)
    return sproc

def killTor(sproc):
    sproc.kill()

def connectTor():
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150, True)
    socket.socket = socks.socksocket
    print("Connected to Tor")

def set_new_ip():
    # disable socks server and enabling again
    socks.setdefaultproxy()
    """Change IP using TOR"""
    with Controller.from_port(port=9151) as controller:
        controller.authenticate()
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150, True)
        socket.socket = socks.socksocket
        controller.signal(Signal.NEWNYM)

def checkIP():
    conn = http.client.HTTPConnection("icanhazip.com")
    conn.request("GET", "/")
    time.sleep(3)
    response = conn.getresponse()
    print('current ip address :', response.read())

# Launch Tor and connect to Tor network
sproc = launchTor()
connectTor()

# list of url to scrape
url_list = [list of all the urls you want to scrape]

for url in url_list:
    # set new ip and check ip before scraping for each new url
    set_new_ip()
    # allow some time for IP address to refresh
    time.sleep(5)
    checkIP()

    '''
    [insert your scraping code here: bs4, urllib, your usual thingy]
    '''

# remember to kill process 
killTor(sproc)

Mit diesem Skript wird die IP-Adresse für jede URL erneuert, die Sie abfragen möchten. Stellen Sie nur sicher, dass Sie lange genug schlafen, damit sich die IP-Adresse ändern kann. Zuletzt getestet gestern. Hoffe das hilft! 

0
KittyBot

So erweitern Sie den obigen Kommentar zur Verwendung von Torify und des Tor-Browsers (und benötigen kein Privoxy):

pip install PySocks
pip install pyTorify

(Tor-Browser installieren und starten)

Befehlszeilenverwendung:

python -mtorify -p 127.0.0.1:9150 your_script.py

Oder in ein Skript eingebaut:

import torify
torify.set_tor_proxy("127.0.0.1", 9150)
torify.disable_tor_check()
torify.use_tor_proxy()

# use urllib as normal
import urllib.request
req = urllib.request.Request("http://....")
req.add_header("Referer", "http://...") # etc
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")

Beachten Sie, dass der Tor-Browser den Port 9150 verwendet, nicht 9050

0
Steve Lockwood

Tor ist ein Socken-Stellvertreter. Eine direkte Verbindung dazu mit dem von Ihnen zitierten Beispiel schlägt fehl mit "Urlopen-Fehler Tunnelverbindung fehlgeschlagen: 501 Tor ist kein HTTP-Proxy". Wie bereits erwähnt, können Sie dies mit Privoxy umgehen.

Alternativ können Sie auch PycURL oder SocksiPy verwenden. Beispiele für die Verwendung beider mit tor finden Sie in ...

https://stem.torproject.org/tutorials/to_russia_with_love.html

0
Damian

sie können torify verwenden

führen Sie Ihr Programm mit aus

~$torify python your_program.py
0
mohamed emad