• 美女报时

  • python 小爬虫的各种总结(二)

           要想做网络抓取方面的工作必须对HTTP协议里面的一些基础知识有个大概了解,最好能有些HTML的底子。首先来介绍下HTTP Header。我们在网页上点击一个按钮,或者请求一个网页都会向服务器发送一个请求头,然后服务器会发送一个响应头。这个Header对我们是不可见的,查看Header的方法有:Firefox的firebug、chrome的Inspect Element以及其他的一些抓包工具(比如wireshark(超级强大,但是对新手来说可能不太会用)、httpwatch(可以抓取IE的包))。由于Inspect Element是嵌入到chrome里面的(由于Firefox的启动速度---早已放弃),而且功能足够强大,我一般用它来查看HTTP的Header。在网页空白处右击即可看到Inspect Element 如图一所示:

                   

                            图一

                

                      图二(选择network 并把 Preserve log 勾选上)

                

                                   图三

      我们点击登录按钮就可以看到已经向服务器发送了一个Header Post了一些数据,Header里面的内容大部分一眼就能看懂(不懂的fork this http://en.wikipedia.org/wiki/List_of_HTTP_header_fields),这里主要说下 Referer 和 User-Agent,有些网站会检查这两个参数,以判断是否是恶意抓取,比如说抓取CSDN网站的文章的时候,如果没有发送这两个参数就会被服务器拒绝下载。同时可以看到请求的方法是POST,以及Status Code 是200,表示是正常响应(fork this http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html),我们在写程序的时候可以判断这个Status Code来确定是否是正常访问。

      接着往下翻可以看到我们向服务器POST的一些数据以及服务的响应头;我们查看登录界面的源代码(右键  view source)可以看到登录的界面的form 代码可能比较混乱,可以找一个在线格式化的格式一下,一般的代码编辑工具也行,一般都会带有代码格式化的功能。

                

                          图四

    <form method="post" id="loginForm" class="login-form" action="http://www.renren.com/PLogin.do">
        <dl class="top clearfix">
            <dd>
                <input type="text" name="email" class="input-text" id="email" tabindex="1"
                value="" />
            </dd>
        </dl>
        <dl class="pwd clearfix">
            <dd>
                <input type="password" id="password" name="password" error="请输入密码" class="input-text"
                tabindex="2" autocomplete="off" />
                <label class="pwdtip" id="pwdTip" for="password">
                    请输入密码
                </label>
                <a class="forgetPwd" id="forgetPwd" href="http://safe.renren.com/findPass.do"
                stats="home_findpassword">
                    忘记密码?
                </a>
            </dd>
        </dl>
        <div class="caps-lock-tips" id="capsLockMessage" style="display:none">
        </div>
        <dl class="savepassword clearfix">
            <dt>
                <label title="为了确保您的信息安全,请不要在网吧或者公共机房勾选此项!" for="autoLogin" class="labelCheckbox">
                    <input type="checkbox" name="autoLogin" id="autoLogin" value="true" tabindex="4"
                    />
                    下次自动登录
                </label>
            </dt>
            <dd>
                <span class="getpassword" id="getpassword">
                    <a href="http://safe.renren.com/findPass.do" stats="home_findpassword">
                        忘记密码?
                    </a>
                </span>
            </dd>
        </dl>
        <dl id="code" class="code clearfix">
            <dt>
                <label for="code">
                    验证码:
                </label>
            </dt>
            <dd>
                <input id="icode" type="text" name="icode" class="input-text" tabindex="3"
                autocomplete="off" />
                <label class="codetip" id="codeTip" for="icode">
                    请输入验证码
                </label>
            </dd>
        </dl>
        <dl id="codeimg" class="codeimg clearfix">
            <dt>
            </dt>
            <dd>
                <img id="verifyPic_login" src="http://icode.renren.com/getcode.do?t=web_login&rnd=Math.random()"
                />
            </dd>
            <a class="changeone" href="javascript:refreshCode_login();">
                换一个
            </a>
        </dl>
        <dl class="bottom">
            <input type="hidden" name="origURL" value="http://www.renren.com/home"
            />
            <input type="hidden" name="domain" value="renren.com" />
            <input type="hidden" name="key_id" value="1" />
            <input type="hidden" name="captcha_type" id="captcha_type" value="web_login"
            />
            <input type="submit" id="login" class="input-submit login-btn" stats="loginPage_login_button"
            value="登录" tabindex="5" />
        </dl>
    </form>
    View Code

     通过源代码Form 表单里面的元素与POST给服务器的信息我们就可以知道,email就是我登录的用户名,autologin就是是否自动登录,其他的以此类推,可以看到密码已经是加密过的密码了(好多网站POST的都是明文数据),具体的加密算法不是我们此次讨论的重点(网上有相关的分析文章 自己谷歌)。

      从网页上得到的信息已经足够,接下来就是我们要怎么编程实现了。由于HTTP协议实际上是无状态的,我们只要向服务器发送刚才的一些数据,服务器就以为我们是对应的浏览器,我们的目的就达到了。

     

              

     

    posted @ 2014-12-03 00:27  性定菜根香  阅读(560)  评论(1编辑  收藏  举报