Вопрос:

Python Соскоб TOR, сценарий "В Россию с любовью"

python web-scraping tor bs4

256 просмотра

1 ответ

744 Репутация автора

Я пытаюсь разобраться с BS4 через TOR, используя учебник To Russia With Love из проекта Stem.

Я немного переписал код, используя этот ответ , и теперь он выглядит так,

SOCKS_PORT=7000

def query(url):

output = io.BytesIO()

query = pycurl.Curl()
query.setopt(pycurl.URL, url)
query.setopt(pycurl.PROXY, 'localhost')
query.setopt(pycurl.PROXYPORT, SOCKS_PORT)
query.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5_HOSTNAME)
query.setopt(pycurl.WRITEFUNCTION, output.write)

try:
    query.perform()
    return output.getvalue()
except pycurl.error as exc:
    return "Unable to reach %s (%s)" % (url, exc)

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

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

tor_process = stem.process.launch_tor_with_config(
   tor_cmd = '/Applications/TorBrowser.app/Contents/MacOS/Tor/tor.real',
   config = {
      'SocksPort': str(SOCKS_PORT),
      'ExitNodes': '{ru}',
      'GeoIPFile': r'/Applications/TorBrowser.app/Contents/Resources/TorBrowser/Tor/geoip',
      'GeoIPv6File' : r'/Applications/TorBrowser.app/Contents/Resources/TorBrowser/Tor/geoip6'
},
       init_msg_handler = print_bootstrap_lines,
)

print(term.format("\nChecking our endpoint:\n", term.Attr.BOLD))
print(term.format(query("https://www.atagar.com/echo.php"), term.Color.BLUE))

Я могу установить схему Tor, но при «проверке нашей конечной точки» я получаю следующую ошибку:

Checking our endpoint:

Traceback (most recent call last):

File "<ipython-input-804-68f8df2c050b>", line 40, in <module>
print(term.format(query('https://www.atagar.com/echo.php'), term.Color.BLUE))

File "/Applications/anaconda/lib/python3.6/site-packages/stem/util/term.py", line 139, in format
if RESET in msg:

TypeError: a bytes-like object is required, not 'str'

Что я должен изменить, чтобы увидеть конечную точку?

Я временно решил это, изменив последнюю строку кода выше с помощью,

test=requests.get('https://www.atagar.com/echo.php')
soup = BeautifulSoup(test.content, 'html.parser')
print(soup)

но я хотел бы знать, как заставить работать «оригинальную» линию.

Автор: LucSpan Источник Размещён: 18.03.2017 12:34

Ответы (1)


0 плюса

2443 Репутация автора

Вы должны использовать Python 3, когда этот код был создан для Python 2. В Python 2 strи bytesто же самое, и в Python 3, strэто Python 2 unicode. Вы должны добавить bнепосредственно перед строкой, чтобы сделать ее байтовой строкой в ​​Python 3, например:

b"this is a byte string"
Автор: Julien Размещён: 18.03.2017 12:39
Вопросы из категории :
32x32