欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python爬蟲反反爬的策略有哪些-創(chuàng)新互聯(lián)

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

網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠為客戶提供服務(wù)是我們的理念。成都創(chuàng)新互聯(lián)把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!

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

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

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

  • 啟用Cookies(對(duì)于復(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請(qǐng)求給下載器的過程中,下載中間件可以對(duì)請(qǐng)求進(jìn)行處理 (例如增加http header信息,增加proxy信息等);

  2. 在下載器完成http請(qǐng)求,傳遞響應(yīng)給引擎的過程中, 下載中間件可以對(duì)響應(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 對(duì)象、一個(gè) Request 對(duì)象或raise IgnoreRequest:

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

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

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

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

  • 參數(shù):

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

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

process_response(self, request, response, spider)

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

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

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

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

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

  • 參數(shù):

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

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

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

使用案例:

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

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

# 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:            # 對(duì)賬戶密碼進(jìn)行base64編碼轉(zhuǎn)換            base64_userpasswd = base64.b64encode(proxy['user_passwd'])            # 對(duì)應(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和端口號(hào),如果有需要身份驗(yàn)證的話還需要加上授權(quán)信息,服務(wù)器收到信令后首先進(jìn)行身份驗(yàn)證,通過后便與遠(yuǎn)程主機(jī)建立連接,連接成功之后會(huì)返回給客戶端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é)果,也就是對(duì)username:password進(jìn)行base64編碼。

HTTP/1.0 200 Connection established

OK,客戶端收到收面的信令后表示成功建立連接,接下來要發(fā)送給遠(yuǎn)程主機(jī)的數(shù)據(jù)就可以發(fā)送給代理服務(wù)器了,代理服務(wù)器建立連接后會(huì)在根據(jù)IP地址和端口號(hào)對(duì)應(yīng)的連接放入緩存,收到信令后再根據(jù)IP地址和端口號(hào)從緩存中找到對(duì)應(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    }

到此,相信大家對(duì)“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爬蟲反反爬的策略有哪些-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://aaarwkj.com/article24/icgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站維護(hù)小程序開發(fā)、網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
日产中文乱码字幕无线观看| 国产极品美女在线观看网站| 国产视频在线一区二区| 91精品国产91久久综合福利| 国产特级黄色片免费看| 91九色国产在线播放| 天天操夜夜操夜夜操精品| 久久好大好爽要死了欧美| 亚洲精品露脸自拍高清在线观看| av天堂最新资源在线| 中文字幕国产精品一二区| 日本东京热免一区二区| 自拍日韩亚洲一区在线| 欧美国产精品一区二区免费| 91国产熟女自拍视频 | 国产精品国产三级专区| 天天日天天天干夜夜操| 欧美黄片一区二区三区三| 91精品免费播放在线观看| 国产三级精品久久三级国专区| 囗交囗爆吞精在线视频| 成人高清在线观看91| 日韩成人高清免费在线| 国产亚洲欧美另类网爆| 十八禁真人无摭挡观看| 国产精品高清呻吟久久久| 久久国产精品99亚洲| 激情婷婷亚洲五月综合网| 日本一区二区三区日本| 亚洲福利网址一二三区| 片子免费毛片日韩不卡一区| 欧美另类亚洲综合久青草| 国产成人综合亚洲不卡| 日韩商清av毛片网站| 欧美日韩国产天堂一区| 亚洲欧美日韩伦理一区| 亚洲高清成人综合网站| 日韩一区二区三区91| 日韩一区二区三区成人| 欧美黄片精品在线观看| 国产精品乱码一区二区视频|