10

好的,这就是我需要的。我有一个基于 PHP 的网络爬虫。它可以在这里访问: http ://rz7ocnxxu7ka6ncv.onion/ 现在,我的问题是我的蜘蛛实际上爬取页面需要在 SOCKS 端口 9050 上这样做。问题是,我必须通过 Tor 隧道连接,以便它可以解析 .onion 域,这就是我要索引的内容。(仅以 .onion 结尾。)我使用 php crawl.php 从命令行调用此脚本,并添加适当的参数来抓取页面。这是我的想法:有什么方法可以强制它使用 Tor?或者我可以强制我的整个机器通过 Tor 隧道,以及如何?(就像强制所有流量通过 127.0.0.1:9050)也许如果我设置全局代理设置,php 会尊重它们吗?

如果我的任何解决方案有效,我会怎么做?(请逐步说明,我是菜鸟。)

我只想创建自己的 Tor 搜索引擎。(不要推荐我的 p2p 搜索引擎——这不是我想要的——我知道它们存在,我做了我的功课。)如果你有兴趣看一下,这里是爬虫源:也许是心地善良的人可以修改它以对所有爬取请求使用 127.0.0.1:9050 吗? http://pastebin.com/kscGJCc5

4

6 回答 6

10

cURL 还支持 SOCKS 连接;尝试这个:

<?php

$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

// SOCKS5
curl_setopt($ch, CURLOPT_PROXY, 'localhost:9050'); 
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

curl_exec($ch); 
curl_close($ch);
于 2012-07-11T10:46:31.867 回答
9

除非我遗漏了什么,否则答案是肯定的,这是Tor 网站上的一些文档。说明非常具体。虽然我没有将 Tor 设置为代理,但我已经考虑过,这是我要开始的地方。

编辑:在 Linux 上设置 Tor 并将其用作文档建议的代理非常简单。

sudo apt-get install tor
sudo /etc/init.d/tor start

netstat -ant | grep 9050 # verify Tor is running

现在在查看 OPs 代码后,我们看到了对file_get_contents的调用。当您想要开始参数化请求时,首先使用最简单的方法file_get_contents变得很麻烦,因为您必须使用流上下文

第一个建议是转到curl,但同样,更多关于 SOCKS 如何使用 HTTP 工作的阅读可能是为了真正回答这个问题......但是从技术上回答这个问题,如何向 Tor SOCKS 代理发送 HTTP 请求在本地主机上,再次简单..

<?php  
$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, 'https://127.0.01:9050/'); 
curl_exec($ch); 
curl_close($ch);

但是 Tor 告诉我们什么?

HTTP/1.0 501 Tor 不是 HTTP 代理

内容类型:文本/html;字符集=iso-8859-1

基本上,了解有关 SOCKS 和 HTTP 的更多信息。另一种选择是搜索 PHP SOCKS 客户端。快速检查会发现一个声称可以通过 SOCKS 发送 HTTP 请求的库。

编辑:

好的,还有 1 个编辑!在完成我的上一篇文章后几秒钟,我找到了一种方法。 本文向我们展示了如何设置名为Privoxy的东西,它将 SOCKS 请求转换为 HTTP 请求。把它放在 Tor 和 blamo 前面,我们正在通过 Tor 发送代理的 HTTP 请求!

于 2012-02-11T04:58:06.810 回答
2

您必须通过使用“dnsport”指令配置 tor 来拦截来自 php 脚本的 dns 查找请求。那么你必须为 tor 和一个“虚拟网络地址”配置一个“传输”。现在,当您的 php 脚本通过 dns 查找时会发生什么,即 tor 看到对洋葱地址的请求并使用“虚拟网络地址”范围内的 IP 地址进行回答。您现在必须将流向此地址的流量重定向到使用“传输”定义的地址。阅读有关“automaphostonresolve”、“virtualnetworkaddress”、“dnsport”和“transport”的“torrc”手册。

于 2014-01-25T12:27:52.890 回答
1

usewithtor我认为这就像使用ortorify选项运行命令行请求一样简单。例如:

$ usewithtor crawl.php

该脚本将能够与 .onion 站点进行交互。我自己为 Tor 构建了一个爬虫,我绝对不会走这条路线用于生产用途,而是使用 python、PySocks 和其他爬虫库而不是 CURL。希望这能回答您的问题,并为您提供一些关于其他实施策略的想法。

