《用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. SQLSERVER 数据库备份脚本-支持多库备份

    原文:SQLSERVER 数据库备份脚本-支持多库备份 <pre name="code" class="sql">--变量定义 DECLARE @b ...

  2. UWP显示对话框

    public static async void ShowMessage(string message) { var msgDialog = new Windows.UI.Popups.Message ...

  3. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

  4. 【Windows10 IoT开发系列】API 移植工具

    原文:[Windows10 IoT开发系列]API 移植工具 Windows 10 IoT Core 中是否提供你的当前 Win32 应用程序或库所依赖的 API? 如果不提供,是否存在可使用的等效 ...

  5. Sailfish OS 2.1.0 发布,带来重大的架构变化

    Sailfish OS 2.1.0 Iijoki 发布了. Iijoki通过引入Qt 5.6 UI框架.BlueZ 5 蓝牙堆栈和 64 位架构的基本实现,为Sailfish操作系统带来了重大的架构变 ...

  6. CheckSynchronize实现的不必要的复杂

    在system.classes单元中,CheckSynchronize在ThreadLock上持续调用TMonitor的Exit和Enter以保护SyncList. 因为代码做的第一件事是换出Sync ...

  7. <iOS小技巧> 返回上级目录操作Goback()方法

    Goback()方法功能:返回上一级界面,通过判断 popViewControllerAnimated 类型是否为空,来判断是present还是pop出来,然后直接做了releaseSelf操作: - ...

  8. qtablewidget qss加上这个,QHeaderView::section

     qtablewidget  qss加上这个,QHeaderView::section {    color: white;    padding: 4px;    height:24px;    b ...

  9. Dedecms 中,获取某一栏目所有子栏目

    以前从来没写过递归(其实想想,对算法完全没概念),刚好有这个需求,试着写了一下,发现也挺容易的,特别记录一下. 数据库是dedecms默认的,dede_arctype是保存栏目的表,reid是栏目的父 ...

  10. 35+个实用jQuery菜单插件

    应用jQuery菜单插件可以让浏览者在浏览你的网页时获得最好的动态导航.jQuery是一个轻量级.跨浏览器的JavaScript框架(库),效果非常给力,它强调并简化了JavaScript.CSS和H ...