suchen

Heim  >  Fragen und Antworten  >  Hauptteil

node.js - 关于抓取网页被禁止的问题

用 Node.js 的 http 来抓取某页面:

var http = require('http');

http.get('http://example.com', function (res) {
  console.log(res.statusCode);
});

返回的状态码是 404,但是网页能够正常访问,我用自己服务器测试也是一样,所以应该没有 ban 掉我的 ip。这是否代表着对方已经通过服务器端禁掉了他人的抓取?
还有就顺带求教,这是如何做到的?

胡乱猜测,求各位大大指点一下,以上。

PHP中文网PHP中文网2777 Tage vor572

Antworte allen(6)Ich werde antworten

  • ringa_lee

    ringa_lee2017-04-17 11:32:38

    检查一下User-AgentReferer,另外再看看Cookie,还有那个网页是不是用Ajax动态生成的。
    你可以用Chrome的“开发者工具”或者Firebug看看浏览器再打开这个网页时都发了哪些东西,然后把这些东西都加到你的请求里去。

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:32:38

    你可以看看 pyspider 爬虫教程(二):AJAX 和 HTTP
    虽然是基于 pyspider 写得,但是原理讲的比较多

    Antwort
    0
  • 阿神

    阿神2017-04-17 11:32:38

    你說的網站,我正常抓取。

    不知是你程序有何錯誤,抓取其它網站如何?

    <?php
    
    $res = get('http://www.1yyg.com/');
    
    echo $res[0];
    echo $res[1];
    
    function get($url, $cookie = '', $referer = '') {
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_REFERER => $referer, 
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2164.0 Safari/537.36',
            CURLOPT_COOKIE => $cookie,
            CURLOPT_HEADER => 1,
            CURLOPT_RETURNTRANSFER => 1, 
            CURLOPT_TIMEOUT => 4
        ]);
    
        $response = curl_exec($ch);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $header_size); //http_parse_headers
        $body = substr($response, $header_size);
    
        curl_close($ch);
        return [$header, $body];
    }
    

    你用我寫的這個試試?反正我這裏成功。

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:32:38

    我猜可能是设置了 Content-Security-Policy

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:32:38

    把浏览器发请求时的所有header都加上,应该可以的。

    Antwort
    0
  • PHPz

    PHPz2017-04-17 11:32:38

    很简单,你的header没有UA,直接被服务器拦截成攻击,加上UA,Referer等就可以抓到了

    Antwort
    0
  • StornierenAntwort