找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3804|回复: 2

[已解决] 爬虫 下载限速问题

2

主题

3

帖子

3

积分

贫民

积分
3
香蕉狗怀孕 发表于 2017-3-3 10:19:27 | 显示全部楼层 |阅读模式
《用python写网络爬虫》里的 关于爬虫限速的一段程序:
class Throttle:
def __init__(self, delay):
  self.delay = delay
  self.domains = {}
def wait(self, url):
  domain = urlparse.urlparse(url).netloc
  last_accessed = self.domains.get(domain)
  if self.delay > 0 and last_accessed is not None:
   sleep_secs = self.delay - (datetime.now() - last_accessed).seconds
   if sleep_secs > 0:
    print last_accessed
    print sleep_secs
    time.sleep(sleep_secs)
  self.domains[domain] = datetime.now()

我觉得不合理啊,last_accessd不是每次都更新了啊 而不是调出上一次的,怎么就能实现限速了啊
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-3-6 17:21:40 | 显示全部楼层
是每次都更新,但是注意:它有一个sleep的时间, 也就是说它是通过上次抓取时间来计算sleep时间的, 这样就可以通过控制self.delay来控制抓取频率(速度)了
回复 支持 反对

使用道具 举报

2

主题

3

帖子

3

积分

贫民

积分
3
香蕉狗怀孕  楼主| 发表于 2017-3-7 09:23:41 | 显示全部楼层
blueelwang 发表于 2017-3-6 17:21
是每次都更新,但是注意:它有一个sleep的时间, 也就是说它是通过上次抓取时间来计算sleep时间的, 这样就 ...

它是将每次运行完成后的domain当成一个key存入domains的字典里对应着一个 时间的值,然后下一次就调用这个值当作上一次的时间。但是last_accessed = self.domains.get(domain)这个函数取出来值时 所用的key 是通过domain = urlparse.urlparse(url).netloc 得到的,那这个domain代表的不是不代表上一次的值啊。得到的last_accessed不是应该为空吗,因为这次的domain还没有赋予时间的值吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表