55

Python で記述されたクローラーを使用して Web サイトをクロールしようとしています。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)
4

12 に答える 12

23

SOCKS ポートに接続しようとしています - Tor は非 SOCKS トラフィックを拒否します。ポート 8118 を使用して、仲介者 (Privoxy) 経由で接続できます。

例:

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 に渡されるプロパティに注意してください。

于 2010-01-06T19:37:37.497 に答える
2

Python で tor プロキシを使用してファイルをダウンロードするためのコードは次のとおりです: (update 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()
于 2012-01-27T17:02:29.273 に答える
2

次の解決策は、Python 3で機能します。CiroSantilli の回答から適応:

urllib(Python 3 の urllib2 の名前) を使用:

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

: Tor を頻繁に使用する予定がある場合は、Torのすばらしい成果を支援するために寄付を検討してください。

于 2016-10-20T12:46:22.373 に答える
2

tor の前で http-proxy として privoxy を使用するとうまくいきます - ここにクローラーテンプレートがあります:


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()
于 2009-07-08T12:13:35.120 に答える
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">

(等。)

于 2009-07-08T06:34:44.910 に答える
0

Tor はソックス プロキシです。引用した例で直接接続すると、「urlopen error Tunnel connection failed: 501 Tor is not an HTTP Proxy」で失敗します。他の人が言及したように、Privoxy を使用してこれを回避できます。

または、PycURL または SocksiPy を使用することもできます。tor で両方を使用する例については、... を参照してください。

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

于 2015-06-04T16:41:28.750 に答える
0

あなたはトリファイを使うことができます

でプログラムを実行します

~$torify python your_program.py
于 2016-11-20T23:24:19.423 に答える