中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲反反爬的策略有哪些

發布時間:2021-11-01 17:03:48 來源:億速云 閱讀:279 作者:iii 欄目:編程語言

本篇內容主要講解“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())之間的一層組件,可以有多個下載中間件被加載運行。

  1. 當引擎傳遞請求給下載器的過程中,下載中間件可以對請求進行處理 (例如增加http header信息,增加proxy信息等);

  2. 在下載器完成http請求,傳遞響應給引擎的過程中, 下載中間件可以對響應進行處理(例如進行gzip的解壓等)

要激活下載器中間件組件,將其加入到 DOWNLOADER_MIDDLEWARES 設置中。 該設置是一個字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。

這里是一個例子:

DOWNLOADER_MIDDLEWARES = {    'mySpider.middlewares.MyDownloaderMiddleware': 543,}

編寫下載器中間件十分簡單。每個中間件組件是一個定義了以下一個或多個方法的Python類:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

  • 當每個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

process_response(self, request, response, 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爬蟲反反爬的策略有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

重庆市| 麟游县| 东台市| 兴化市| 和平区| 和静县| 芷江| 汉阴县| 左贡县| 昌吉市| 凤庆县| 峨边| 郯城县| 金门县| 荃湾区| 左贡县| 曲阳县| 临洮县| 嘉祥县| 靖宇县| 合作市| 闽清县| 德钦县| 西城区| 乌拉特后旗| 大方县| 古浪县| 张家口市| 北安市| 虎林市| 芜湖市| 鄂伦春自治旗| 云梦县| 高淳县| 盘锦市| 康乐县| 田东县| 凤庆县| 嘉祥县| 台湾省| 谢通门县|