Вопрос по python, tor – Как сделать urllib2-запросы через Tor в Python?

48

Я пытаюсь сканировать веб-сайты, используя сканер, написанный на Python. Я хочу интегрировать Tor с Python, что означает, что я хочу сканировать сайт анонимно, используя Tor.

Я пытался сделать это. Это не похоже на работу. Я проверил свой IP-адрес, он все еще такой же, как тот, который я использовал перед тем как использовать tor Я проверил это через Python.

import urllib2
proxy_handler = urllib2.ProxyHandler({"tcp":"http://127.0.0.1:9050"})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
Принимая во внимание то, что в этой другой ветке не было принято или особенно полезных ответов, я бы проголосовал за то, чтобы оставить эту ветку открытой, так как она все еще действительна, по моему мнению jrista
Просто чтобы вы знали, whatismyipaddress & apos; Условия обслуживания: Вы не можете использовать скрипт, агент, приложение или иным образом запрашивать этот сайт в автоматическом режиме без предварительного письменного разрешения. LiraNuna
Я думаю, что это не совсем глупость - это был более общий вопрос, это обращение за помощью к конкретному фрагменту кода. Vinay Sajip
Вы можете проверить этот порт, это помогло мне.stackoverflow.com/questions/9887505/… torayeff

Ваш Ответ

12   ответов
2

(вам нужно держать TOR Browser открытым, используя этот код)

Этот скрипт подключается к TOR через socks5, получает IP с checkip.dyn.com, меняет личность и повторно отправляет запрос на получение нового IP (повторяется 10 раз)

Вам нужно установить соответствующие библиотеки, чтобы это работало. (Наслаждайтесь и не злоупотребляйте)

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")
1

у вас есть проблемы с сетевым подключением? Вышеупомянутый скрипт работал для меня (я заменил другой URL - я использовалhttp://stackoverflow.com/ - и я получаю страницу, как ожидалось:

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

(так далее.)

0

браузера Tor (и не требует Privoxy):

pip install PySocks
pip install pyTorify

(установите браузер Tor и запустите его)

Использование командной строки:

python -mtorify -p 127.0.0.1:9150 your_script.py

Или встроен в скрипт:

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

Обратите внимание, что браузер Tor использует порт 9150, а не 9050

2

(обновление 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

ня - вот шаблон для поиска:


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, ValueEr,ror, 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()
0

я бы просто поделился решением, которое работало для меня (python3, windows10):

Шаг 1: Включите ваш Tor ControlPort на9151.

Сервис Tor работает на порте по умолчанию9150 и ControlPort на9151, Вы должны быть в состоянии увидеть местный адрес127.0.0.1:9150 а также127.0.0.1:9151 когда ты бежишьnetstat -an.

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

Шаг 2: скрипт Python, как следует.

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

Этот скрипт выше обновит IP-адрес для каждого URL, который вы хотите очистить. Просто убедитесь, что вы спите достаточно долго для изменения IP. Последняя проверка вчера. Надеюсь это поможет!

21

трафик. Вы можете подключиться через посредника - Privoxy - используя порт 8118.

Пример:

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

Также обратите внимание, что свойства переданы в ProxyHandler, http не префикс ip: port

Я буду редактировать. Я ошибочно принял Privoxy с портом Tor, однако, несмотря на посредника, конечный результат один и тот же. Тем более, что большинство установок Tor поставляются в комплекте с Privoxy.
8118 - это не порт Tor, это порт privoxy! Tor слушает на 9050 по умолчанию. Однако вам нужно подключиться к 8118, потому что вы пытаетесь подключиться через HTTP-прокси, что обеспечивает privoxy.
Ах, мой плохой. В любом случае, я ни разу не пытался выдать себя за эксперта Tor, просто предложил решение, которое сработало для меня.
Этот ответ плохой, и ты должен чувствовать себя плохо. Порт управления Tor - 9051, а не 9050. 9050 - это порт носков, который вы можете использовать следующим образом.stackoverflow.com/questions/2317849/…
Вы путаетеTor сTor Bundle. Tor Bundle действительно идет сVidalia, Privoxy а такжеFirefox, но есть и автономныйTor что на Linux может быть установлен сapt-get/yum.
0

пример, который вы приводите происходит сбой с & quot; ошибка urlopen. Туннельное соединение не удалось: 501 Tor не является прокси-сервером HTTP & quot ;. Как уже упоминали другие, вы можете обойти это с Privoxy.

В качестве альтернативы вы также можете использовать PycURL или SocksiPy. Примеры использования обоих с tor смотрите ...

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

8
pip install PySocks

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

Используя толькоurllib2.ProxyHandler как вhttps://stackoverflow.com/a/2015649/895245 не удается с:

Tor is not an HTTP Proxy

Упоминается в:Как я могу использовать SOCKS 4/5 прокси с urllib2?

Протестировано на Ubuntu 15.10, Tor 0.2.6.10, Python 2.7.10.

@JoanMM спасибо за отчет. Пожалуйста, укажите ваши точные версии ОС, python и tor. Это работает на Python 2 для вас?
Mac OS X Версия 10.9.5 / Python 3.5.2 / Tor Browser для Mac Версия 6.0.5 - OS X (10.6+). Я не проверял в Python 2, я только использую Python 3.
С 9050 он не работает для меня в Python 3. Я получаю следующую ошибку:urllib.error.URLError: <urlopen error PySocks doesn't support IPv6>, С9150 вместо 9050 работает, правда.
2

Python 3, Адаптировано из СироСантиллиответ:

Сurllib (имя urllib2 в 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())

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

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

Note: Если вы планируете часто использовать Tor, подумайте опожертвование поддержать их потрясающую работу!

2

Update - The latest (upwards of v2..0) requests библиотека поддерживает прокси-носители с дополнительным требованиемrequests[socks].

Installation -

pip install requests requests[socks]

Basic usage -

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

Old answer - Even though this is an old post, answering because no one seems to have mentioned the requesocks библиотека.

Это в основном портrequests библиотека. Обратите внимание, что библиотека является старым форком (последнее обновление 2013-03-25) и может не иметь тех же функций, что и библиотека последних запросов.

Installation -

pip install requesocks

Basic usage -

# 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
Вы также можете просто использовать встроенную последнюю версию запросов, имеет параметр proxy =, куда вы можете передатьsocks5:127.0.0.1:9050
0

Torify

запустить вашу программу с

~$torify python your_program.py

Похожие вопросы