前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Download error:TOO MANY REQUESTS】&【TypeError:excepted string or buffer】

【Download error:TOO MANY REQUESTS】&【TypeError:excepted string or buffer】

作者头像
逆向小白
发布2018-09-12 15:50:09
6180
发布2018-09-12 15:50:09
举报
文章被收录于专栏:py+selenium

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

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

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

代码语言:javascript
复制
 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')                      

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

代码语言:javascript
复制
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抛出异常进行调试。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档