Mta123456 发表于 2023-8-13 10:12:46

网络爬虫出错

先给出下列代码
import requests

def get_url(url):
    headers = {'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}
    res = requests.get(url,headers=headers)
    return res

def main():
    url = "https://baike.baidu.com/item/2022%E5%B9%B4%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A/18420947?fromtitle=%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A&fromid=57094499"#"https://baike.baidu.com/item/%s" % input("请输入要查找的内容:")
    res = get_url(url)
    print(res.text)

if __name__ == "__main__":
    main()



但是运行的时候却出现了一下源码:
<!DOCTYPE html>
<!--STATUS OK-->
<html style="">


<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta name="referrer" content="always" />
<meta name="description" content="百度百科是一部内容开放、自由的网络百科全书,旨在创造一个涵盖所有领域知识,服务所有互联网用户的中文知识性百科全书。在这里你可以参与词条编辑,分享贡献你的知识。">
<title>
百度百科-验证</title>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
<link rel="icon" sizes="any" mask href="//baikebcs.bdimg.com/cms/static/baike-icon.svg">

<meta itemprop="name" content="百度百科-验证">
<meta itemprop="description" content="">
<meta itemprop="image" content="https://bkssl.bdimg.com/cms/static/baike.png">

<!-->
<script>

    (function() {

      var e = "abbr,article,aside,audio,canvas,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video".split(","),

      i = e.length;

      while (i--) {

      document.createElement(e);

      }



      window.console = window.console || {};

      var f = ['log', 'info', 'warning', 'error', 'clear'];

      var l = f.length;

      while(l--) {

      window.console] = function () {};

      }

    })();

</script>
<!-->
<link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-base_633fa99.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-subpage/antiCrawl/antiCrawl_c71146b.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/component/userbar-n/userbar-n_7cd7795.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/lib/larkplayer/larkplayer_83ad94d.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/lib/trumbowyg/plugins/colors/trumbowyg.colors_dd0d230.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/lib/trumbowyg/trumbowyg_2e7ad35.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/lib/watermark/watermark_a0a9ace.css"/><link rel="stylesheet" type="text/css" href="https://bkssl.bdimg.com/static/wiki-common/widget/lib/webuploader/webuploader_08d9db4.css"/>   
</head>
<body class="w-small">


<script src="https://wappass.baidu.com/static/machine/js/api/mkd.js"></script>


<div id="app" class="anti-crawl"></div>
<div class="anti-crawl-mask"></div>


<script>

      if (!window['__abbaidu_2020_subidgetf']) {

      window['__abbaidu_2020_subidgetf'] = function () {

            var subid = 01000000;

            return subid;

      };

      }

    </script>
<script async src="https://dlswbr.baidu.com/heicha/mw/abclite-2020-s.js"></script>

</body><script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/js/mod_1fc3215.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/vender-polyfill_f677fa3.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-jquery_2fd4e6c.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/vender-larkplayer_7eb2e49.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-lib-jsmart_3ff2da8.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/vender-util_ec62906.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/utils-datetime_1bc7409.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/utils-storage_f9507ec.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-ps-link_81d67c5.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-component_579b93e.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-lib_5ba5f53.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/utils-clickstream_5387ccf.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/utils-logger_3b8256e.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-util_008e364.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/node_modules/larkplayer-ui/dist/larkplayer-ui_9e08b02.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-lib-letv_0ef7211.js"></script>
<script type="text/javascript" src="https://bkssl.bdimg.com/static/wiki-common/pkg/wiki-common-ui_f89f6bd.js"></script>
<script type="text/javascript">!function(){    var $ = require('wiki-common:widget/lib/jquery/jquery');
    var Dialog = require('wiki-common:widget/ui/dialog/dialog');
    var ClickstreamSdk = require('wiki-common:widget/util/clickstreamSdk');
    var clickstream = new ClickstreamSdk.default({
      appname: 'baike',
      platform: 'web',
      device: 'pc',
      page: 'spam',
      auto: true
    });
    var sourceUrl = "https:\/\/baike.baidu.com\/item\/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91";
    var fromPage = "baike_pc_lemmapage_riskscore";
    var logParam = {
      page: 'spam',
      fromPage: fromPage
    }
    clickstream.logActEvent($.extend({}, logParam, {'act_type': 'show'}));

    function init() {
      if (window.PassMachine && window.PassMachine.mkd) {
            var PassMkd = window.PassMachine.mkd;
            var instance = new PassMkd({
                type: 'spin',
                id: 'app',
                ak: 'f30f335ff2449b9b92676c6916ed7990',
                spinConfig: {
                  headTitle: '访问异常,请进行验证'
                },
                initApiSuccessFn: function() {
                  instance.initVcode();
                },
                verifySuccessFn: function (data) {
                  $.ajax({
                        type: 'GET',
                        url: '/api/anticrawl/captchaverify',
                        dataType: 'json',
                        data: {
                            ds: data.ds,
                            passTk: data.tk,
                            clientType: 'pc',
                            tk: "2cbec2a13f70ee0dd83e87fff74fec21",
                            sourceFrom: fromPage
                        },
                        success: function(res) {
                            if (res && res.errno === 0 && !res.isSpam) {
                              clickstream.logActEvent($.extend({}, logParam, {'act_type': 'verify-pass'}));
                              var reg = new RegExp(/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\*\+,;=.]+$/);
                              sourceUrl.match(reg) ? window.location.href = sourceUrl : window.history.back();
                            } else {
                              var submitInform = Dialog.inform({
                              icon: 'WARNING',
                              mainMsg: '验证失败,请重新验证'
                              });
                              submitInform.show();
                              setTimeout(function() {
                                    submitInform.hide();
                              }, 3000);
                              document.getElementById('app').childNodes.remove();
                              init();
                            }
                        }
                  });
                }
            });
      }
    };
    init();
}();
!function(){      require('wiki-common:widget/component/psLink/psLink');

      var clickstream = require('wiki-common:packages/utils/logger');

      clickstream.logViewPage({

      page: 'all-pc'

      });

      var tmpBaiduId = '';

      require(['wiki-common:widget/util/setBaikeTmpBaiduId.es'], function (setBaikeTmpBaiduId, cookie) {

      setBaikeTmpBaiduId(tmpBaiduId);

      });

    }();</script></html>
