爬虫到图片链接,但是无法下载图片

网址为http://www.specks-exotica.com...
爬取文字部分毫无障碍,获取的链接也可以在浏览器打开图片,从浏览器也可以下载到图片,但是用urllib.request.Request下载图片就始终失败,但是也不报错。

阅读 6.8k
2 个回答

下载图片失败, 首先你要弄明白怎么失败了.

  1. 首先排查一下返回状态码不对?
  2. 再看一下返回的response body如果不是图片的话是什么?

通过postman直接调用图片链接,返回如下 html

<html><head>
        <meta charset="utf-8">
        <style type="text/css">
            html, body, #partner, iframe {
                height:100%;
                width:100%;
                margin:0;
                padding:0;
                border:0;
                outline:0;
                font-size:100%;
                vertical-align:baseline;
                background:transparent;
            }
            body {
                overflow:hidden;
            }
        </style>
        <meta content="NOW" name="expires">
        <meta content="index, follow, all" name="GOOGLEBOT">
        <meta content="index, follow, all" name="robots">
        <!-- Following Meta-Tag fixes scaling-issues on mobile devices -->
        <meta content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" name="viewport">
    
    </head>
    <body>
        <div id="partner"></div>
        <script type="text/javascript">
            document.write(
                    '<script type="text/javascript" language="JavaScript"'
                            + 'src="//sedoparking.com/frmpark/'
                            + window.location.host + '/'
                            + 'IONOSParkingDE'
                            + '/park.js">'
                    + '<\/script>'
            );
        
            </script><script type="text/javascript" language="JavaScript" src="//sedoparking.com/frmpark/www.specks-exotica.com/IONOSParkingDE/park.js"></script>
        
    </body></html>

可以看到里面有 document.write,生成的 javascript 如下

</script><script type="text/javascript" language="JavaScript" src="//sedoparking.com/frmpark/www.specks-exotica.com/IONOSParkingDE/park.js"></script>

这里回去加载一个 park.js的文件,内容如下

    var google_afd_request = {
        "client": "ca-dp-sedo89_3ph",
        "drid": "as-drid-2244365169148097",
        "domain_name": "www.specks-exotica.com",
        "session_token": "create"
    };
    var setup = {
        domain: 'www.specks-exotica.com',
        registrar: 'IONOSParkingDE',
    };

    function google_afd_ad_request_done(google_afd_response) {

        if (typeof (google_afd_response.session_token) == 'undefined') {
            google_afd_response.session_token = '';
        }

        loadContentFrame(google_afd_response.session_token);
    }

    document.write(
        '<script type="text/javascript" language="JavaScript" ' +
        'src="http://pagead2.googlesyndication.com/apps/domainpark/show_afd_ads.js"><\/script>');

    function loadContentFrame(session_token) {

        var contentFrame = document.createElement('iframe');
        contentFrame.setAttribute('src',
            'http://sedoparking.com/search/registrar.php' +
            '?domain=' + setup.domain +
            '&rpv=2' +
            '&registrar=' + setup.registrar +
            '&gst=' + session_token +
            '&ref=' + document.referrer +
            ''
        );

        contentFrame.setAttribute('name', 'regpark');


        contentFrame.setAttribute('frameBorder', '0');

        var contentContainer = document.getElementById("partner");
        if (typeof (contentContainer) == 'undefined') {
            contentContainer = document.createElement('div');
            contentContainer.setAttribute('id', 'partner');
        }

        contentContainer.appendChild(contentFrame);
    }
    

这个文件的功能:

1、添加 Google 的不知道是广告还是统计功能

2、创建网页的内容,并且添加了 document.referrersession_token 校验

总结:

1、当判断到你不是浏览器访问的时候,对你进行 referrersession_token 等校验,防止爬虫等自动化工具

2、获取图片的时候你需要构造图片链接的 request header,模拟在浏览器中的 request header

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题