[ Selenium ] 偽造身份進行網路爬蟲

網路爬蟲做到這步,通常是在要大量訪問同一個網站,從事某些行為。這真的超不乖的,好孩子千萬別學。

訪問某些網站時,網站其實能因應不同的瀏覽器、作業系統等,提供不同的回應。例如下載軟體時會自動導向到適合的下載連結。這些訊息都藏在 header中的 user-agent中。
當大量訪問同一個網站,若 server端的警覺心比較強的情況下只依賴 Tor進行爬蟲,會發現每個訪問的用戶都來自一樣的瀏覽器和作業系統。 server端可能會使大量訪問的目的失效。 因此除了串改 ip外,最好也修改 user-agent,使 server端無法有效辨識。

Tor的部分可以參考之前分享的 "使用 Tor進行網路爬蟲" 和 "多開 Tor client"。
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>>
>>> opts = Options()
>>> 
>>> opts.add_argument("--incognito")  # 使用無痕模式。用 selenium開瀏覽器已經很乾淨了,但疑心病重的可以用一下
>>> 
>>> proxy = "socks5://localhost:9050"
>>> opts.add_argument('--proxy-server={}'.format(proxy))  # 讓 selenium透過 tor訪問 internet
>>> 
>>> ua = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
>>> opts.add_argument("user-agent={}".format(ua))         # 使用偽造的 user-agent
>>> 
>>> driver = webdriver.Chrome(executable_path='/path/to/your/chromedriver',chrome_options=opts)
>>> # 使用 selenium開啟瀏覽器
>>> 
>>> driver.get('http://gs.statcounter.com/detect')  # 訪問 statcounter來確認目前瀏覽器的 user-agent
ChromeDriver可以到 "這裡" 下載。

執行後,畫面如下
我使用的作業系統是 MacOS,瀏覽器使用 Chrome,但 server端誤認為 Windows 10和 FireFox瀏覽器,說明偽造成功了。

user-agent可以透過 Python的 package "fake-useragent" 來產生。雖然有在更新,但產生出的 user-agent大多都有點舊,導致 server容易誤以為瀏覽器太舊,要求更新而無法瀏覽,也提升了被辨識的可能(都很舊)。

最近換個方向跑去 node的陣營找,找到了一個不錯的套件也叫 "fake-useragent"。
$ npm init                    # 初始化,建立 package.json
  ...
$ npm install fake-useragent  # 安裝 fake-useragent
$ node                        # 啟用 node shell
> const fakeUa = require('fake-useragent');  // import fake-useragent
undefined
> console.log(fakeUa());  // 請求 user-agent
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
undefined
但其實到套件內部會發現
/* ./node_modules/fake-useragent/index.js */

"use strict";

var UAs = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
  "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
  "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0",
  ...

這個 package是搜集了大量的 user-agent放進 package中,所以使用時要注意 user-agent會不會太舊、更新頻率等。
如果要大量使用 user-agent的話,可以把它複製出來使用。

留言

  1. 用TOR 連去google抓資料
    仍會視為機器人,請問是為什麼?

    回覆刪除
    回覆
    1. 洋蔥網路中,會有人主動提供自己的 IP作為洋蔥網路出口的端點。洋蔥網路的用戶數量基本上不會小於出口數量 。洋蔥網路畢竟是匿名的,難免會有用戶會有濫用行為,因此作為端口的 IP 被多數用戶連入 Google加上少數濫用行為,容易被 Google判定該 IP是有問題的,才會驗證是不是機器人。若不是一定要使用 Google的話,可以嘗試使用 Bing或 DuckDuckGo來試試。

      刪除
  2. 你好,請問如何利用selenium進行google相關網頁的自動登入?


    目前程式並無添加user-agent & IP 相關的附註。做自動登入時因為google預設兩段式登入的緣故,輸入完帳號按"繼續"後,接跳出目前無法登入帳戶,這個瀏覽器或應用程式可能有安全疑慮的通知。

    回覆刪除
    回覆
    1. user-agent & IP在這篇文章上就是為了隱藏身分,如果 Google登入了就功虧一簣了。若是想在 Selenium上登入,簡單粗暴的方式就是進入 Google帳號管理,把風險的敏感度降低。網上也建議使用非 Chrome以外的 driver來進行爬蟲。

      刪除
  3. 請問一下 上面您可以偽造了 OS 的資料. 所以 OS 的資料如果是 "" unknown 也是偽造 ?

    回覆刪除
    回覆
    1. 現在平台非常多,有時認不出來感覺也是挺合理的。但為了加強身份的可靠度,建議是替換成多數人會使用的OS。

      刪除

張貼留言