《用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抛出异常进行调试。

最新文章

  1. 灾难 bzoj 2815
  2. Table 表单样式
  3. CAS单点登录和spring securtiy集成
  4. Node.js 爬虫,自动化抓取文章标题和正文
  5. Python开发【第一篇】Python基础之正则表达式补充
  6. [CSS]overflow内容溢出
  7. 倒计时(距离活动结束还有X天X小时X分X秒)
  8. 原生JS插件(超详细)
  9. JS区分对象类型
  10. 04.封装ajax
  11. Delphi 的内存操作函数(2): 给数组指针分配内存
  12. webstorm的相关操作
  13. nodejs+mocha+supertest+chai进行测试(only demo)
  14. ASP.NET quartz 定时任务
  15. 转:Java properties | FileNotFoundException: properties (系统找不到指定的文件。)
  16. jquery easyui datagrid 空白条处理 自适应宽高 格式化函数formmater 初始化时会报错 cannot read property &#39;width&#39;||&#39;length&#39; of null|undefined
  17. Java获取后台数据,动态生成多行多列复选框
  18. Modbus常用功能码协议详解
  19. 海量数据处理面试题(2) 将用户的query按出现频度排序
  20. 新手必备!11个强大的 Visual Studio 调试技巧

热门文章

  1. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
  2. 从wireshark中学网络分析(一)
  3. “流”的5个例子(TStream是抽象类,写到文件里和内存里,都是一样的)
  4. 以太坊(ethereum)开发DApp应用的入门区块链技术教程
  5. 非常简单的利用CreateProcess注入DLL的方法
  6. qobject_cast&lt;QPushButton*&gt;(sender()) 简化信号与槽的编写(sender()取得发信号的对象后,就取得了它的全部信息,为所欲为)
  7. JS基本类型特性总结
  8. php一个不错的分页
  9. HTML连载8-video标签
  10. Servlet 3.0异步特性初探