精华内容
下载资源
问答
  • 获取cookies 静态页面
    2021-06-11 13:53:11

    利用cookie可以获取用的哪些资料?

    Cookie就是服务器暂存放在你电脑里的资料,好让服务器辨认计算机,当浏览网站的时候,web服务器会先送一个小资料放在你的计算机上,Cookie会帮你在网站上所打的文字或是一些选择都纪录下来,当下次再访问同一个网站。

    php获取cookie后怎么使用

    fc7652a510857086be3f5497b40e2f33.png

    php获取cookie使用方法: cookie和session都可以暂时保存在多个页面中使用的变量,但是它们有本质的差别。cookie存放在客户端浏览器中,session保存在服务器上。它们之间的联系是session ID一般保存在cookie中。 cookie工作原理 当客户访问某个

    登陆QQ获取cookieS有什么用

    登陆QQ获取cookieS有什么用 15  我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 浏览3 次 可选中1个或多个下面的关键词,搜索相关资料。

    静态页面怎么用js获取cookie

    如何使用js来获取cookie的值

    如何获取cookie给curl中使用

    js中如何获取Cookies的值

    更多相关内容
  • 静态页面由于其稳定性快速性,的确给SE、用户及站长带来了方便。但有时,需要记住用户的信息,如用户留下评论后,下一次再来,就要记住该用户的信息,不必再次输入。 这对用户来说,可以提高他们的归属感,熟悉感。...
  • 爬虫之静态页面抓取

    千次阅读 2021-12-15 19:47:00
    在网络爬虫中,静态网页的数据比较容易获取,因为其所有数据都呈现在网页的HTML代码中 在静态网页抓取中,Python中的Requests库能够容易实现这个需求 通过requests发起Http请求 import requests url=...

    静态网页抓取

    在网络爬虫中,静态网页的数据比较容易获取,因为其所有数据都呈现在网页的HTML代码中

    在静态网页抓取中,Python中的Requests库能够容易实现这个需求

    通过requests发起Http请求

    import requests
    url="http://www.santostang.com/"
    r=requests.get(url)
    print("文本编码:",r.encoding)
    print("响应状态码:",r.status_code)
    print("响应文本内容:",r.text)
    
    文本编码: UTF-8
    响应状态码: 200
    响应文本内容: <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>Santos Tang</title>
    <meta name="description" content="Python网络爬虫:从入门到实践 官方网站及个人博客" />
    <meta name="keywords" content="Python网络爬虫, Python爬虫, Python, 爬虫, 数据科学, 数据挖掘, 数据分析, santostang, Santos Tang, 唐松, Song Tang" />
    <link rel="apple-touch-icon" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/images/icon_32.png">
    <link rel="apple-touch-icon" sizes="152x152" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/images/icon_152.png">
    <link rel="apple-touch-icon" sizes="167x167" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/images/icon_167.png">
    <link rel="apple-touch-icon" sizes="180x180" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/images/icon_180.png">
    <link rel="icon" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/images/icon_32.png" type="image/x-icon">
    <link rel="stylesheet" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/css/fontawesome.min.css">
    <link rel="stylesheet" href="http://www.santostang.com/wp-content/themes/SongStyle-Two/style.css">
    <link rel="pingback" href="http://www.santostang.com/xmlrpc.php" />
    <style type="text/css">
    a{color:#1e73be}
    a:hover{color:#2980b9!important}
    #header{background-color:#1e73be}
    .widget .widget-title::after{background-color:#1e73be}
    .uptop{border-left-color:#1e73be}
    #titleBar .toggle:before{background:#1e73be}
    </style>
    </head>
    
    <body>
    <header id="header">
        <div class="avatar"><a href="http://www.santostang.com" title="Santos Tang"><img src="http://www.santostang.com/wp-content/uploads/2019/06/me.jpg" alt="Santos Tang" class="img-circle" width="50%"></a></div>
        <h1 id="name">Santos Tang</h1>
        <div class="sns">
                    <a href="https://weibo.com/santostang" target="_blank" rel="nofollow" data-toggle="tooltip" data-placement="top" title="Weibo"><i class="fab fa-weibo"></i></a>        <a href="https://www.linkedin.com/in/santostang" target="_blank" rel="nofollow" data-toggle="tooltip" data-placement="top" title="Linkedin"><i class="fab fa-linkedin"></i></a>        <a href="https://www.zhihu.com/people/santostang" target="_blank" rel="nofollow" data-toggle="tooltip" data-placement="top" title="Zhihu"><i class="fab fa-zhihu"></i></a>        <a href="https://github.com/santostang" target="_blank" rel="nofollow" data-toggle="tooltip" data-placement="top" title="GitHub"><i class="fab fa-github-alt"></i></a>    </div>
        <div class="nav">
            <ul><li><a href="http://www.santostang.com/">首页</a></li>
    <li><a href="http://www.santostang.com/aboutme/">关于我</a></li>
    <li><a href="http://www.santostang.com/python%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%e4%bb%a3%e7%a0%81/">爬虫书代码</a></li>
    <li><a href="http://www.santostang.com/%e5%8a%a0%e6%88%91%e5%be%ae%e4%bf%a1/">加我微信</a></li>
    <li><a href="https://santostang.github.io/">EnglishSite</a></li>
    </ul>    </div>
            <div class="weixin">
            <img src="http://www.santostang.com/wp-content/uploads/2019/06/qrcode_for_gh_370f70791e19_258.jpg" alt="微信公众号" width="50%">
            <p>微信公众号</p>
        </div>
        </header>
    <div id="main">
        <div class="row box">
            <div class="col-md-8">
                                    <h2 class="uptop"><i class="fas fa-arrow-circle-up"></i> <a href="http://www.santostang.com/2018/07/11/%e3%80%8a%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%ef%bc%9a%e4%bb%8e%e5%85%a5%e9%97%a8%e5%88%b0%e5%ae%9e%e8%b7%b5%e3%80%8b%e4%b8%80%e4%b9%a6%e5%8b%98%e8%af%af/" target="_blank">《网络爬虫:从入门到实践》一书勘误</a></h2>
                                                    <article class="article-list-1 clearfix">
                    <header class="clearfix">
                        <h1 class="post-title"><a href="http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/">第四章 &#8211; 4.3 通过selenium 模拟浏览器抓取</a></h1>
                        <div class="post-meta">
                            <span class="meta-span"><i class="far fa-calendar-alt"></i> 07月15日</span>
                            <span class="meta-span"><i class="far fa-folder"></i> <a href="http://www.santostang.com/category/python-%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="category tag">Python 网络爬虫</a></span>
                            <span class="meta-span"><i class="fas fa-comments"></i> <a href="http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/#respond">没有评论</a></span>
                            <span class="meta-span hidden-xs"><i class="fas fa-tags"></i> </span>
                        </div>
                    </header>
                    <div class="post-content clearfix">
                        <p>4.3 通过selenium 模拟浏览器抓取
    
    在上述的例子中,使用Chrome“检查”功能找到源地址还十分容易。但是有一些网站非常复杂,例如前面的天猫产品评论,使用“检查”功能很难找到调用的网页地址。除此之外,有一些数据...</p>
                    </div>
                </article>
                                                    <article class="article-list-1 clearfix">
                    <header class="clearfix">
                        <h1 class="post-title"><a href="http://www.santostang.com/2018/07/14/4-2-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80%e6%8a%93%e5%8f%96/">第四章 &#8211; 4.2 解析真实地址抓取</a></h1>
                        <div class="post-meta">
                            <span class="meta-span"><i class="far fa-calendar-alt"></i> 07月14日</span>
                            <span class="meta-span"><i class="far fa-folder"></i> <a href="http://www.santostang.com/category/python-%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="category tag">Python 网络爬虫</a></span>
                            <span class="meta-span"><i class="fas fa-comments"></i> <a href="http://www.santostang.com/2018/07/14/4-2-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80%e6%8a%93%e5%8f%96/#respond">没有评论</a></span>
                            <span class="meta-span hidden-xs"><i class="fas fa-tags"></i> <a href="http://www.santostang.com/tag/ajax/" rel="tag">ajax</a>,<a href="http://www.santostang.com/tag/python/" rel="tag">python</a>,<a href="http://www.santostang.com/tag/%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="tag">网络爬虫</a>,<a href="http://www.santostang.com/tag/%e7%bd%91%e9%a1%b5%e7%88%ac%e8%99%ab/" rel="tag">网页爬虫</a>,<a href="http://www.santostang.com/tag/%e8%a7%a3%e6%9e%90%e5%9c%b0%e5%9d%80/" rel="tag">解析地址</a></span>
                        </div>
                    </header>
                    <div class="post-content clearfix">
                        <p>由于网易云跟帖停止服务,现在已经在此处中更新了新写的第四章。请参照文章:
    4.2 解析真实地址抓取
    虽然数据并没有出现在网页源代码中,我们也可以找到数据的真实地址,请求这个真实地址也可以获得想要的数据。...</p>
                    </div>
                </article>
                                                    <article class="article-list-1 clearfix">
                    <header class="clearfix">
                        <h1 class="post-title"><a href="http://www.santostang.com/2018/07/14/%e7%ac%ac%e5%9b%9b%e7%ab%a0%ef%bc%9a%e5%8a%a8%e6%80%81%e7%bd%91%e9%a1%b5%e6%8a%93%e5%8f%96-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80-selenium/">第四章- 动态网页抓取 (解析真实地址 + selenium)</a></h1>
                        <div class="post-meta">
                            <span class="meta-span"><i class="far fa-calendar-alt"></i> 07月14日</span>
                            <span class="meta-span"><i class="far fa-folder"></i> <a href="http://www.santostang.com/category/python-%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="category tag">Python 网络爬虫</a></span>
                            <span class="meta-span"><i class="fas fa-comments"></i> <a href="http://www.santostang.com/2018/07/14/%e7%ac%ac%e5%9b%9b%e7%ab%a0%ef%bc%9a%e5%8a%a8%e6%80%81%e7%bd%91%e9%a1%b5%e6%8a%93%e5%8f%96-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80-selenium/#respond">没有评论</a></span>
                            <span class="meta-span hidden-xs"><i class="fas fa-tags"></i> <a href="http://www.santostang.com/tag/ajax/" rel="tag">ajax</a>,<a href="http://www.santostang.com/tag/javascript/" rel="tag">javascript</a>,<a href="http://www.santostang.com/tag/python/" rel="tag">python</a>,<a href="http://www.santostang.com/tag/selenium/" rel="tag">selenium</a>,<a href="http://www.santostang.com/tag/%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="tag">网络爬虫</a></span>
                        </div>
                    </header>
                    <div class="post-content clearfix">
                        <p>由于网易云跟帖停止服务,现在已经在此处中更新了新写的第四章。请参照文章:
    前面爬取的网页均为静态网页,这样的网页在浏览器中展示的内容都在HTML源代码中。但是,由于主流网站都使用JavaScript展现网页内容,...</p>
                    </div>
                </article>
                                                    <article class="article-list-1 clearfix">
                    <header class="clearfix">
                        <h1 class="post-title"><a href="http://www.santostang.com/2018/07/04/hello-world/">Hello world!</a></h1>
                        <div class="post-meta">
                            <span class="meta-span"><i class="far fa-calendar-alt"></i> 07月04日</span>
                            <span class="meta-span"><i class="far fa-folder"></i> <a href="http://www.santostang.com/category/python-%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" rel="category tag">Python 网络爬虫</a></span>
                            <span class="meta-span"><i class="fas fa-comments"></i> <a href="http://www.santostang.com/2018/07/04/hello-world/#comments">1条评论</a></span>
                            <span class="meta-span hidden-xs"><i class="fas fa-tags"></i> </span>
                        </div>
                    </header>
                    <div class="post-content clearfix">
                        <p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
    各位读者,由于网易云跟帖在本书出版后已经停止服务,书中的第四章已经无法使用。所以我将本书的评论系统换成了来必力...</p>
                    </div>
                </article>
                                        <nav style="float:right">
                                </nav>
            </div>
            <div class="col-md-4 hidden-xs hidden-sm">
                <aside class="widget clearfix">
        <form id="searchform" action="http://www.santostang.com">
            <div class="input-group">
                <input type="search" class="form-control" placeholder="搜索…" value="" name="s">
                <span class="input-group-btn"><button class="btn btn-default" type="submit"><i class="fas fa-search"></i></button></span>
            </div>
        </form>
    </aside>
    <aside class="widget clearfix">
        <h4 class="widget-title">文章分类</h4>
        <ul class="widget-cat">
            	<li class="cat-item cat-item-2"><a href="http://www.santostang.com/category/python-%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" >Python 网络爬虫</a> (5)
    </li>
        </ul>
    </aside>
    <aside class="widget clearfix">
        <h4 class="widget-title">热门文章</h4>
        <ul class="widget-hot">
                </ul>
    </aside>
    <aside class="widget clearfix">
        <h4 class="widget-title">随机推荐</h4>
        <ul class="widget-hot">
                <li><a href="http://www.santostang.com/2018/07/04/hello-world/" title="Hello world!">Hello world!</a></li>
                <li><a href="http://www.santostang.com/2018/07/11/%e3%80%8a%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%ef%bc%9a%e4%bb%8e%e5%85%a5%e9%97%a8%e5%88%b0%e5%ae%9e%e8%b7%b5%e3%80%8b%e4%b8%80%e4%b9%a6%e5%8b%98%e8%af%af/" title="《网络爬虫:从入门到实践》一书勘误">《网络爬虫:从入门到实践》一书勘误</a></li>
                <li><a href="http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/" title="第四章 &#8211; 4.3 通过selenium 模拟浏览器抓取">第四章 &#8211; 4.3 通过selenium 模拟浏览器抓取</a></li>
                <li><a href="http://www.santostang.com/2018/07/14/%e7%ac%ac%e5%9b%9b%e7%ab%a0%ef%bc%9a%e5%8a%a8%e6%80%81%e7%bd%91%e9%a1%b5%e6%8a%93%e5%8f%96-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80-selenium/" title="第四章- 动态网页抓取 (解析真实地址 + selenium)">第四章- 动态网页抓取 (解析真实地址 + selenium)</a></li>
                <li><a href="http://www.santostang.com/2018/07/14/4-2-%e8%a7%a3%e6%9e%90%e7%9c%9f%e5%ae%9e%e5%9c%b0%e5%9d%80%e6%8a%93%e5%8f%96/" title="第四章 &#8211; 4.2 解析真实地址抓取">第四章 &#8211; 4.2 解析真实地址抓取</a></li>
            </ul>
    </aside>
    <aside class="widget clearfix">
        <h4 class="widget-title">标签云</h4>
        <div class="widget-tags">
            <a href="http://www.santostang.com/tag/ajax/" class="tag-cloud-link tag-link-3 tag-link-position-1" style="color:#66807;font-size: 22pt;" aria-label="ajax (2个项目);">ajax</a>
    <a href="http://www.santostang.com/tag/javascript/" class="tag-cloud-link tag-link-4 tag-link-position-2" style="color:#f508f0;font-size: 8pt;" aria-label="javascript (1个项目);">javascript</a>
    <a href="http://www.santostang.com/tag/python/" class="tag-cloud-link tag-link-5 tag-link-position-3" style="color:#cd09c1;font-size: 22pt;" aria-label="python (2个项目);">python</a>
    <a href="http://www.santostang.com/tag/selenium/" class="tag-cloud-link tag-link-6 tag-link-position-4" style="color:#39f9b0;font-size: 8pt;" aria-label="selenium (1个项目);">selenium</a>
    <a href="http://www.santostang.com/tag/%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab/" class="tag-cloud-link tag-link-8 tag-link-position-5" style="color:#eca091;font-size: 22pt;" aria-label="网络爬虫 (2个项目);">网络爬虫</a>
    <a href="http://www.santostang.com/tag/%e7%bd%91%e9%a1%b5%e7%88%ac%e8%99%ab/" class="tag-cloud-link tag-link-9 tag-link-position-6" style="color:#369ed1;font-size: 8pt;" aria-label="网页爬虫 (1个项目);">网页爬虫</a>
    <a href="http://www.santostang.com/tag/%e8%a7%a3%e6%9e%90%e5%9c%b0%e5%9d%80/" class="tag-cloud-link tag-link-10 tag-link-position-7" style="color:#c781f8;font-size: 8pt;" aria-label="解析地址 (1个项目);">解析地址</a>    </div>
    </aside>
    <aside class="widget clearfix">
        <h4 class="widget-title">友情链接</h4>
        <ul class="widget-links">
                </ul>
    </aside>
            </div>
        </div>
    </div>
    <div class="footer_search visible-xs visible-sm">
        <form id="searchform" action="http://www.santostang.com">
            <div class="input-group">
                <input type="search" class="form-control" placeholder="搜索…" value="" name="s">
                <span class="input-group-btn"><button class="btn btn-default" type="submit"><i class="fas fa-search"></i></button></span>
            </div>
        </form>
    </div>
    <footer id="footer">
        <div class="copyright">
            <p><i class="far fa-copyright"></i> 2019 <b>唐松-数据科学 版权所有</b></p>
            <p>Powered by <b>WordPress</b>. Theme by <a href="https://tangjie.me/jiestyle-two" data-toggle="tooltip" data-placement="top" title="WordPress 主题模板" target="_blank"><b>JieStyle Two</b></a> | <a href="http://beian.miit.gov.cn" data-toggle="tooltip" data-placement="top" target="_blank"><b>粤ICP备19068356号</b></a> </p> </p>
        </div>
        <div style="display:none;">代码在页面底部,统计标识不会显示,但不影响统计效果</div>
    </footer>
    <script type="text/javascript" src="http://www.santostang.com/wp-content/themes/SongStyle-Two/js/jquery.min.js"></script>
    <script type="text/javascript" src="http://www.santostang.com/wp-content/themes/SongStyle-Two/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="http://www.santostang.com/wp-content/themes/SongStyle-Two/js/skel.min.js"></script>
    <script type="text/javascript" src="http://www.santostang.com/wp-content/themes/SongStyle-Two/js/util.min.js"></script>
    <script type="text/javascript" src="http://www.santostang.com/wp-content/themes/SongStyle-Two/js/nav.js"></script>
    <script type='text/javascript' src='http://www.santostang.com/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script>
    <script type='text/javascript' src='http://www.santostang.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
    <script type='text/javascript' src='http://www.santostang.com/wp-content/plugins/captcha-bank/assets/global/plugins/custom/js/front-end-script.js?ver=4.8.17'></script>
    <script>
    $(function() {
        $('[data-toggle="tooltip"]').tooltip()
    });
    </script>
    <script>
    (function(){
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
    </script>
    <script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?752e310cec7906ba7afeb24cd7114c48";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
    </script>
    </body>
    </html>
    

    使用说明

    • r.text:服务器响应的内容,会根据响应头部的字符编码进行解码
    • r.encoding:服务器内容使用的文本编码
    • r.status_code:响应状态码
      • 200:请求成功
      • 4xx:客户端错误
      • 5xx:服务器错误响应
    • r.content:字节方式的响应
    • r.json():Requests内置的JSON解码器
    
    

    requests的用法

    1.URL参数

    有时我们为了请求特定的数据,需要直接在URL中加入一些数据,并且这些数据为在一个问号后面

    如点击百度中的某条新闻,其链接为https://baijiahao.baidu.com/s?id=1719021671421019613&wfr=spider&for=pc,其URL中的?后面会跟着一些属性值

    #示例,访问http://httpbin.org/get?key1=value1&&key2=value2
    import requests
    URL="http://httpbin.org/get"
    key_dict={"key1":"value1","key2":"value2"}
    r=requests.get(URL,params=key_dict)
    print("已经编码的URL:",r.url)
    print("响应文本内容:",r.text)
    
    已经编码的URL: http://httpbin.org/get?key1=value1&key2=value2
    响应文本内容: {
      "args": {
        "key1": "value1", 
        "key2": "value2"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.25.1", 
        "X-Amzn-Trace-Id": "Root=1-61b9c935-6c8a0f6c164028ad049e22f7"
      }, 
      "origin": "115.156.142.199", 
      "url": "http://httpbin.org/get?key1=value1&key2=value2"
    }
    
    2.定制请求头部

    请求头部Headers提供了关于请求,响应或其他发送实体的信息

    如何查看请求头:

    1. 浏览器点击检查

    2. 查看Network

    3. 查看Headers
      在这里插入图片描述

    4. 一般只需添加浏览器信息即可

      • 即user-agent
    import requests
    URL="http://www.santostang.com/"
    headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
    r=requests.get(URL,headers=headers)
    print("响应状态:",r.status_code)
    
    响应状态: 200
    
    3.发送Post请求

    有时访问网站需要提交一些表单形式的数据,这是需要发送POST请求

    如果要发送POST请求,只需简单传递一个字典数据给Requests中data参数

    #示例
    import requests
    URL="http://httpbin.org/post"
    key_dict={"key1":"value1","key2":"value2"}
    r=requests.post(URL,data=key_dict)
    print("已经编码的URL:",r.url)
    print("响应文本内容:",r.text)
    
    已经编码的URL: http://httpbin.org/post
    响应文本内容: {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "key1": "value1", 
        "key2": "value2"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Content-Length": "23", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.25.1", 
        "X-Amzn-Trace-Id": "Root=1-61b9cd28-16dce6c31b3e09c45cf7ef91"
      }, 
      "json": null, 
      "origin": "115.156.142.199", 
      "url": "http://httpbin.org/post"
    }
    
    4.超时处理

    有时爬虫会遇到服务器长时间没有响应,这时候会造成爬虫程序一直等待

    这是可以通过Requests中的timeout参数设置定时器,如果定时器触发后没有响应,就会返回异常

    import requests
    URL="http://www.santostang.com/"
    r=requests.get(URL,timeout=0.001)
    
    ---------------------------------------------------------------------------
    
    timeout                                   Traceback (most recent call last)
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connection.py in _new_conn(self)
        168         try:
    --> 169             conn = connection.create_connection(
        170                 (self._dns_host, self.port), self.timeout, **extra_kw
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\util\connection.py in create_connection(address, timeout, source_address, socket_options)
         95     if err is not None:
    ---> 96         raise err
         97 
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\util\connection.py in create_connection(address, timeout, source_address, socket_options)
         85                 sock.bind(source_address)
    ---> 86             sock.connect(sa)
         87             return sock
    
    
    timeout: timed out
    
    
    During handling of the above exception, another exception occurred:
    
    
    ConnectTimeoutError                       Traceback (most recent call last)
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
        698             # Make the request on the httplib connection object.
    --> 699             httplib_response = self._make_request(
        700                 conn,
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
        393             else:
    --> 394                 conn.request(method, url, **httplib_request_kw)
        395 
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connection.py in request(self, method, url, body, headers)
        233             headers["User-Agent"] = _get_default_user_agent()
    --> 234         super(HTTPConnection, self).request(method, url, body=body, headers=headers)
        235 
    
    
    D:\ProgramData\Anaconda\lib\http\client.py in request(self, method, url, body, headers, encode_chunked)
       1254         """Send a complete request to the server."""
    -> 1255         self._send_request(method, url, body, headers, encode_chunked)
       1256 
    
    
    D:\ProgramData\Anaconda\lib\http\client.py in _send_request(self, method, url, body, headers, encode_chunked)
       1300             body = _encode(body, 'body')
    -> 1301         self.endheaders(body, encode_chunked=encode_chunked)
       1302 
    
    
    D:\ProgramData\Anaconda\lib\http\client.py in endheaders(self, message_body, encode_chunked)
       1249             raise CannotSendHeader()
    -> 1250         self._send_output(message_body, encode_chunked=encode_chunked)
       1251 
    
    
    D:\ProgramData\Anaconda\lib\http\client.py in _send_output(self, message_body, encode_chunked)
       1009         del self._buffer[:]
    -> 1010         self.send(msg)
       1011 
    
    
    D:\ProgramData\Anaconda\lib\http\client.py in send(self, data)
        949             if self.auto_open:
    --> 950                 self.connect()
        951             else:
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connection.py in connect(self)
        199     def connect(self):
    --> 200         conn = self._new_conn()
        201         self._prepare_conn(conn)
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connection.py in _new_conn(self)
        173         except SocketTimeout:
    --> 174             raise ConnectTimeoutError(
        175                 self,
    
    
    ConnectTimeoutError: (<urllib3.connection.HTTPConnection object at 0x000002190B8302E0>, 'Connection to www.santostang.com timed out. (connect timeout=0.001)')
    
    
    During handling of the above exception, another exception occurred:
    
    
    MaxRetryError                             Traceback (most recent call last)
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
        438             if not chunked:
    --> 439                 resp = conn.urlopen(
        440                     method=request.method,
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
        754 
    --> 755             retries = retries.increment(
        756                 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
    
    
    D:\ProgramData\Anaconda\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
        573         if new_retry.is_exhausted():
    --> 574             raise MaxRetryError(_pool, url, error or ResponseError(cause))
        575 
    
    
    MaxRetryError: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000002190B8302E0>, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
    
    
    During handling of the above exception, another exception occurred:
    
    
    ConnectTimeout                            Traceback (most recent call last)
    
    <ipython-input-15-c236f0bf58c5> in <module>
          1 import requests
          2 URL="http://www.santostang.com/"
    ----> 3 r=requests.get(URL,timeout=0.001)
    
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\api.py in get(url, params, **kwargs)
         74 
         75     kwargs.setdefault('allow_redirects', True)
    ---> 76     return request('get', url, params=params, **kwargs)
         77 
         78 
    
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\api.py in request(method, url, **kwargs)
         59     # cases, and look like a memory leak in others.
         60     with sessions.Session() as session:
    ---> 61         return session.request(method=method, url=url, **kwargs)
         62 
         63 
    
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
        540         }
        541         send_kwargs.update(settings)
    --> 542         resp = self.send(prep, **send_kwargs)
        543 
        544         return resp
    
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\sessions.py in send(self, request, **kwargs)
        653 
        654         # Send the request
    --> 655         r = adapter.send(request, **kwargs)
        656 
        657         # Total elapsed time of the request (approximately)
    
    
    D:\ProgramData\Anaconda\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
        502                 # TODO: Remove this in 3.0.0: see #2811
        503                 if not isinstance(e.reason, NewConnectionError):
    --> 504                     raise ConnectTimeout(e, request=request)
        505 
        506             if isinstance(e.reason, ResponseError):
    
    
    ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000002190B8302E0>, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
    
    
    

    实践爬取豆瓣Top250页面

    我们观察发现,网站一页最多显示25部电影,且其每个页面的url为:https://movie.douban.com/top250?start=value

    其中value为0,25,50,…

    import requests
    url="https://movie.douban.com/top250?"
    key_dict={"start":0}
    headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
    for i in range(10):
        key_dict["start"]=25*i
        r=requests.get(url,params=key_dict,headers=headers)
        path=str(i)+".txt"
        print(r.status_code)
        fp=open(path,"w",encoding="utf-8")
        fp.write(r.text)
        fp.close()
    
    200
    200
    200
    403
    200
    200
    200
    200
    200
    403
    

    页面内容:
    在这里插入图片描述

    #将电影名提取出来并保存为txt
    from bs4 import BeautifulSoup
    url="https://movie.douban.com/top250?"
    key_dict={"start":0}
    headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
    movie_list=[]
    for i in range(10):
        key_dict["start"]=25*i
        r=requests.get(url,params=key_dict,headers=headers)
        print(r.status_code)
        soup=BeautifulSoup(r.text,"lxml")
        content=soup.find_all("div",class_="hd")
        for each in content:
            movie=each.a.span.text.strip()
            movie_list.append(movie)
    print(movie_list)
    
    200
    200
    200
    200
    200
    200
    200
    200
    200
    200
    ['肖申克的救赎', '霸王别姬', '阿甘正传', '这个杀手不太冷', '泰坦尼克号', '美丽人生', '千与千寻', '辛德勒的名单', '盗梦空间', '忠犬八公的故事', '星际穿越', '楚门的世界', '海上钢琴师', '三傻大闹宝莱坞', '机器人总动员', '放牛班的春天', '无间道', '疯狂动物城', '大话西游之大圣娶亲', '熔炉', '教父', '当幸福来敲门', '控方证人', '龙猫', '怦然心动', '触不可及', '末代皇帝', '蝙蝠侠:黑暗骑士', '寻梦环游记', '活着', '指环王3:王者无敌', '哈利·波特与魔法石', '乱世佳人', '素媛', '飞屋环游记', '摔跤吧!爸爸', '何以为家', '哈尔的移动城堡', '十二怒汉', '我不是药神', '少年派的奇幻漂流', '鬼子来了', '大话西游之月光宝盒', '天空之城', '天堂电影院', '猫鼠游戏', '闻香识女人', '指环王2:双塔奇兵', '罗马假日', '钢琴家', '让子弹飞', '指环王1:护戒使者', '辩护人', '大闹天宫', '教父2', '黑客帝国', '狮子王', '死亡诗社', '海蒂和爷爷', '搏击俱乐部', '绿皮书', '饮食男女', '美丽心灵', '窃听风暴', '本杰明·巴顿奇事', '情书', '两杆大烟枪', '穿条纹睡衣的男孩', '西西里的美丽传说', '看不见的客人', '飞越疯人院', '拯救大兵瑞恩', '音乐之声', '小鞋子', '阿凡达', '海豚湾', '致命魔术', '沉默的羔羊', '哈利·波特与死亡圣器(下)', '美国往事', '禁闭岛', '蝴蝶效应', '布达佩斯大饭店', '心灵捕手', '低俗小说', '春光乍泄', '摩登时代', '七宗罪', '喜剧之王', '致命ID', '被嫌弃的松子的一生', '杀人回忆', '加勒比海盗', '红辣椒', '狩猎', '剪刀手爱德华', '请以你的名字呼唤我', '勇敢的心', '7号房的礼物', '功夫', '超脱', '断背山', '哈利·波特与阿兹卡班的囚徒', '天使爱美丽', '入殓师', '唐伯虎点秋香', '第六感', '幽灵公主', '重庆森林', '小森林 夏秋篇', '阳光灿烂的日子', '爱在黎明破晓前', '一一', '蝙蝠侠:黑暗骑士崛起', '菊次郎的夏天', '哈利·波特与密室', '消失的爱人', '超能陆战队', '无人知晓', '小森林 冬春篇', '完美的世界', '倩女幽魂', '爱在日落黄昏时', '侧耳倾听', '借东西的小人阿莉埃蒂', '甜蜜蜜', '萤火之森', '驯龙高手', '幸福终点站', '玛丽和马克思', '时空恋旅人', '大鱼', '怪兽电力公司', '告白', '阳光姐妹淘', '射雕英雄传之东成西就', '神偷奶爸', '傲慢与偏见', '教父3', '玩具总动员3', '釜山行', '恐怖直播', '一个叫欧维的男人决定去死', '哪吒闹海', '被解救的姜戈', '血战钢锯岭', '未麻的部屋', '头号玩家', '我是山姆', '寄生虫', '七武士', '喜宴', '新世界', '电锯惊魂', '哈利·波特与火焰杯', '模仿游戏', '黑客帝国3:矩阵革命', '花样年华', '卢旺达饭店', '上帝之城', '三块广告牌', '风之谷', '疯狂原始人', '你的名字。', '谍影重重3', '英雄本色', '头脑特工队', '达拉斯买家俱乐部', '纵横四海', '心迷宫', '岁月神偷', '记忆碎片', '惊魂记', '忠犬八公物语', '海街日记', '荒蛮故事', '九品芝麻官', '爆裂鼓手', '贫民窟的百万富翁', '真爱至上', '东邪西毒', '绿里奇迹', '小偷家族', '爱在午夜降临前', '无敌破坏王', '黑天鹅', '冰川时代', '你看起来好像很好吃', '疯狂的石头', '萤火虫之墓', '色,戒', '雨人', '雨中曲', '恐怖游轮', '恋恋笔记本', '魔女宅急便', '2001太空漫游', '城市之光', '可可西里', '虎口脱险', '人工智能', '二十二', '遗愿清单', '初恋这件小事', '海边的曼彻斯特', '大佛普拉斯', '奇迹男孩', '罗生门', '终结者2:审判日', '牯岭街少年杀人事件', '房间', '无间道2', '源代码', '青蛇', '东京教父', '新龙门客栈', '疯狂的麦克斯4:狂暴之路', '魂断蓝桥', '波西米亚狂想曲', '无耻混蛋', '步履不停', '血钻', '茶馆', '彗星来的那一夜', '千钧一发', '战争之王', '燃情岁月', '黑客帝国2:重装上阵', '谍影重重2', '崖上的波妞', '背靠背,脸对脸', '海洋', '小丑', '阿飞正传', '穿越时空的少女', '谍影重重', '地球上的星星', '香水', '再次出发之纽约遇见你', '完美陌生人', '我爱你', '爱乐之城', '朗读者', '火星救援', '聚焦', '小萝莉的猴神大叔', '驴得水', '浪潮', '猜火车', '千年女优']
    
    展开全文
  • 基于python爬虫————静态页面和动态页面爬取 文章目录基于python爬虫————静态页面和动态页面爬取1. 爬虫的原理2. 用正则表达式匹配获取数据3. 页面源码解析4. 通过requests请求,爬取静态页面4.1 **css选择器...

    基于python爬虫————静态页面和动态页面爬取

    1. 爬虫的原理

    ​ 我们在浏览器里面搜索需要查找的目标,这时浏览器会与服务器之间建立一个通常被称作为会话。我给你一个请求你给我做出一个响应。这样就可以得到我们想要获取的知识。

    ​ 在爬虫中要进行一个伪装,把爬虫伪装一个游览器,防止对ip进行封闭。通常解决办法带上请求头内容,让服务器知道自己是一个浏览器进行访问。

    ​ 爬虫就是根据上面的这一原理,通过url(资源定位符)向服务器发送请求,随后服务器会做出响应。不过这时我们得到的是一个网页源代码。

    百度首页

    在这里插入图片描述

    百度首页源码
    在这里插入图片描述

    爬取打印显示

    在这里插入图片描述

    通过上面的比较我们爬取得到的也就是网页的源代码,我们只需要对页面返回内容做一个筛选,提取我们想要的那部分数据即可,但通常许多网站都有反爬虫机制需要进行预处理。最后把获取到的数据写入到文件或数据库中进行数据的持久化保存。

    步骤:通过url发送请求 ————>等待服务器做出响应——————>得到网页源码————>解析页面————>进行筛选————>数据保存

    在上述步骤中得到网页源代码和解析页面最为重要,这两部分通常也是最难的,其中主要面对网页上的各种反爬机制,有时候你的道德页面源代码未必就是和网页源代码一模一样的,需进行一个对比分析。

    2. 用正则表达式匹配获取数据

    ​ 正则表达式对于爬虫比起其它方法去获取数据来讲是一个非常高效的手段,它只需要通过返回的网页源码字符串,通过在某种特殊的模式下进行模式匹配,就可以找到我们想要的那部分数据。但正则表达式的匹配模式写起来也是有点难度对于初学者来讲做到快速精确匹配。

    ​ 使用正则表达式可以归纳为以下两种:

    1. 在自己写好的模式进行编译,创建模式对象(pattern) ,再通过掉函数并且函数里面只需要传入要匹配的字符串。

    2. 通过re.函数名('匹配模式','需要匹配的字符串')来找到需要的字符

    当同一个匹配模式需要用到多次选择第一种方法,当匹配模式只需要用到一次选择第二种方法。

    正则表达式匹配成功返回的数据类型为字符串,匹配不成功返回None。但我们查看匹配结果时最好进行一个判断是否匹配成功,防止报错。

    常用的匹配函数如下:

    函数名对应功能说明
    match()从前往后进行匹配,只匹配一次。匹配成功返回re.Match对象再通过调用group()查看对应的值
    fullmatch()从前往后进行匹配,只匹配一次并且进行完整匹配
    search()搜索满足匹配模式的字符串,只匹配一次
    findall()搜索满足所有满足匹配模式的字符,返回一个列表,列表里面的每一个元素就是满足匹配模式的字符串

    在爬虫里面通常使用findall进行匹配找到所有满足匹配模式的字符串,通过遍历列表查看数据

    正则表达式的特殊字符含义如下:

    数量限定符

    在这里插入图片描述

    特殊字符

    在这里插入图片描述

    \u4e00-\u9fa5只匹配中文字体

    位置相关字符

    在这里插入图片描述

    常用匹配字符

    在这里插入图片描述

    3. 页面源码解析

    页面展示出来的内容

    在这里插入图片描述

    页面源码

    在这里插入图片描述

    通过两张图片的对比我们可以看出我们看到的和服务器返回给我们的还是有很大的区别的。我们在页面上既可以看见图片和文字还可以看见一些视频,但网页源码里面全都是纯文本,图片和视频在源码中对应的是一个个链接。那就意味着我们获取图片和视频等还需要源代码提供的链接进行访问。

    在爬虫里面对网页源码进行分析是一项非常重要的技能,需要通过不断地探索找出一些共性。最好对css和JS有一定的了解,了解网页展示给我所看到的原理。

    4. 通过requests请求,爬取静态页面

    对于通过requests请求页面得到源代码需要进行一个预处理,常用的预处理通过css选择器和xpath进行筛选出我们想要的内容。

    4.1 css选择器基本语法

    选择器示例示例说明
    .class.intro选择所有的class="intro"的元素
    #id#firstname选择所有id="firstname"的元素
    **选择所有元素
    elemetp选择所有

    元素

    element,elementdiv,p选择所有
    元素和

    元素

    element elementdiv p选择
    元素内的所有

    元素

    在用css选择器定位元素时,当有可以通过id进行定位首选id,id属性对应的值是唯一的,然后再考虑class属性进行地位元素,如果class属性中有多个值值需要选择一个即可。

    4.2 xpath基本语法

    官方帮助文档:

    表达式说明
    nodename选取此结点的所有子节点
    /从当前节点选取子节点
    //从当前节点选取子孙节点
    .选取当前节点
    选取当前节点的父节点
    @选取属性

    在这里插入图片描述

    xpath还可以结合运算符对元素进行定位

    xpath中的谓语(Predicates)
    谓语用来查找某个特定的节点或者包含某个指定的值的节点。
    谓语被嵌在方括号中。

    在这里插入图片描述

    选取未知节点

    在这里插入图片描述

    选择若干路径

    在这里插入图片描述

    有了上面的基础下面通过案例进行具体分析:

    1. 通css选择器方法获取豆瓣前25的电影名

      import requests
      from bs4 import BeautifulSoup as Bs
      
      url = 'https://movie.douban.com/top250'
      # 设置请求头
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
          # 先登录,通过开发者工具控制台获取
          'Cookies': '**************************************************' 
      }
      
      # 建立连接
      resp = requests.get(url=url, headers=headers)
      
      print(resp.status_code)  # 查看是否访问成功,出现200就说明访问成功
      
      if resp.status_code == 200:
          soup = Bs(resp.text, 'lxml')  # 进行预处理
          title_list = soup.select('div.hd > a > span:nth-child(1)')  # 找到标题对应的标签
          for title in title_list:
              print(title.text, end='\t')  # 打印输出电影标题
              
              
      '''
      200
      肖申克的救赎	霸王别姬	阿甘正传	这个杀手不太冷	泰坦尼克号	美丽人生	千与千寻	辛德勒的名单	盗梦空间	忠犬八公的故事	星际穿越	楚门的世界	海上钢琴师	三傻大闹宝莱坞	机器人总动员	放牛班的春天	无间道	疯狂动物城	大话西游之大圣娶亲	熔炉	教父	当幸福来敲门	龙猫	怦然心动	控方证人
      
      '''
      
      
    2. 通xpath选择器方法获取豆瓣前25的电影名

    import requests
    from bs4 import BeautifulSoup as Bs
    from lxml import etree
    
    url = 'https://movie.douban.com/top250'
    # 设置请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
        'Cookies': '**************************************'
    }
    
    # 建立连接
    resp = requests.get(url=url, headers=headers)
    if resp.status_code == 200:
        html = etree.HTML(resp.text)  # 预处理
        title_list = html.xpath('//div[@class= "hd"]/a[@href]/span[1]/text()')
        for title in title_list:
            print(title, end='\t')
           
     '''
     肖申克的救赎	霸王别姬	阿甘正传	这个杀手不太冷	泰坦尼克号	美丽人生	千与千寻	辛德勒的名单	盗梦空间	忠犬八公的故事	星际穿越	楚门的世界	海上钢琴师	三傻大闹宝莱坞	机器人总动员	放牛班的春天	无间道	疯狂动物城	大话西游之大圣娶亲	熔炉	教父	当幸福来敲门	龙猫	怦然心动	控方证人	
     '''
    
    

    在爬取页面数据我们通常选择xpath进行爬取上明显比通过css选择器取定位元素更加灵活。当进行静态页面的爬取都是通过上面的步骤来进行数据的抓取,只是有些要进行登录才能够获取它的网页内容随机应变即可。

    4.3 通过代理进行数据的采集

    当我们对同一个网页进行访问过于平凡,有些网站会进行反爬机制对你的ip进行封闭。这就要求我们必须要不同的ip地址对同一个网站进行多次访问。这时只能通过购买ip让别人替你转发在把结果返回给你。

    通过运营商提供的ip链接获取有效ip

    # -*- coding: UTF-8 -*-
    """
    此代码为代理IP可用性检测模块,可准确筛选出尚未失效IP
    注:
    1.此代码只针对TXT数据格式接口。
    2.尚未失效IP不一定为爬虫可用IP
    3.使用时,请调用check_ip(url),url为TXT数据格式接口地址
    """
    import requests
    import telnetlib
    import re
    from concurrent.futures.thread import ThreadPoolExecutor
    
    # 请求接口,匹配出代理IP,多线程检测
    def check_ip(url):
        real_ip = []
    
        # 检测代理IP是否失效
        def telnet_ip(ip, port):
            try:
                telnetlib.Telnet(ip, port, timeout=1)
                real_ip.append(f'{ip}:{port}')
            except:
                pass
    
        while True:
            try:
                resp = requests.get(url)
                # print(resp.text)
                ip_data = re.findall('(\d+\.\d+\.\d+\.\d+):(\d+)', resp.text)
                with ThreadPoolExecutor(max_workers=16) as pool:
                    for ip, port in ip_data:
                        pool.submit(telnet_ip, ip, port)
                return real_ip
            except:
                pass
    
    

    调用ip进行爬取

    """
    example04-利用代理爬取
    Version:
    Author:
    Date:2021/8/17
    """
    from check_proxies import check_ip
    import requests
    from bs4 import BeautifulSoup
    # ip地址链接,由运营商提供,具有一定的时效性
    URL = 'http://api.66daili.cn/API/GetCommonProxy/?orderid=2291244402101903832&num=20&token=66daili&format=text&line_separator=win&protocol=http&anonymous=elite,anonymous,transparent&area=%E4%B8%AD%E5%9B%BD&proxytype=https&speed=fast#api'
    
    ip_list = check_ip(URL)
    print(ip_list)
    flag = True
    while flag:
        for i in range(len(ip_list)):
            doubna_url = 'https://movie.douban.com/top250'
            headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                                     '(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
                            }
            # 代理ip,会根据要求进行自动选择http或https协议
            proxy = {
                'http': 'http://' + ip_list[i],
                'http': 'https://' + ip_list[i]
            }
            try:
                resp = requests.get(url=doubna_url, headers=headers, proxies=proxy, timeout=1)
                if resp.status_code == 200:
                    print(resp.text)
                    flag = False
                    break
            except:
                print('Erro')
    
    

    5. 通过selenium驱动浏览器,爬取动态页面

    • 对于有些页面是一个动态加载,当在通过requests方法取获取那肯定是不可取的。这是就需要一个动态抓取页面的三方库来支持不断地更新页面加载的抓取。
    • 利用selenium动态获取页面数据效率上比较低
    • 需要用到对应浏览器的驱动谷歌浏览器的驱动下载

    通过selenium获取页面步骤:

    先把驱动放入当前项目下

    from selenium import webdriver
    url = 'https://www.baidu.com/'
    # 创建浏览器对象
    b = webdriver.Chrome(./chromedrivers.exe)
    # 访问页面
    b.get(url)
    # 关闭
    b.quit()
    

    使用selenium登录京东页面

    import getpass
    import time
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    url = 'https://www.jd.com/'
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])  # 忽略警告
    # options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片
    b = webdriver.Chrome(options=options)
    b.get(url) 
    b.find_element_by_id('ttbar-login').click()  
    b.find_element_by_class_name('login-tab-r').click()
    b.find_element_by_id('loginname').send_keys(input('输入账号:'))
    b.find_element_by_id('nloginpwd').send_keys(getpass.getpass('输入密码:'))
    b.find_element_by_id('loginsubmit').click()
    time.sleep(5)
    b.find_element_by_id('key').send_keys('python')
    b.find_element_by_id('key').send_keys(Keys.ENTER)
    max_y = 10000
    y = 0
    while y <= max_y:
        b.execute_script(f'window.scrollTo(0,{y})')
        time.sleep(1)
        y += 1000
    

    selenium里面同时支持css选择器和xpath定位元素的方法,不需要再导入。只需要通过创建的浏览器对象调用相应的函数即可。

    使用selenium实现自动登录注意事项:

    • 对于有些登录页面嵌套在iframe框里需要进行跳转,最后登录成功后在跳转到默认页面
    • 最好设置隐式等待或显示等待

    6. 利用多线程提升爬取效率

    • 对于网络数据的采集是非常耗费计算机资源的。当任务比较多用一个单线程进行来爬程序就会显得很慢,用多个线程来同时完成这些任务就会很大程度上提高效率了。
    • 程序的执行速度主要决定因素还是靠计算机的性能和网速的影响

    使用多线程下载图图片

    """
    example02-
    Version:
    Author:
    Date:2021/8/21
    """
    import time
    import requests
    import json
    from concurrent.futures import ThreadPoolExecutor
    
    
    def download_img(href, num):
        """下载图片"""
        resp = requests.get(url=href)
        with open(f'./img/{num}.jpg', 'wb') as file:
            file.write(resp.content)
    
    def main():
        """程序执行入口"""
        count = 0  # 文件命名
        for i in range(0, 90, 30):
            url = f'https://image.so.com/zjl?ch=wallpaper&sn={i}'
            resp = requests.get(url)
            # resp.json()
            data = json.loads(resp.text)
    
            # 单线程 下载
            # for j in data['list']:
            #     """找到图片地址"""
            #     count += 1
            #     print(j['imgurl'])
            #     download_img(j['imgurl'], count)
    
            # 多线程
            with ThreadPoolExecutor(max_workers=16) as pool:
                for j in data['list']:
                    """找到图片地址"""
                    count += 1
                    pool.submit(download_img, j['imgurl'], count)  # 第一个参数传入函数名,后面参数传入对应的函数的参数
    
    
    if __name__ == '__main__':
        start = time.time()
        main()
        end = time.time()
        print(f'用时:{end - start}')
    
    
    • 当遇到任务量比较大,任务与任务之间相互独立的情况下可以考虑使用多线程来提交任务。

    简单总结

    通过网络数据的采集课程,基本掌握了爬取数据的一些手段。当对于不太常规的网页源代码不太容易获取相应的对策。总的来讲爬虫还是很有趣的能够把前面学到的python基础知识综合的运用起来,还能提高对细节的洞察能力。

    语录

    只要爬虫学得好,坐牢少不了。路漫漫其修远兮,吾将上下而求索!

    展开全文
  • 文章目录Cookie获取方法1:通过request和response对象获取方法2:...通过调用HttpServletRequest和HttpServletRespon对象的getCookies和getSession方法. 获取Cookie: @GetMapping("/getCk") public Cookie[] getCooki

    Cookie

    获取方法1:通过request和response对象

    通过调用HttpServletRequest和HttpServletRespon对象的getCookies.,这是一个比较传统的方法,下面获取Session或者header都可使用这个方法,通过获取请求和响应对象,调用getSession或者getHeader方法来得到具体参数

    获取Cookie:

      @GetMapping("/getCk")
        public Cookie[] getCookie(HttpServletRequest request, HttpServletResponse response){
            Cookie[] cookies=request.getCookies();
            return cookies;
        }
    

    输出:
    在这里插入图片描述

    获取方法2:使用注解(更简单、快速)

    使用注解@CookieValue直接获取Cookie的值:

     @GetMapping("/getCk2")
        @ResponseBody
        public String getCookie(@CookieValue("Idea") String Idea){
            return Idea;
        }
    

    运行结果:

    在这里插入图片描述

    Session

    储存Session:

    调用request请求对象,调用getSession方法,获取session对象,并将参数设为true.
    如果不为空,调用setAttribute方法添加一个session。

    //存取session
        @RequestMapping("/setsession")
        public String setSession(HttpServletRequest request){
       //获取session对象,设置参数为true,表示如果拿不到session对象,那么创建一个session
            HttpSession session=request.getSession(true);
            if(session !=null){
                session.setAttribute("username","Java");
            }
            return "储存session成功!";
        }
    

    读取Session:

    方法1:
    传统方法,获取请求对象进行方法调用。

    //读取session
        @RequestMapping("/getsession")
        public String getSession(HttpServletRequest request){
            String username="暂时为空";
            //获取Session对象,设置参数为false,表示如果拿不到session对象,也不会创建一个新的对象
            HttpSession session =request.getSession(false);
            if(session !=null && session.getAttribute("username")!=null){
                username=(String)session.getAttribute("username");
            }
            return username;
        }
    

    方法2:
    使用注解@SessionAttribute,设置value,required设为false,非必传参数。

     @RequestMapping("/getses2")
        public String getSession2(@SessionAttribute(value ="username",required = false) String username){
            return username;
        }
    

    header

    方法1:
    比较传统的一个方法,通过HttpServletRequest对象,调用getHeader方法,和上面获得Cookie的方法相同。

      @RequestMapping("/gethd")
        @ResponseBody
        public String gethd(HttpServletRequest request,HttpServletResponse response){
            String userAgent=request.getHeader("User-Agent");
            return "读取到的header(userAgent)内容是:"+userAgent;
        }
    

    运行结果:
    在这里插入图片描述

    方法2:
    使用注解@RequestHeader

      @RequestMapping("/getua")
        public String getUserAgent(@RequestHeader("User-Agent") String userAgent){
            return userAgent;
        }
    

    运行结果:
    和上面方法1获得的结果一模一样。
    在这里插入图片描述

    返回请求参数

    默认情况下,无论是Spring MVC还是Spring Boot返回的都是视图,即xxx.html,为了做到前后端分离,后端只给前端返回数据,我们可以使用@ResponseBody注解

    @ResponseBody详解

    @ResponseBody是使用在Controller(控制器层)的方法注解。
    在控制器的方法中,如果不加这个注解,仅仅是给这个方法映射了路由,那么方法会默认返回一个视图,方法的返回值会作为视图名称,自动匹配响应的视图去显式。
    如果加上这个注解会直接将方法的返回值作为内容直接返回给用户并且自适应响应头的content-type,如果是普通的字符串,就是text/html格式,如果返回的字符串符合json,那么content-type就是application/json格式。

    总结
    @ResponseBody注解的作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给前端。

    text/html非视图数据

    @ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据

     @RequestMapping("/gethtmlmess")
        @ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据
        public String method(){
            return "<h3>这是一个HTML类型的信息,h3标题大小<h3>";
        }
    

    使用fiddler抓包,可以看到返回的数据格式是text/html类型
    在这里插入图片描述

    返回静态页面(xxx.html类型)

    在resources路径下创建一个html文件:
    在这里插入图片描述
    在index.html中写入以下代码:

    <html>
    <head>
        <meta charset="utf8">
    </head>
        <body>
        <h3>这是一个HTML类型的静态页面!</h3>
        <form>
            <p></p>
            <p></p>
            <h3>无法在页面上进行操作和互动.</h3>
        </form>
        </body>
    </html>
    

    在控制层,即Controller类中写一个方法,用户在url输入请求后会映射到这方法上,最后返回的就是上面创建的html,在返回一个html类型的静态文件时,需要在名称前加“/”,代码如下:

    package com.example.demo.Controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @RequestMapping("/index")
        public Object deal(){
    
            //do something..
    
            //返回视图:index.html静态页面
            return "/index.html"; //前面需要添加一个"/",否则认定是字符串
        }
    }
    

    在浏览器中访问时运行结果:
    在这里插入图片描述

    返回Json对象

    举例:

    @RequestMapping("/getjson")
        @ResponseBody
        public Object getJson(String name){
            HashMap<String,Object> map=new HashMap<>();
            map.put("name",name);
            map.put("ctime", LocalDateTime.now());
            return map;
        }
    

    输入Url访问结果:
    在这里插入图片描述
    抓包后查看返回请求的content-type,是application/json格式:
    在这里插入图片描述

    请求转发和重定向

    在Spring MVC中,renturn返回时不仅可以返回一个视图,还可以实现跳转。
    跳转请求的方式有两种:转发(forward)和重定向(redirect)。

    请求转发流程:
    在这里插入图片描述

    请求转发(Forward)是服务器内部的一种行为,转发后访问的资源也只能是服务器内部的资源,不能访问外部的资源。
    转发是服务器请求资源,直接访问目标地址的URL,然后把响应内容给读取过来在发送给浏览器,浏览器并不知道响应内容的来源,所以url没有发生改变。就像考试的时候,老师给了你一张卷子,你抄了同桌的答案,但老师不知道你是抄了别人的答案,给你的分数还是不变的。

    代码:
    假设某位b站用户没有登录就想刷视频,会跳转到登录界面,会跳转到登录界面loginxxx.html:

    @Controller
    @RequestMapping("/ret")
    public class TestController {
        @RequestMapping("/add")
        public String forward(){
            System.out.println();
            System.out.println("正在进行请求转发forward操作");
            System.out.println();
            //假设用户没有登录,跳转到login.html登录界面。
            return "forward: login.html";
        }
    }
    

    请求重定向流程(Redirect):
    在这里插入图片描述
    请求重定向(Redirect)是客户端的一种行为,服务器会根据逻辑发送一个状态码,告诉浏览器重新请求地址,所以在浏览器中会显示新的URL.
    重定向从本质上来说是两次request,第一次的时候,用户/客户端request A,服务器响应,然后response结果,告诉浏览器,你应该访问B,此时地址栏中的URL就会发生改变。然后浏览器会开始第二次的请求request B,服务器返回新的response.

    使用:
    return时直接加上redirect:/重定向地址

      @RequestMapping("/add2")
        public String redirect(){
            System.out.println();
            System.out.println("正在进行请求重定向");
            System.out.println();
            return "redirect:/login.html";
        }
    

    Forward(转发)和Redirect(重定向)的区别

    从四个方面考虑区别:

    • 访问地址forward的整个过程是服务器行为,与客户端无关,所以地址栏中的URL没有发生改变。而Redirect是客户端行为,客户端重新请求地址,所以URL是新的URL.
    • 数据共享 :forward过程中,跳转前的页面和跳转后的页面后可以共享一个请求request中的数据,而redirect不能共享数据。
      请求转发的过程中,外部资源可能会丢失(css样式、图片等),访问不到;而在请求重定向的时候不存在外部资源丢失的情况,和直接访问目标地址是的效果相同。
    • 应用的场景 :请求转发一般用于登录跳转,而重定向一般用于跳转到其他网站、注销登录返回原来的页面。
    • 运行效率 :跳转的运行效率高、而重定向的运行效率低。
    展开全文
  • 很多网站、博客把网页生成html静态页面了,以利于搜索引擎的索引排名,减轻服务器负担。静态页面由于其稳定快速更快,给用户及站长带来了方便。但评论后如何记住用户的信息呢
  • 一、背景 很多时候,我们在爬取数据时,有些页面的数据需要登录才能看到,因此需要登录再...1、通过分析登录页面获取登录接口和提交表单进行登录验证(可以用简单的Request库结合cookielib方式或者Scrapy等) ...
  • 存入cookiepublic static void WriteCookie(string strName, string key, string strValue, int expires){HttpCookie cookie = HttpContext.Current.Request.Cookies[strNam...
  • 主要介绍了asp.net不同页面间数据传递的多种方法,包括使用QueryString显式传递、页面对象的属性、cookie、Cache等9种方法
  • 爬虫是快速获取我们需要的数据的一个有效途径,而第一步便是要请求远方服务器为我们返回对应的网页信息。我们知道,正常情况下在浏览器上我们只要输入正确的统一资源定位器url,即网页地址便可轻松打开我们想要看到...
  • 目录   页面复用之包含 自定义404页面 ...加载静态资源   页面复用之包含 1.关键字 {%include '你要包含的页面'%} 2.实例代码 &lt;p&gt;我的劳动果实&lt;/p&gt; {...
  • Java - token的存储与获取

    千次阅读 2022-06-20 19:16:13
    前后端分离的时候,使用JWT的token进行身份验证,token如何存放至关重要,这里为你讲解了token的存放与获取
  • 网站生成静态页面攻略 收藏 <br />生成HTML方法主要步骤只有两个: 一、获取要生成的html文件的内容 二、将获取的html文件内容保存为html文件 我在这里主要说明的只是第一步:如何获取要...
  • 在浏览网页的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且...
  • EasyMall.docx

    2020-08-15 11:58:35
    (1)会话技术 为了实现某一功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到最后访问服务器结束为止,期间产生的多次请求和响应加在一起就是一次会话
  • 已实现:本篇文章主要写一下 静态浏览器标题和动态浏览器标题
  • 目录js获取与设置cookienodejs获取与设置cookie学以致用-实现简易自动登录前端代码nodejs服务端代码 js获取与设置cookie js操作cookie都是对document.cookie进行操作。 获取这里使用的是正则匹配。 设置时document...
  • 爬虫基础之会话和Cookies

    千次阅读 2018-08-17 16:55:20
    在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且...
  • 主要介绍了举例理解Ruby on Rails的页面缓存机制,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
  • 页面返回上一页浏览位置

    千次阅读 2021-02-25 19:34:44
    1.如果上一页是静态页面,可以用history.go(-1)方法;go() 方法可加载历史列表中的某个具体的页面。该参数可以是数字,使用的是要访问的 URL 在 History 的 URL 列表中的相对位置。(-1上一个页面,1前进一个页面)。...
  • Servlet端: Cookie ck = new Cookie("user", "kalision"); ck.setMaxAge(60*60*24*365); response.addCookie(ck); Jsp端: ... Cookie[] cookies = request.getCookies(); if(cookies!=nul
  • C#利用wininet获取网页Cookie

    千次阅读 2018-11-19 15:09:50
    \r\n") + "\r\n 真实cookies(" + realCookie.Count.ToString() + "):\r\n" + realCookie.GetCookieHeader(new Uri(this.txt_url.Text)).Replace(";", ";\r\n"); } 五、测试 在该窗体登录163邮箱并保存账号...
  • 在爬虫中,有时候遇到需要登录才能访问的网页,只需要在登录后获取Cookies ,在下次访问的时候将登录后获取到的 Cookies 放在请求头中,这时,服务端就会认为我们的爬虫是一个正常登录用户。 Session 保持 ...
  • python 提取页面验证码

    千次阅读 2021-12-03 15:22:34
    1.页面的验证码若为静态验证码可以使用截屏的方式获取代码如下 driver.save_screenshot('C:/crawlerScript/tianjing2/picture/fetch_date.png') # 截取整个DOC ce = driver.find_element_by_id("imgcaptcha") # ...
  • 一、获取要生成的html文件的内容 二、将获取的html文件内容...1、这种方法与是在脚本内写要生成的html内容,不太方便预览生成页面的内容,无法可视化布局页面,更改html模板时会更加复杂。用这种方法的人很多,但我感
  • 【Python】爬虫+动态Cookie获取

    千次阅读 2020-12-22 11:38:15
    一、前言背景是帮助朋友爬取一个国家网站发布的肺炎疫情统计信息。二、遇到的问题朋友本来是打算按照最基本的方法进行爬取,代码...这就非常奇怪了,请求的页面看起来也是静态页面,没有跟用户进行交互,用浏览器打...
  • ● Cookie获取语法:   ctx.cookies.get(key, options)   this.ctx.cookies.get(‘name’) ● Cookie清除:   this.ctx.cookies.set(‘name’, null); 3、设置加密Cookie 、获取加密Cookie //设置加密...
  • java设置与获取session

    万次阅读 2018-10-01 07:38:07
    一、Session会话  session对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个...当客户访问服务器是,可能会反复连接这个服务器上的几个页面、反复刷新一个页面或不断地向一个页面提交信息等,服务...
  • 关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等 等。 请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,921
精华内容 8,768
关键字:

获取cookies 静态页面