爬取百度提示超时_爬取网页的通用代码框架

4546ea7fde9313da6474f3a6399042bb.png

通用代码框架是指一组能很快且准确,可靠的爬取网页内容的代码。

通常我们都会使用requests.get(url)来获取网页的相关内容。但是,这并不能每次都能成功访问到所想访问的网站,所以,我们还要学会做异常处理。

Requests库异常有以下6种:

  1. requests.ConnectionError():网络连接错误异常,如DNS查询失败、拒绝连接等

2. requests.HTTPError(): HTTP错误异常

3. requests.URLRequired(): URL缺失异常

4. requests.TooManyRedirects():超过最大重定向次数,产生重定向异常

5. requests.ConnectTimeout():连接远程服务器超时异常

6. requests.Timeout():请求URL超时,产生超时异常

其中,ConnectTimeOut异常和TimeOut异常是有区别的,TimeOut是指发出url请求到获取整个内容的超时而产生的异常,而ConnectTimeOut是与远程服务器之间连接超时而产生的异常。

理解Response类很重要,Response这个对象返回了所有的网页内容,那么它也提供了一个方法:

r.raise_for_status():如果不是200,产生异常requests.HTTPError

该方法能判断返回的内容是不是200,不是的话会返回一个HTTPError的异常。

下面我们来看一下通用代码框架。

import requests

# 通用代码框架
def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status() # 如果状态不是200,引发HTTPError异常
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

由于涉及到异常处理,我们就用到了Python的try, except语句。其中,第一段我们就称为通用代码框架。首先我们通过get()方法获取到网页内容,然后通过r.raise_for_status()来获取异常,如果状态码不是200,那么将会引发HTTPError异常,然后我们通过r.encoding赋给r.apparent_encoding来获取到网页编码,最后r.text得到整个网页内容。如果连接过程,网络出现问题,那么就会执行try, except语句获取一个异常,那么return就能返回到一个异常语句。

我们试运行一下上面的代码,得到结果:

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

没有问题,网页正常显示。

当我们创造一个异常时,比如,删除掉http://, 这时运行:

产生异常

我们看到,会提示except部分产生异常。

其实,通用代码框架就是一种让用户爬取网页更快,更有效的一种方法。

(笔记)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中,可以使用线程来实现代码超时功能。具体实现方式如下: 1. 定义一个线程类,继承 Thread 类,并重写 run 方法,在 run 方法中执行需要超时代码。 2. 在主线程中创建该线程对象,并启动该线程。 3. 在主线程中调用该线程对象的 join 方法,并传入一个超时时间,单位为毫秒。如果该线程在超时时间内没有执行完毕,则主线程抛出 InterruptedException 异常。 示例代码如下: ```java public class TimeoutThread extends Thread { private volatile boolean finished = false; // 用于标记线程是否执行完毕 private Runnable task; // 需要超时代码 public TimeoutThread(Runnable task) { this.task = task; } @Override public void run() { task.run(); finished = true; } public boolean isFinished() { return finished; } } public class Main { public static void main(String[] args) { Runnable task = new Runnable() { @Override public void run() { // 需要超时代码 } }; TimeoutThread thread = new TimeoutThread(task); thread.start(); try { thread.join(1000); // 设置超时时间为 1 秒 if (!thread.isFinished()) { thread.interrupt(); // 如果超时,则中断线程 throw new InterruptedException("超时"); } } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在上面的代码中,TimeoutThread 类继承 Thread 类,并重写了 run 方法,在该方法中执行需要超时代码,并在执行完毕后将 finished 标记设为 true。 在主线程中,创建 TimeoutThread 对象,并启动该线程。然后调用该线程对象的 join 方法,并传入超时时间 1000 毫秒。如果 TimeoutThread 线程在 1000 毫秒内执行完毕,则主线程继续执行。否则,主线程抛出 InterruptedException 异常,并中断 TimeoutThread 线程。 需要注意的是,在超时时,需要使用 thread.interrupt() 方法中断线程。因为线程在执行某些代码时可能会阻塞,而中断线程可以使线程从阻塞状态中恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值