谁能告诉我这是为什么?怎么改正?

isdkz 发表于 2023-8-13 10:13:17

这个问题是因为百度百科的网站对爬虫进行了反爬虫处理,导致你的爬虫无法正常获取到页面内容。为了解决这个问题,你可以尝试以下几种方法:

1. 修改User-Agent:将User-Agent修改为一个常见的浏览器的User-Agent,如下所示:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'}


2. 添加Referer头部:在请求头部中添加Referer字段,指向一个合法的百度百科页面,如下所示:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
         'Referer': 'https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91'}


3. 使用代理IP:通过使用代理IP来隐藏你的真实IP地址,以避免被封禁。你可以使用一些第三方的代理IP服务,或者自己搭建代理池。

4. 使用Selenium模拟浏览器操作:Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。你可以使用Selenium来加载页面并获取内容。

以上是一些常见的解决方法,你可以根据具体情况选择其中的一种或多种尝试。希望能帮到你!

陶远航 发表于 2023-8-13 10:13:56

根据你提供的代码和返回的源码,你的网络爬虫遇到了百度百科的反爬虫机制。百度百科通过验证机制识别爬虫,并返回一个验证页面。为了绕过这个验证页面,你可以尝试以下几种方法:

1. 使用会话(Session)来发送请求:创建一个会话对象,并在会话中发送请求。这样可以保持会话的状态,包括 cookie 和其他会话信息,这有助于绕过验证。

import requests

def get_url(url):
    headers = {
      'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
    }
    session = requests.Session()
    res = session.get(url, headers=headers)
    return res

def main():
    url = "https://baike.baidu.com/item/2022%E5%B9%B4%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A/18420947?fromtitle=%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A&fromid=57094499"
    res = get_url(url)
    print(res.text)

if __name__ == "__main__":
    main()


2. 添加延时:在发送请求之前添加一些延时,模拟人的访问行为。这可以减少触发反爬虫机制的概率。

import requests
import time

def get_url(url):
    headers = {
      'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
    }
    time.sleep(2)# 添加延时
    res = requests.get(url, headers=headers)
    return res

def main():
    url = "https://baike.baidu.com/item/2022%E5%B9%B4%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A/18420947?fromtitle=%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A&fromid=57094499"
    res = get_url(url)
    print(res.text)

if __name__ == "__main__":
    main()


3. 使用代理IP:使用代理IP发送请求,以隐藏真实的请求来源,从而绕过反爬虫机制。你可以使用第三方代理服务或购买付费代理IP。

需要注意的是,爬取网站数据时请确保遵守相关的法律法规和网站的使用条款,以及尊重网站的爬虫策略。使用爬虫时请合理、稳健地进行,避免对被爬取网站造成不必要的负担。
如果问题已经解决,请设置最佳答案

Mta123456 发表于 2023-8-19 14:05:45

陶远航 发表于 2023-8-13 10:13
根据你提供的代码和返回的源码,你的网络爬虫遇到了百度百科的反爬虫机制。百度百科通过验证机制识别爬虫, ...

没有用

Mta123456 发表于 2023-8-19 14:06:42

isdkz 发表于 2023-8-13 10:13
这个问题是因为百度百科的网站对爬虫进行了反爬虫处理,导致你的爬虫无法正常获取到页面内容。为了解决这个 ...

没用

陶远航 发表于 2023-8-19 14:14:58

Mta123456 发表于 2023-8-19 14:05
没有用

遇到安全验证了

Mta123456 发表于 2023-8-19 15:00:57

陶远航 发表于 2023-8-19 14:14
遇到安全验证了

对啊

陶远航 发表于 2023-8-19 15:01:37

Mta123456 发表于 2023-8-19 15:00
对啊

这种不好搞,改用selenium吧

Mta123456 发表于 2023-8-19 15:01:56

陶远航 发表于 2023-8-19 15:01
这种不好搞,改用selenium吧

我试试

Mta123456 发表于 2023-8-19 15:02:38

陶远航 发表于 2023-8-19 15:01
这种不好搞,改用selenium吧

咋用来着?我忘了{:10_277:}

陶远航 发表于 2023-8-19 15:03:29

Mta123456 发表于 2023-8-19 15:02
咋用来着?我忘了

拖拽滑块,具体代码忘记了

Mta123456 发表于 2023-8-19 15:04:12

陶远航 发表于 2023-8-19 15:03
拖拽滑块,具体代码忘记了

……

mongoole 发表于 2023-8-25 17:24:16

添加cookie信息就OK了昂。
页: [1]
查看完整版本: 网络爬虫出错