在再识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改了。
![img_4e9b4aec5ed4edf7c643d05834dbf861.png](https://i-blog.csdnimg.cn/blog_migrate/f009a604b8c9bc66433e6da34f417284.png)
如果只用一个user agent 爬取太多次也会让服务器产生怀疑的,所以我们需要大量的user agent用来建立user agent pool。并通过DOWNLOADER_MIDDLEWARES切换agent。
![img_1cf9db1c11981628437c9291a08a2f57.png](https://i-blog.csdnimg.cn/blog_migrate/afe930777e1847fb924e2af6c3d3bb8c.png)
建立一个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)