在再識Scrapy-下載豆瓣圖書封面中我們學會了如何下載圖片。但是在大批量爬取的時候我們最怕的就是被網(wǎng)站ban了魄健。官網(wǎng)提供了幾種方法:
1. download_delay
因為我們要大批量爬取網(wǎng)頁插勤,為了防止過分密集影響到別人的服務器,建議在setting.py中設置DOWNLOAD_DELAY=2农尖,最好是在晚上睡覺的時候跑,這樣雖然速度慢了一點助隧,但是被dan的幾率會降低很多哦滑沧。
2. 禁止cookies
cookies,是指某些網(wǎng)站為了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數(shù)據(jù)(通常經過加密)哩牍,有的時候我們需要登錄網(wǎng)站進行爬取數(shù)據(jù)令漂,所以cookies很重要,但是當我們不需要讓網(wǎng)站記住我們的是誰的時候外潜,那么禁止cookies也就防止了可能使用cookies識別爬蟲軌跡的網(wǎng)站得逞挠唆。
在settings.py中設置COOKIES_ENABLES=False嘱吗。也就是不啟用cookies middleware,不想web server發(fā)送cookies谒麦。
3. 變換user agent
user agent是指包含瀏覽器信息、操作系統(tǒng)信息等的一個字符串患膛,也稱之為一種特殊的網(wǎng)絡協(xié)議耻蛇。服務器通過它判斷當前訪問對象是瀏覽器胞此、郵件客戶端還是網(wǎng)絡爬蟲跃捣。之前爬取豆瓣的時候我們就把原來自表爬蟲身份的user agent改了。
如果只用一個user agent 爬取太多次也會讓服務器產生懷疑的,所以我們需要大量的user agent用來建立user agent pool娶聘。并通過DOWNLOADER_MIDDLEWARES切換agent。
建立一個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)