python爬蟲之爲什麼需要搭建cookie池

在日常爬蟲工作中,需要先進行賬號登陸才能爬取的網站不少,很多時候,在沒有登錄的情況下,我們可以訪問一部分頁面或請求一些接口,因爲畢竟網站本身需要做SEO,不會對所有頁面都設置登錄限制。但是,不登錄直接爬取會有一些弊端,弊端主要有以下兩點。

  1. 設置了登錄限制的頁面無法爬取。

2.一些頁面和接口雖然可以直接請求,但是請求一旦頻繁,訪問就容易被限制或者IP直接被封,,登陸後就好爬取了。

所以這種情況下我們爬蟲程序就需要要搭建cookies池,與IP代理池不同,Cookies池具有針對性,如果你爬微博就要構建一個微博cookies池,爬知乎就需要構建一個知乎cookies池;而IP代理池是通用的,可供不同的爬蟲任務共同使用。

本文我們以知乎來實現一個Cookies池的搭建過程。Cookies池中保存了許多知乎賬號和登錄後的Cookies信息,並且Cookies池還需要定時檢測每個Cookies的有效性,如果某Cookies無效,那就刪除該Cookies並模擬登錄生成新的Cookies。同時Cookies池還需要一個非常重要的接口,即獲取隨機Cookies的接口,Cookies運行後,我們只需請求該接口,即可隨機獲得一個Cookies並用其爬取。cookie池的實現如下:

# Redis數據庫地址、端口、密碼
REDIS_HOST =  "localhost"               # 注意本地就寫字符串形式的"localhost"
REDIS_PORT = 6379
REDIS_PASSWORD =  None                  # 密碼沒有的話,就寫None

# 產生器使用的瀏覽器
BROSER_TYPE = "chrome"                  # 注意瀏覽器類型,是字符串形式的

# 產生器類,如擴展其他站點,請在此配置
GENERATOR_MAP = {                       # 注意字典後的類名也是字符串形式的
    "https://www.zhihu.com/follow",
    "zhihu":"ZhihuCookiesGenerator"
}

# 測試類,如擴展其他站點,請在此配置
TESTER_MAP ={
    "weibo": "zhihuValidTester",
    "zhihu": "zhihuValidTester"
    # 'XXX':'XXXCookiesGenerator'
}

TESTER_URL_MAP = {
    'weibo': 'www.zhihu.com/follow',
    'zhihu': 'www.zhihu.com/follow'
}

# 產生器和驗證器循環週期
CYCLE = 120

# API地址和端口
API_HOST = '127.0.0.1'                  # host是字符串
API_PORT = 5000                         # port不是字符串

# 產生器開關,模擬登錄添加Cookies
GENERATOR_PROCESS = True

# 驗證器開關,循環檢測數據庫中Cookies是否可用,不可用刪除
TESTER_PROCESS = True

# API接口服務
API_PROCESS = True

代理池的使用是做爬蟲的基礎技術,現在的爬蟲代理有api提取和隧道轉發2種方式,這裏給大家分享下隧道轉發的,供大家參考,代碼示例由億牛雲爬蟲代理專業提供:

    #! -*- encoding:utf-8 -*-

    import requests
    import random

    # 要訪問的目標頁面
    targetUrl = "www.zhihu.com/follow"

    # 要訪問的目標HTTPS頁面
    # targetUrl = "www.zhihu.com/follow"

    # 代理服務器(產品官網 www.16yun.cn)
    proxyHost = "t.16yun.cn"
    proxyPort = "31111"

    # 代理驗證信息
    proxyUser = "ERWERE"
    proxyPass = "897857"

    proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
        "host" : proxyHost,
        "port" : proxyPort,
        "user" : proxyUser,
        "pass" : proxyPass,
    }

    # 設置 http和https訪問都是用HTTP代理
    proxies = {
        "http"  : proxyMeta,
        "https" : proxyMeta,
    }


    #  設置IP切換頭
    tunnel = random.randint(1,10000)
    headers = {"Proxy-Tunnel": str(tunnel)}



    resp = requests.get(targetUrl, proxies=proxies, headers=headers)

    print resp.status_code
    print resp.text

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章