При доступе к youtube через стебель (tor) выдается ошибка «не удается достичь URL-адреса».

Я объединил этот пример в основу с pytube, чтобы измерить время, необходимое мне для загрузки видео с YouTube через Tor.

Вот код:

import io
import pycurl
import stem.process
from stem.util import term
import pickle
import socks  # SocksiPy module
import socket
import urllib
from pytube import YouTube
import pdb
import time
import string
import random

SOCKS_PORT = 9050
# Set socks proxy and wrap the urllib module

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

# Perform DNS resolution through the socket

def getaddrinfo(*args):
  return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]

socket.getaddrinfo = getaddrinfo

def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def query(url):

    try:
        yt = YouTube('https://www.youtube.com/watch?v=5mkm22yO-bs')
        yt.set_filename(id_generator(6))
        video = yt.get('3gp', '144p')
        start = time.time()
        video.download('/tmp/') 
        end = time.time()
        time_ = end - start
        return time_

    except:
        return "Unable to reach %s" % url

def print_bootstrap_lines(line):
    if "Bootstrapped " in line:
        print(term.format(line, term.Color.BLUE))

def main():

    print(term.format("Starting Tor:\n", term.Attr.BOLD))

    tor_process = stem.process.launch_tor_with_config(
        config = {
            'SocksPort': str(SOCKS_PORT),

        },
        init_msg_handler = print_bootstrap_lines,
    )

    url = 'https://www.youtube.com/watch?v=5mkm22yO-bs'
    times = [0]*10

    for i in xrange(10):

        times[i] = query(url)

    tor_process.kill()  # stops tor

    with open('times_yout_jung.pickle', 'wb') as f:
        pickle.dump(times, f)

if __name__ == "__main__":
    main()

Однако выдает ошибку «Невозможно достичь URL-адреса». И когда я пытаюсь нормально маршрутизировать трафик через этот код (чтобы посмотреть, работает ли pytube), он работает:

from pytube import YouTube
import pdb
import time     
import string
import random

def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def main():


    pdb.set_trace()
    yt = YouTube('https://www.youtube.com/watch?v=5mkm22yO-bs')
    yt.set_filename(id_generator(6))
    video = yt.get('3gp', '144p')
    start = time.time()
    video.download('/tmp/') 
    end = time.time()

    print("Time ", end - start)

if __name__ == "__main__":
    main()

Я пытался отладить код с помощью pdb, но не могу понять, что может пойти не так. Кто-нибудь может помочь?


person QPTR    schedule 28.04.2016    source источник
comment
Tor нормально запускается? У меня код работает нормально, если я удалю часть о запуске процесса Tor, потому что он уже работает как демон. Так что, похоже, в этом нет ничего плохого, если только не запущены носки Tor.   -  person drew010    schedule 29.04.2016
comment
@ drew010 Да, это так. Печать всех строк начальной загрузки. Однако, когда я перечитал файл рассола, в котором я все время хранил, все они имеют ошибку «Невозможно достичь URL-адреса». И видео тоже нет в папке tmp. Скачиваются ли видео с вашей стороны?   -  person QPTR    schedule 29.04.2016
comment
Кроме того, когда я использую pdb, кажется, что он застревает на yt = YouTube('https://www.youtube.com/watch?v=5mkm22yO-bs') . Строка после yt.set_filename(id_generator(6)) не выполняется. И цикл возвращается обратно к yt = YouTube('https://www.youtube.com/watch?v=5mkm22yO-bs'). Несмотря на то, что строка set_filename выполняется в обычном коде без Tor'red.   -  person QPTR    schedule 29.04.2016
comment
Видео загружено, и я просто изменил SOCKS_PORT на что-то другое, и он смог запустить процесс Tor, а затем загрузить без проблем. К сожалению, глядя на код YouTube, я не вижу, как получить возможные исключения, мой Python не так хорош. Кажется, за кулисами происходит некоторая регистрация, которая может помочь, но я не знаю, куда она идет. Можете ли вы запустить обычный демон Tor и посмотреть, сможете ли вы успешно использовать его, а не запускать из Stem?   -  person drew010    schedule 29.04.2016
comment
Я только что запустил этот пример. Он тоже не работает. Выдает ошибку: 7, 'Failed to receive SOCKS5 connect request ack Tor открывается нормально, хотя на другом терминале. P.S. Не обращайте внимания на предыдущий комментарий.   -  person QPTR    schedule 29.04.2016
comment
Хорошо, теперь все работает нормально, с другим выходным узлом.   -  person QPTR    schedule 29.04.2016
comment
Я попытался немного отладить его, и где-то между ними выдает GeneralProxyError (находясь в модуле Youtube). Из этого видно, что что-то происходит с модулем socks.py, так как раньше это доставляло мне проблемы. Проблема, аналогичная этой (решение указанная в этой ссылке работает). Я скачал socks.py из sourceforge, затем скопировал/вставил его в dist-packages в папке python и заменил старую версию. Интересно, может ли это быть причиной.   -  person QPTR    schedule 29.04.2016