《用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

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

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

 # encoding: UTF-8
import re
import urlparse
import urllib2 def download(url,user_agent='wswp',num_retries=2):
print 'Downloading:',url
headers = {'User-agent':user_agent}
request = urllib2.Request(url,headers=headers)
try:
html = urllib2.urlopen(url).read()
except urllib2.URLError as e:
print 'Download error:',e.reason # 输出错误原因
html = None
if num_retries > 0:
if hasattr(e,'code')and 500 <= e.code <600:
# 当错误提示中包含错误代码而且代码是500~600之间的数字时,执行下列代码
return download(url,num_retries-1)
return html 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):
if re.search(link_regex,link): # 判断link是否符合给定的正则表达式
link = urlparse.urljoin(seed_url,link)
if link not in seen: # 判断此链接是否在已访问链接列表中
seen.add(link)
crawl_queue.append(link)
def get_links(html):
webpage_regex = re.compile(r'<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE) #匹配<a href="xxx"> 这样的字符串
return webpage_regex.findall(html) 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抛出异常进行调试。

【Download error:TOO MANY REQUESTS】&【TypeError:excepted string or buffer】的更多相关文章

  1. a=re.findall('b',c)报错提示:TypeError:expected string or buffer

    目的:想通过findall选取某个unicode编码的字符串列表(列表里面有元组) 问题:报错[TypeError:expected string or buffer] 现在测试下: 定义一个有元组的 ...

  2. 【Mac系统】之Mysql数据库遇到修改数字密码的问题(SQL语法错误:ERROR 1064 (42000),密码策略等问题:ERROR 1819 (HY000))

    安装完Mysql也进行了第一次初始化密码以及修改密码规则(请参考文章),但是我想后续再改密码,出现了下面几个问题: #SQL语句错误问题 ERROR 1064 (42000): You have an ...

  3. 【译】微型ORM:PetaPoco【不完整的翻译】

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  4. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置

    图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...

  5. python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇

    python内置模块补充 一.configparser configparser:用户处理特定格式的文件,其本质是利用open打开文件 # 节点 [section1] #键值对k1 = v1 k2:v ...

  6. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  7. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  8. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  9. Scrapy爬虫框架第五讲(linux环境)【download middleware用法】

    DOWNLOAD MIDDLEWRE用法详解 通过上面的Scrapy工作架构我们对其功能进行下总结: (1).在Scheduler调度出队列时的Request送给downloader下载前对其进行修改 ...

随机推荐

  1. Windows Phone开发参考资料

    Windows Phone API 参考 http://msdn.microsoft.com/zh-cn/library/windows/apps/ff626516(v=vs.105).aspx Wi ...

  2. lvcreate命令

    lvcreate Command Examples on Linux : 1. The following command creates a logical volume 15 gigabytes ...

  3. Windows下获取高精度时间注意事项 [转贴 AdamWu]

    花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊 - 曾经据说是处理器的cycle counter, ...

  4. 联想笔记本进入不了BIOS的解决方法

    当计算机遇到问题时,很多情况下需要进入BIOS进行解决.但很多新出的联想笔记本电脑在开机时,无论怎么疯狂的按F2,Fn+F2,F12或者Del,都无法进入BIOS,十分气人. 这种现象出现的原因是联想 ...

  5. c++ LeetCode (初级字符串篇) 九道算法例题代码详解(二)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11089327.html 已经刷了很多篇leetcode题了,不过最近在找c++的实习工作(大佬 ...

  6. 《SpringMVC从入门到放肆》十五、SpringMVC之上传文件

    上一篇我们学习了数据分组校验,已经可以灵活的在项目中进行数据校验了,今天来学习SpringMVC的上传文件功能.相对来说SpringMVC的上传功能,还是比较简单的. 一.添加依赖 <depen ...

  7. Django学习笔记(20)——BBS+Blog项目开发(4)Django如何使用Bootstrap

    本文学习如何通过Django使用Bootstrap.其实在之前好几个Django项目中已经尝试使用过了Bootstrap,而且都留有学习记录,我已经大概有了一个大的框架,那么本文就从头再走一遍流程,其 ...

  8. 设计模式之单例模式的几种写法——java

    对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...

  9. 简单了解HashCode()

    在java的内部类中,计算HashCode通常使用 code = 元素* 31 + 下一个元素 以String为例 public int hashCode() { int h = hash; if ( ...

  10. 阿里云部署Redis服务器远程连接问题

    昨天在阿里云免费领了一个月的云服务器,就着最近学的SpringBoot,准备做一个SpringBoot与Redis的整合. 因为以前用的Redis都是安装在本地的,使用过程中没遇到什么大问题,可是一旦 ...