《用python写网络爬虫》,1.4.4链接爬虫,运行时,遇到错误:

Download error:TOO MANY REQUESTS

Traceback(most recent call last):

  File "1.py",line 52,in(module)

    link_crawler('http://example.webscraping.com','/index')

  File "1.py",line 34,in link_crawler

    for link in get_links(html):

  File "1.py",line 50,in get_links

    return webpage_regex.findall(html)

TypeError:excepted string or buffer

分析:首先定位到异常位置,再设置每次请求发送后的等待时间,可解决一次性向服务器发太多请求!

下图是原代码(即出错的代码)

 1 # encoding: UTF-8
 2 import re
 3 import urlparse
 4 import urllib2
 5
 6 def download(url,user_agent='wswp',num_retries=2):
 7     print 'Downloading:',url
 8     headers = {'User-agent':user_agent}
 9     request = urllib2.Request(url,headers=headers)
10     try:
11         html = urllib2.urlopen(url).read()
12     except urllib2.URLError as e:
13         print 'Download error:',e.reason    # 输出错误原因
14         html = None
15         if num_retries > 0:
16             if hasattr(e,'code')and 500 <= e.code <600:
17             # 当错误提示中包含错误代码而且代码是500~600之间的数字时,执行下列代码
18                 return download(url,num_retries-1)
19     return html
20
21 def link_crawler(seed_url,link_regex):
22     crawl_queue = [seed_url]
23     # set函数用于输出不带重复内容的列表(列表中的重复内容会被删掉)
24     seen = set(crawl_queue)                             # 访问过得链接
25     while crawl_queue:
26             url = crawl_queue.pop()
27             html = download(url)
28             for link in get_links(html):
29                 if re.search(link_regex,link):                # 判断link是否符合给定的正则表达式
30                     link = urlparse.urljoin(seed_url,link)
31                                         if link not in seen:                    # 判断此链接是否在已访问链接列表中
32                         seen.add(link)
33                         crawl_queue.append(link)
34 def get_links(html):
35     webpage_regex = re.compile(r'<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE)     #匹配<a href="xxx"> 这样的字符串
36     return webpage_regex.findall(html)
37
38 link_crawler('http://example.webscraping.com','/index')                      

在出错位置加上等待时间(红色标明),如下:

def link_crawler(seed_url,link_regex):crawl_queue = [seed_url]# set函数用于输出不带重复内容的列表(列表中的重复内容会被删掉)  seen = set(crawl_queue)                             # 访问过得链接 while crawl_queue:url = crawl_queue.pop()    html = download(url)for link in get_links(html): time.sleep(0.01)                    #防止同时请求过多,造成服务器报错if re.search(link_regex,link):                # 判断link是否符合给定的正则表达式link = urlparse.urljoin(seed_url,link)    # 将相对url地址改为绝对url地址if link not in seen:                    # 判断此链接是否在已访问链接列表中
                        seen.add(link)crawl_queue.append(link)

测试:

可正常下载

若提示报错中断,则加入try…exception抛出异常进行调试。

转载于:https://www.cnblogs.com/4wheel/p/8532273.html

【Download error:TOO MANY REQUESTS】【TypeError:excepted string or buffer】相关推荐

  1. 第6课:学习用 requests 请求网站,并得到网站数据

    本期课程目录: 什么是 requests: 如何安装 requests: Requests 库的使用: 那么我们怎么使用 requests 来模拟浏览器,去请求网站呢? requests.get() ...

  2. 【转】nginx提示:500 Internal Server Error错误的解决方法

    [转]nginx提示:500 Internal Server Error错误的解决方法 参考文章: (1)[转]nginx提示:500 Internal Server Error错误的解决方法 (2) ...

  3. 相对舒适的爬虫入门系列(一):手快尝鲜【requests库】

    一.实现爬虫命令的交互前,总是要经过环境配置的 (虽然不同系统操作层面上会有不同,本文主要讲方向性内容(配置环境)+一些具体实操代码上手,要问咱也先说咱的环境是win10哈) 1.请直接下载安装Ana ...

  4. 【解决思路】Spring Boot:Error creating bean with name ‘xxxDao‘

    [解决思路]Spring Boot:Error creating bean with name 'xxxDao' 问题重现 运行Spring Boot 项目是报错:Failed to load App ...

  5. 【IAR Error】IAR MSP430编译报错:error

    关于转载的说明:原文内容可能会不断更新,要想得到最新的内容请跳到到原文看. 无编号警告类型: 1.Sat Jun 23, 2012 17:41:05: The stack pointer for st ...

  6. 浪漫的html表白源代码_Love:程序猿的方式【情人节amp;520—我爱你】动画加音效 → 那些年最浪漫的表白(帮你得到你的她)...

    Love:程序猿的方式~[情人节&520-我爱你]~动画加音效 → 那些年最浪漫的表白(帮你得到你的她) 导读 本文章代码的实现,主要参考GitHub(wuxia2001和hackerzhou ...

  7. Love:程序猿的方式~【情人节520—我爱你】~动画加音效 → 那些年最浪漫的表白(帮你得到你的她)

    Love:程序猿的方式~[情人节&520-我爱你]~动画加音效 → 那些年最浪漫的表白(帮你得到你的她) 导读        本文章代码的实现,主要参考GitHub(wuxia2001和hac ...

  8. 【Fabric】简单测试:链码单元测试+fabric-go-sdk

    纯粹记录一下,也不知道干了啥~ 链码单元测试 在Ubuntu中安装VScode 下载安装包 打开Ubuntu的火狐,访问网址:https://code.visualstudio.com/docs=&g ...

  9. 树莓派学习::qt5.10.1交叉编译【带opengl ES2】到非官方64位系统

    qt5.10.1交叉编译[带opengl ES2](armv8 64位) 本次交叉编译是树莓派学习::qt5交叉编译(armv8 64位).的升级版,这次编译带opengl Es2的qt,原因是为了可 ...

  10. 树莓派学习::qt5.10.1交叉编译【带opengl ES2】到官方Raspbian Stretch

    qt5.10.1交叉编译[带opengl ES2]到官方Raspbian Stretch 本次更新是树莓派学习::qt5.10.1交叉编译[带opengl ES2](armv8 64位)的延续,这次编 ...

最新文章

  1. 为什么我害怕数据结构学得好的程序员?
  2. scanner怎样回到文件开头_Radare2逆向分析dex/so/二进制等文件的使用方法
  3. Java多线程编程核心技术-多线程基础使用
  4. MEF董事、中国电信云计算中心主任赵慧玲:MEF第三类网络
  5. 疫中行,程序员可在家免费学这些!
  6. 如何避免_如何避免钢板弹簧受损
  7. 虚幻开发工具包发布版本的版本信息
  8. 华为ME909s-821模块电信卡发短信问题
  9. 使用ajax报405错误
  10. Python ln_LN型芯型联轴器
  11. InnoSetup打包自动签名
  12. 智能运维 VS 传统运维|AIOps服务管理解决方案全面梳理
  13. 斜杠'/' 和反斜杠'\'
  14. 如何关闭电脑自动更新?
  15. CSS经常会用到的属性
  16. 【洛谷P4084】Barn Painting【树形DP】
  17. 2020年卫星行业研究报告
  18. 安装PLC报错“bitte fuhren sie einen neustare neustart aus, bevor sie weitere programme installieren.veuil
  19. NLP指南 Your Guide to Natural Language Processing (NLP)
  20. html视频怎么编辑倍速,浏览器flash/html5视频播放如何倍速(Enounce MySpeed)

热门文章

  1. Vue人资中台--打包上线
  2. 文件格式的幻数File Format and Magic Number
  3. JAVAWEB开发Myeclipse 项目中报“无法解析类型 java.io.ObjectInputStream,从必需的 .class 文件间接引用了它”解决办法
  4. FPGA学习.7——DDS信号发生器
  5. android switch背景图片,修改SwitchCompat的背景图片
  6. 学习PPT好帖子 分享之
  7. jetbrains验证服务器,搭建个人jetbrains授权服务器
  8. foobox 3.8(foobar2000 CUI配置)
  9. Python 统计分析--单因素方差分析
  10. 论文参考文献正确插入方法 (一)