真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

本篇內(nèi)容主要講解“Python爬蟲反反爬的策略有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python爬蟲反反爬的策略有哪些”吧!

峰峰礦網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

爬蟲采集成為很多公司企業(yè)個(gè)人的需求,但正因?yàn)槿绱?,反爬蟲的技術(shù)也層出不窮,像時(shí)間限制、IP限制、驗(yàn)證碼限制等等,都可能會導(dǎo)致爬蟲無法進(jìn)行。所以以下是一些防止爬蟲被反爬的幾個(gè)主要策略。

  • 動態(tài)設(shè)置User-Agent(隨機(jī)切換User-Agent,模擬不同用戶的瀏覽器信息,可以使用組件scrapy-random-useragent)

  • 禁用Cookies(對于簡單網(wǎng)站可以不啟用cookies middleware,不向Server發(fā)送cookies,有些網(wǎng)站通過cookie的使用發(fā)現(xiàn)爬蟲行為)可以通過COOKIES_ENABLED 控制 CookiesMiddleware 開啟或關(guān)閉

  • 啟用Cookies(對于復(fù)雜網(wǎng)站,需要使用無頭瀏覽器scrapy-splash獲取js生成的復(fù)雜cookies

  • 設(shè)置延遲下載(防止訪問過于頻繁,設(shè)置為 2秒 或更高)

  • Google Cache 和 Baidu Cache:如果可能的話,使用谷歌/百度等搜索引擎服務(wù)器頁面緩存獲取頁面數(shù)據(jù)。

  • Referer 使用假的來源,比如百度帶關(guān)鍵詞的鏈接

  • 使用IP地址池:現(xiàn)在大部分網(wǎng)站都是根據(jù)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):                # 代理服務(wù)器(產(chǎn)品官網(wǎng) www.16yun.cn)                proxyHost = "t.16yun.cn"                proxyPort = "31111"                # 代理隧道驗(yàn)證信息                proxyUser = "username"                proxyPass = "password"                request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort)                # 添加驗(yàn)證頭                encoded_user_pass = base64ify(proxyUser + ":" + proxyPass)                request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass                                    # 設(shè)置IP切換頭(根據(jù)需求)                tunnel = random.randint(1,10000)                request.headers['Proxy-Tunnel'] = str(tunnel)

修改項(xiàng)目配置文件 (./項(xiàng)目名/settings.py)

DOWNLOADER_MIDDLEWARES = {

       'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,

       '項(xiàng)目名.middlewares.ProxyMiddleware': 100,

   }

設(shè)置下載中間件(Downloader Middlewares)

下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個(gè)下載中間件被加載運(yùn)行。

  1. 當(dāng)引擎?zhèn)鬟f請求給下載器的過程中,下載中間件可以對請求進(jìn)行處理 (例如增加http header信息,增加proxy信息等);

  2. 在下載器完成http請求,傳遞響應(yīng)給引擎的過程中, 下載中間件可以對響應(yīng)進(jìn)行處理(例如進(jìn)行g(shù)zip的解壓等)

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

這里是一個(gè)例子:

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

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

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

  • 當(dāng)每個(gè)request通過下載中間件時(shí),該方法被調(diào)用。

  • process_request() 必須返回以下其中之一:一個(gè) None 、一個(gè) Response 對象、一個(gè) Request 對象或raise IgnoreRequest:

    • 如果其返回 None ,Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)(download handler)被調(diào)用, 該request被執(zhí)行(其response被下載)。

    • 如果其返回 Response 對象,Scrapy將不會調(diào)用 任何 其他的 process_request() 或process_exception() 方法,或相應(yīng)地下載函數(shù); 其將返回該response。 已安裝的中間件的process_response() 方法則會在每個(gè)response返回時(shí)被調(diào)用。

    • 如果其返回 Request 對象,Scrapy則停止調(diào)用process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后,相應(yīng)地中間件鏈將會根據(jù)下載的response被調(diào)用。

    • 如果其raise一個(gè) IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會被調(diào)用。如果沒有任何一個(gè)方法處理該異常, 則request的errback(Request.errback)方法會被調(diào)用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。

  • 參數(shù):

    • request (Request 對象) – 處理的request

    • spider (Spider 對象) – 該request對應(yīng)的spider

