鱼C论坛

 找回密码
 立即注册
查看: 950|回复: 12

网络爬虫出错

[复制链接]
发表于 2023-8-13 10:12:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先给出下列代码
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">

<!--[if lte IE 9]>
<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[i]);

      }



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

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

      var l = f.length;

      while(l--) {

        window.console[f[l]] = function () {};

      }

    })();

  </script>
<![endif]-->
<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[0].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>
谁能告诉我这是为什么?怎么改正?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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来加载页面并获取内容。

以上是一些常见的解决方法,你可以根据具体情况选择其中的一种或多种尝试。希望能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。

需要注意的是,爬取网站数据时请确保遵守相关的法律法规和网站的使用条款,以及尊重网站的爬虫策略。使用爬虫时请合理、稳健地进行,避免对被爬取网站造成不必要的负担。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-19 14:05:45 | 显示全部楼层
陶远航 发表于 2023-8-13 10:13
根据你提供的代码和返回的源码,你的网络爬虫遇到了百度百科的反爬虫机制。百度百科通过验证机制识别爬虫, ...

没有用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-19 14:14:58 | 显示全部楼层

遇到安全验证了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-19 15:00:57 | 显示全部楼层

对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-19 15:01:37 | 显示全部楼层

这种不好搞,改用selenium吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-19 15:01:56 | 显示全部楼层
陶远航 发表于 2023-8-19 15:01
这种不好搞,改用selenium吧

我试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-19 15:02:38 | 显示全部楼层
陶远航 发表于 2023-8-19 15:01
这种不好搞,改用selenium吧

咋用来着?我忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-19 15:03:29 | 显示全部楼层
Mta123456 发表于 2023-8-19 15:02
咋用来着?我忘了

拖拽滑块,具体代码忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-19 15:04:12 | 显示全部楼层
陶远航 发表于 2023-8-19 15:03
拖拽滑块,具体代码忘记了

……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 17:24:16 | 显示全部楼层
添加cookie信息就OK了昂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表