獲取隨機User-Agent和隨機ip代理

如何獲取不斷變化的 User-Agent

推薦我的個人博客: blog.wuzhenyu.com.cn

User Agent中文名爲用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。

比如,firefox 瀏覽器中的 user agent 可能爲 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0,其他瀏覽器的 user agent 都是不一樣的。那麼如何隨機更換 user agent 呢。

如果我們能獲取到所有可能出現的 user agent,那麼我們只需要隨機從這些 user agent 列表中取一條就可以了。正好,有人已經幫我們實現了這個事情。在 github 上搜索 useragent,選擇 fake-useragent,作者維護了一個可變的user agent 列表,地址爲 https://fake-useragent.herokuapp.com/browsers/0.1.7,這個地址是可以根據版本變化的,以前版本的鏈接可能已經無法訪問。這裏列出了所有作者維護的 user-agent(感謝作者和開源的貢獻,給我們提供的方便)。那麼,我們通過獲取到這些 user-agent,然後隨機的從這個列表中取 user-agent 就可以。

這當然是一種方法,但既然已經有了 fake-useragent,那麼我們就不需要這麼做了。大家也可以看幫助文檔中的使用方法。

# 安裝 fake-useragent
pip install fake-useragent

使用 fake-useragent

from fake-useragent import UserAgent
ua = UserAgent()
ua.ie   # 輸出 ie 中的一個隨機的 useragent
ua.firefox # 輸出 firefox 中的一個隨機的 useragent
# 可以查看幫助文檔

在 scrapy 中獲取變化的 useragent

在 scrapy 爬蟲的時候,比如爬取知乎的文章,知乎有一定的反爬蟲限制,會檢測你的 useragent,如果訪問量很大,就會暫時停止你訪問服務器,那麼我們就需要不斷獲取變化的 useragent 來避免被知乎禁止訪問服務器。

大家在 scrapy 官方幫助文檔的時候,應該可以看到 scrapy 的系統設計圖
scrapy architecture

當我們通過 spider yield 一個 requests 的時候,首先通過 spider middlewares 到達 scrapy engine,然後 engine 將 requests 放到 scheduler 的隊列中,通過 scheduler 調度隊列中的 requests ,scheduler 選中一個 requests 後,將 requests 通過 engine 傳遞給 downloader,在這之前,必然會經過 downloader middlewares,downloader 下載好之後,將 response 返回給 engine,engine 在將 response 返回給 spider,我們就可以在 spider 中調用 callback 進行解析,簡單的流程大概就是這樣。

那麼,我們在將 requests 提交給 downloader 進行下載之前,就需要將 user-agent 進行變化,也就是每次都需要隨機取一個 user-agent 才能提交到 downloader 進行下載,否則就可能被知乎禁掉。在提交到 downloader 的時候,必然會經過 downloader middlewares,所以我們實現隨機獲取 user-agent 的邏輯部分,可以在 downloader midllewares 這裏實現。

class RandomUserAgentMiddleWare(object):
    """
    隨機更換User-Agent
    """
    def __init__(self,crawler):
        super(RandomUserAgentMiddleWare, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        def get_ua_type():
            return getattr(self.ua, self.ua_type)   # 取對象 ua 的 ua_type 的這個屬性, 相當於 self.ua.self.ua_type

        # random_useragent = get_ua_type()
        request.headers.setdefault('User-Agent', get_ua_type())

完成 downloader middleware 的時候,我們需要像在 pipelines 一樣,在 settings.py 中進行設置,讓我們的 middleware 生效。在 settings.py 這個文件中,有一個 DOWNLOADER_MIDDLEWARES 這個字典對象,一般默認是註釋的,打開註釋,並將默認的 middleware 註釋掉,按照規則加上我們自己的 middleware。字典後面鍵對應的值,越大表示被調用的優先級越低,調用的順序越靠後,如果不希望註釋掉默認的或者其他的 middleware,就要將我們自己實現的這個 middleware 的值設置的最大,這樣,就能保證我們自己實現的 middleware 是在最後一個被調用,user-agent 不會被其他的影響。

當然,上面的代碼中,設置了一個 RANDOM_UA_TYPE,這樣,就能通過設置這個值,來獲取不同瀏覽器的 user-agent

RANDOM_UA_TYPE = "safari"

在 scrapy 中設置代理

在 scrapy 中設置代理是非常簡單的,比如上面的代碼中,在 process_request 函數的最後加上一句

request.meta["proxy"] = "ip:port"

上面就設置了 scrapy 的代理了,非常簡單。但是,如何獲取這些代理的 ip 和 port 是一個問題。

我們發現,西刺網爲我們提供了很多可用的代理服務器ip和端口,我們只需要將這個網站上面的所有的需要的代理數據獲取下來,放在文件或者數據庫中,每次隨機取一個使用,能夠實現通過隨機代理的方式爬取網站數據。如何爬取所有的代理數據,大家可以參考我之前的一篇博文[ scrapy簡單入門 - 爬取伯樂在線所有文章 ]。

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