谢谢

于 2015-05-27T14:23:05.850 回答
0

我搜索了如何使用 Curl 在 php 中做同样的事情,我已经阅读了很多主题和示例,但这不起作用!没有成功,我看到了另一篇文章: 如何在 PHP 中使用 cURL 连接到 Tor 隐藏服务?在 Stackoverflow 上谁会很有趣

我已经成功找到了一个在 PHP 中对我有用的钩子:

小例子https://blockchainbdgpzk.onion/

exec('curl -k --socks5-hostname 127.0.0.1:9150 "https://blockchainbdgpzk.onion/tobtc?currency=EUR&value=5"', $a);

print_r( $a );

return  Array ( [0] => 0.0029577 ) 

当我在环境 Windows 上时,我将 curl.exe 和他的证书复制到文件夹 c:\windows\system32 中

或者这样也可以,只需添加这两条规则( -k )

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

来源: PHP CURL CURLOPT_SSL_VERIFYPEER 被忽略

$url = "https://blockchainbdgpzk.onion/tobtc?currency=EUR&value=5";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_PROXYTYPE, 7 );
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt ($ch, CURLOPT_PROXY, '127.0.0.1:9150' );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

ob_start();

curl_exec ($ch);
curl_close ($ch);

$result = ob_get_contents();
ob_end_clean();

var_dump($result);

返回字符串“0.00296787”(长度=10)

它并不完美,但如果它可以帮助某人。对不起我的狗屎英语朋友。

于 2017-07-16T17:49:41.563 回答
-2

只需让您拥有 HTTP 代理:

<?php

/**
* Proxy script that performs any HTTP request requested.
*/

// Check key
$key = 'YOUR_API_KEY';
if($_GET['key'] != $key) die; // Check for the API key

// Check URL
$url = isset($_GET['url']) ? trim(base64_decode($_GET['url'])) : '';
if(!$url || !filter_var($url, FILTER_VALIDATE_URL)) die; // Incorrect URL

class MyCurl {

    /**
    * CURL resource link
    * 
    * @var resource
    */
    protected $resource;

    /**
    * Constructor
    * 
    * @param String $host
    * @return MyCurl
    */
    public function __construct($url = 'localhost'){
        $this->resource = curl_init();
        $this->setUrl($url);
        $this->setOptions(array(
//          CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_AUTOREFERER => TRUE,
            CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_REFERER => 'http://www.google.com/',
            CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)',
            CURLOPT_SSL_VERIFYHOST => FALSE,
            CURLOPT_SSL_VERIFYPEER => FALSE,
        ));
    }

    /**
    * Set URL for the next request
    * 
    * @param String $url
    */
    public function setUrl($url = 'localhost') {
        $this->setOption(CURLOPT_URL, $url);
    }

    /**
    * Sets option to the CURL resource.
    * See http://www.php.net/manual/en/function.curl-setopt.php for option description
    * 
    * @param int $name Option identifier
    * @param mixed $value Option value
    * @return Crawler_Curl Returns itself for sugar-code
    */
    public function & setOption($name, $value){
        curl_setopt($this->resource, $name, $value);
        return $this;
    }

    /**
    * Sets multiple CURL options at once
    * 
    * @param array $options Associative array of options
    * @return Crawler_Curl Returns itself for sugar-code
    */
    public function & setOptions($options){
        curl_setopt_array($this->resource, $options);
        return $this;
    }

    /**
    * Set User-Agent header of the browser
    * 
    * @param String $useragent Defaults to Mozilla browser
    */
    public function setUserAgent($useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0') {
        $this->setOption(CURLOPT_USERAGENT, $useragent);
    }

    /**
    * Get curl request info
    * 
    * @array
    */
    public function info() {
        return curl_getinfo($this->resource);
    }

    /**
    * Return sent headers if CURLINFO_HEADER_OUT option was enabled
    * 
    * @return String Headers
    */
    public function headersSent() {
        return curl_getinfo($this->resource, CURLINFO_HEADER_OUT);
    }

    /**
    * Executes CURL request
    *
    * @return mixed Returns CURL execution result
    */
    public function execute(){
        return curl_exec($this->resource);
    }

    /**
    * Cleans CURL connection
    */
    function __destruct(){
        curl_close($this->resource);
    }

}

$curl = new MyCurl($url);
$curl->execute();
于 2013-07-30T15:07:14.343 回答