Scrapy进阶-防ban策略

96
hoptop 22d8d123 271c 4d80 9c59 6990844a9e37
2016.06.08 21:32* 字数 478

再识Scrapy-下载豆瓣图书封面中我们学会了如何下载图片。但是在大批量爬取的时候我们最怕的就是被网站ban了。官网提供了几种方法:

1. download_delay

因为我们要大批量爬取网页,为了防止过分密集影响到别人的服务器,建议在setting.py中设置DOWNLOAD_DELAY=2,最好是在晚上睡觉的时候跑,这样虽然速度慢了一点,但是被dan的几率会降低很多哦。

2. 禁止cookies

cookies,是指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),有的时候我们需要登录网站进行爬取数据,所以cookies很重要,但是当我们不需要让网站记住我们的是谁的时候,那么禁止cookies也就防止了可能使用cookies识别爬虫轨迹的网站得逞。
在settings.py中设置COOKIES_ENABLES=False。也就是不启用cookies middleware,不想web server发送cookies。

3. 变换user agent

user agent是指包含浏览器信息、操作系统信息等的一个字符串,也称之为一种特殊的网络协议。服务器通过它判断当前访问对象是浏览器、邮件客户端还是网络爬虫。之前爬取豆瓣的时候我们就把原来自表爬虫身份的user agent改了。

user agent

如果只用一个user agent 爬取太多次也会让服务器产生怀疑的,所以我们需要大量的user agent用来建立user agent pool。并通过DOWNLOADER_MIDDLEWARES切换agent。

DOWNLOADER_MIDDLEWARES

建立一个middlewares.py, 内容如下:

# -*- coding: utf-8 -*-
import random
from scrapy.conf import settings

class RandomUserAgent(object):
    """Randomly rotate user agents based on a list of predefined ones"""
    def __init__(self, agents):
        self.agents = agents

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('USER_AGENTS'))

    def process_request(self, request, spider):
        ua = random.choice(self.agents)
        request.headers.setdefault('User-Agent', ua)

下面两个方法目前不会,先占位

4. 使用proxy

5. 分布式爬取

爬虫学习
Web note ad 1