实现爬虫下载限速

        大部分网站一般都会通过ip的访问频率来判断是不是爬虫,虽然Scrapy框架实现了爬虫的限制爬取速度功能,但是当我们爬取的信息不需要用到Scrapy框架,使用requests更加方便的时候,就需要自己手动实现爬虫限制下载速度了。

        代码思路:1.记录爬虫爬取过的每个链接与爬取时间的时间戳;2.设置两次下载时间间隔;3.下载新的网页的时候判断两次下载的时间间隔是否达到了限制时间;4.更新此次爬取的时间戳,进行下一次爬取。

代码:

from urllib.parse import urldefrag,urljoin,urlparse
from datetime import datetime
import random
import time

class Throttle:
    """
    下载限速器
    """
    def __init__(self,delay):
        # 保存每个爬取过的链接与对应爬取时间的时间戳
        self.domains = {} #可以放到mongodb数据库中
        self.delay = delay # 两次下载间隔时间

    def wait_url(self,url_str):
        # 以netloc为基础进行休眠
        domain_url = urlparse(url_str).netloc # 获取到爬取的链接的域名
        last_accessed = self.domains.get(domain_url) # 获取上次爬取链接的时间戳(时间戳与域名对应,爬取该域名的网站之后更新为最新的时间戳)

        # 爬取的条件为上次爬取的时间戳不为空(上次爬取过,如果没有爬取则把这个域名和当前时间戳保存到字典)
        if self.delay > 0 and last_accessed is not None:
            # 计算当前时间和上次访问时间间隔
            # sleep_interval加上随机偏移量
            sleep_interval = self.delay - (datetime.now() - last_accessed).seconds #记录上次爬取到这次的时间间隔
            # 如果时间间隔尚未达到规定的时间间隔,则需要等待
            if sleep_interval > 0:
                time.sleep(sleep_interval + round(random.uniform(1,3),1)) # 设置一个随机的偏移量

        self.domains[domain_url] = datetime.now() #记录爬取这个链接的时间戳

这里实现了一个限速器功能的类,当使用requests进行网页爬取的时候可以直接调用该类来实现爬虫的限速功能。

猜你喜欢

转载自blog.csdn.net/WanYu_Lss/article/details/82951952
今日推荐