您好,登錄后才能下訂單哦!
本篇內容主要講解“Python爬蟲反反爬的策略有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python爬蟲反反爬的策略有哪些”吧!
爬蟲采集成為很多公司企業個人的需求,但正因為如此,反爬蟲的技術也層出不窮,像時間限制、IP限制、驗證碼限制等等,都可能會導致爬蟲無法進行。所以以下是一些防止爬蟲被反爬的幾個主要策略。
動態設置User-Agent(隨機切換User-Agent,模擬不同用戶的瀏覽器信息,可以使用組件scrapy-random-useragent)
禁用Cookies(對于簡單網站可以不啟用cookies middleware,不向Server發送cookies,有些網站通過cookie的使用發現爬蟲行為)可以通過COOKIES_ENABLED 控制 CookiesMiddleware 開啟或關閉
啟用Cookies(對于復雜網站,需要使用無頭瀏覽器scrapy-splash獲取js生成的復雜cookies
設置延遲下載(防止訪問過于頻繁,設置為 2秒 或更高)
Google Cache 和 Baidu Cache:如果可能的話,使用谷歌/百度等搜索引擎服務器頁面緩存獲取頁面數據。
Referer 使用假的來源,比如百度帶關鍵詞的鏈接
使用IP地址池:現在大部分網站都是根據IP來ban的,可以通過億牛云海量定制代理理池突破
使用 億牛云爬蟲代理組件代碼。
#! -*- encoding:utf-8 -*- import base64 import sys import random PY3 = sys.version_info[0] >= 3 def base64ify(bytes_or_str): if PY3 and isinstance(bytes_or_str, str): input_bytes = bytes_or_str.encode('utf8') else: input_bytes = bytes_or_str output_bytes = base64.urlsafe_b64encode(input_bytes) if PY3: return output_bytes.decode('ascii') else: return output_bytes class ProxyMiddleware(object):
def process_request(self, request, spider): # 代理服務器(產品官網 www.16yun.cn) proxyHost = "t.16yun.cn" proxyPort = "31111" # 代理隧道驗證信息 proxyUser = "username" proxyPass = "password" request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort) # 添加驗證頭 encoded_user_pass = base64ify(proxyUser + ":" + proxyPass) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass # 設置IP切換頭(根據需求) tunnel = random.randint(1,10000) request.headers['Proxy-Tunnel'] = str(tunnel)
修改項目配置文件 (./項目名/settings.py)
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':
110,
'項目名.middlewares.ProxyMiddleware':
100,
}
設置下載中間件(Downloader Middlewares)
下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個下載中間件被加載運行。
當引擎傳遞請求給下載器的過程中,下載中間件可以對請求進行處理 (例如增加http header信息,增加proxy信息等);
在下載器完成http請求,傳遞響應給引擎的過程中, 下載中間件可以對響應進行處理(例如進行gzip的解壓等)
要激活下載器中間件組件,將其加入到 DOWNLOADER_MIDDLEWARES 設置中。 該設置是一個字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。
這里是一個例子:
DOWNLOADER_MIDDLEWARES = { 'mySpider.middlewares.MyDownloaderMiddleware': 543,}
編寫下載器中間件十分簡單。每個中間件組件是一個定義了以下一個或多個方法的Python類:
class scrapy.contrib.downloadermiddleware.DownloaderMiddleware
當每個request通過下載中間件時,該方法被調用。
process_request() 必須返回以下其中之一:一個 None 、一個 Response 對象、一個 Request 對象或raise IgnoreRequest:
如果其返回 None ,Scrapy將繼續處理該request,執行其他的中間件的相應方法,直到合適的下載器處理函數(download handler)被調用, 該request被執行(其response被下載)。
如果其返回 Response 對象,Scrapy將不會調用 任何 其他的 process_request() 或process_exception() 方法,或相應地下載函數; 其將返回該response。 已安裝的中間件的process_response() 方法則會在每個response返回時被調用。
如果其返回 Request 對象,Scrapy則停止調用process_request方法并重新調度返回的request。當新返回的request被執行后,相應地中間件鏈將會根據下載的response被調用。
如果其raise一個 IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會被調用。如果沒有任何一個方法處理該異常, 則request的errback(Request.errback)方法會被調用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。
參數:
request (Request 對象) – 處理的request
spider (Spider 對象) – 該request對應的spider
當下載器完成http請求,傳遞響應給引擎的時候調用
process_request() 必須返回以下其中之一: 返回一個 Response 對象、 返回一個 Request 對象或raise一個 IgnoreRequest 異常。
如果其返回一個 Response (可以與傳入的response相同,也可以是全新的對象), 該response會被在鏈中的其他中間件的 process_response() 方法處理。
如果其返回一個 Request 對象,則中間件鏈停止, 返回的request會被重新調度下載。處理類似于 process_request() 返回request所做的那樣。
如果其拋出一個 IgnoreRequest 異常,則調用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。
參數:
request (Request 對象) – response所對應的request
response (Response 對象) – 被處理的response
spider (Spider 對象) – response所對應的spider
使用案例:
1. 創建middlewares.py文件。
Scrapy代理IP、Uesr-Agent的切換都是通過DOWNLOADER_MIDDLEWARES進行控制,我們在settings.py同級目錄下創建middlewares.py文件,包裝所有請求。
# middlewares.py#!/usr/bin/env python# -*- coding:utf-8 -*-import randomimport base64from settings import USER_AGENTSfrom settings import PROXIES# 隨機的User-Agentclass RandomUserAgent(object): def process_request(self, request, spider): useragent = random.choice(USER_AGENTS) request.headers.setdefault("User-Agent", useragent)class RandomProxy(object): def process_request(self, request, spider): proxy = random.choice(PROXIES) if proxy['user_passwd'] is None: # 沒有代理賬戶驗證的代理使用方式 request.meta['proxy'] = "http://" + proxy['ip_port'] else: # 對賬戶密碼進行base64編碼轉換 base64_userpasswd = base64.b64encode(proxy['user_passwd']) # 對應到代理服務器的信令格式里 request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd request.meta['proxy'] = "http://" + proxy['ip_port']
為什么HTTP代理要使用base64編碼:
HTTP代理的原理很簡單,就是通過HTTP協議與代理服務器建立連接,協議信令中包含要連接到的遠程主機的IP和端口號,如果有需要身份驗證的話還需要加上授權信息,服務器收到信令后首先進行身份驗證,通過后便與遠程主機建立連接,連接成功之后會返回給客戶端200,表示驗證通過,就這么簡單,下面是具體的信令格式:
CONNECT 59.64.128.198:21 HTTP/1.1Host: 59.64.128.198:21Proxy-Authorization: Basic bGV2I1TU5OTIzUser-Agent: OpenFetion
其中Proxy-Authorization是身份驗證信息,Basic后面的字符串是用戶名和密碼組合后進行base64編碼的結果,也就是對username:password進行base64編碼。
HTTP/1.0 200 Connection established
OK,客戶端收到收面的信令后表示成功建立連接,接下來要發送給遠程主機的數據就可以發送給代理服務器了,代理服務器建立連接后會在根據IP地址和端口號對應的連接放入緩存,收到信令后再根據IP地址和端口號從緩存中找到對應的連接,將數據通過該連接轉發出去。
2. 修改settings.py配置USER_AGENTS和PROXIES
添加USER_AGENTS:
USER_AGENTS = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"]
添加代理IP設置PROXIES:
代理IP可以購買億牛云的爬蟲代理IP:
PROXIES = [ {'ip_port': 't.16yun.cn:31111', 'user_passwd': '16yun:16yun'}, {'ip_port': 't.16yun.cn:31112', 'user_passwd': '16yun:16yun'}]
除非特殊需要,禁用cookies,防止某些網站根據Cookie來封鎖爬蟲。COOKIES_ENABLED = False
設置下載延遲DOWNLOAD_DELAY = 3
最后設置setting.py里的DOWNLOADER_MIDDLEWARES,添加自己編寫的下載中間件類。
DOWNLOADER_MIDDLEWARES = { #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543, 'mySpider.middlewares.RandomUserAgent': 1, 'mySpider.middlewares.ProxyMiddleware': 100 }
到此,相信大家對“Python爬蟲反反爬的策略有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。