process_response(self, request, response, spider)

當(dāng)下載器完成http請求,傳遞響應(yīng)給引擎的時(shí)候調(diào)用

  • process_request() 必須返回以下其中之一: 返回一個(gè) Response 對象、 返回一個(gè) Request 對象或raise一個(gè) IgnoreRequest 異常。

    • 如果其返回一個(gè) Response (可以與傳入的response相同,也可以是全新的對象), 該response會被在鏈中的其他中間件的 process_response() 方法處理。

    • 如果其返回一個(gè) Request 對象,則中間件鏈停止, 返回的request會被重新調(diào)度下載。處理類似于 process_request() 返回request所做的那樣。

    • 如果其拋出一個(gè) IgnoreRequest 異常,則調(diào)用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。

  • 參數(shù):

    • request (Request 對象) – response所對應(yīng)的request

    • response (Response 對象) – 被處理的response

    • spider (Spider 對象) – response所對應(yīng)的spider

使用案例:

1. 創(chuàng)建middlewares.py文件。

Scrapy代理IP、Uesr-Agent的切換都是通過DOWNLOADER_MIDDLEWARES進(jìn)行控制,我們在settings.py同級目錄下創(chuàng)建middlewares.py文件,包裝所有請求。

# middlewares.py#!/usr/bin/env python# -*- coding:utf-8 -*-import randomimport base64from settings import USER_AGENTSfrom settings import PROXIES# 隨機(jī)的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:            # 沒有代理賬戶驗(yàn)證的代理使用方式            request.meta['proxy'] = "http://" + proxy['ip_port']        else:            # 對賬戶密碼進(jìn)行base64編碼轉(zhuǎn)換            base64_userpasswd = base64.b64encode(proxy['user_passwd'])            # 對應(yīng)到代理服務(wù)器的信令格式里            request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd            request.meta['proxy'] = "http://" + proxy['ip_port']

為什么HTTP代理要使用base64編碼:

HTTP代理的原理很簡單,就是通過HTTP協(xié)議與代理服務(wù)器建立連接,協(xié)議信令中包含要連接到的遠(yuǎn)程主機(jī)的IP和端口號,如果有需要身份驗(yàn)證的話還需要加上授權(quán)信息,服務(wù)器收到信令后首先進(jìn)行身份驗(yàn)證,通過后便與遠(yuǎn)程主機(jī)建立連接,連接成功之后會返回給客戶端200,表示驗(yàn)證通過,就這么簡單,下面是具體的信令格式:

CONNECT 59.64.128.198:21 HTTP/1.1Host: 59.64.128.198:21Proxy-Authorization: Basic bGV2I1TU5OTIzUser-Agent: OpenFetion

其中Proxy-Authorization是身份驗(yàn)證信息,Basic后面的字符串是用戶名和密碼組合后進(jìn)行base64編碼的結(jié)果,也就是對username:password進(jìn)行base64編碼。

HTTP/1.0 200 Connection established

OK,客戶端收到收面的信令后表示成功建立連接,接下來要發(fā)送給遠(yuǎn)程主機(jī)的數(shù)據(jù)就可以發(fā)送給代理服務(wù)器了,代理服務(wù)器建立連接后會在根據(jù)IP地址和端口號對應(yīng)的連接放入緩存,收到信令后再根據(jù)IP地址和端口號從緩存中找到對應(yīng)的連接,將數(shù)據(jù)通過該連接轉(zhuǎn)發(fā)出去。

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設(shè)置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,防止某些網(wǎng)站根據(jù)Cookie來封鎖爬蟲。COOKIES_ENABLED = False

  • 設(shè)置下載延遲DOWNLOAD_DELAY = 3

  • 最后設(shè)置setting.py里的DOWNLOADER_MIDDLEWARES,添加自己編寫的下載中間件類。

DOWNLOADER_MIDDLEWARES = {            #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,        'mySpider.middlewares.RandomUserAgent': 1,        'mySpider.middlewares.ProxyMiddleware': 100    }

到此,相信大家對“Python爬蟲反反爬的策略有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)站名稱:Python爬蟲反反爬的策略有哪些
本文來源:http://weahome.cn/article/jscppi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部