IP 地址验证

有的站点,如果发现同一个 IP 地址,频繁的请求数据,就认为这是一个爬虫程序。

解决方法是,让 Scrapy 随机更换代理服务器,需要设置中间件,middlewares.py 中,增加如下类

def RandomProxyMiddleware(object):
    def process_request(self, request, spider):
        request.meta["proxy"] = get_random_proxy()
  • 这里并没有定义 get_random_proxy 函数,需要你自己定义。
  • get_random_proxy 函数,要能随机返回一个代理服务器的 IP 和端口号。
  • 至于代理服务器从哪里来?当然是你自己想办法准备了。

settings.py

DOWNLOADER_MIDDLEWARES = {
   'NoticeSpider.middlewares.RandomProxyMiddleware': 543,
}

有的站点,会根据 Cookie 来识别请求是否来自同一个客户端。如果请求过于频繁,也可能会被认定是爬虫。解决方案是可以尝试禁用 Cookie

settings.py

COOKIES_ENABLED = False

违法 robots.txt

有的站点写了 robots.txt,声明了禁用爬虫。

settings.py 中设置,让 Scrapy 不遵守 robots.txt 定义的规则。

ROBOTSTXT_OBEY = False

访问频率限制

如果快速访问一个项目,也可能被识别成机器人,settings.py 中设置

# 开启访问频率限制
AUTOTHROTTLE_ENABLED = True

# 访问开始的延迟
AUTOTHROTTLE_START_DELAY = 5

# 访问之间最大延迟
AUTOTHROTTLE_MAX_DELAY = 60

# 并行发给每台远程服务器的请求数量
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

# 下载之后自动延迟
DOWNLOAD_DELAY = 3

图形验证码

这是个比较难以处理的问题

  • 使用 PIL、Libsvm 等库自行开发程序识别验证码
  • 通过第三方网站识别