node 爬蟲之手把手實現隨機UA、代理池

雖然幾年前有多多少少有做過一些 python 的 node 的,但真要用的時候又常用啥都想不起來,又得重新花時間去網上 copy 一下。

ps: 我畢竟不是那種隨手就能寫出來的人。

好吧,這次要用到,那就將就寫點東西記錄一下,爭取下次要用的時候或者大家要用的時候,直接 copy 或 clone 下來即可。

內容可能比較幹,但都是經過反覆測試過的,理論上直接複製粘貼一把梭即可。


正文從這裏開始:

spider-proxy

這個項目使用 node 實現了隨機應用代理, UA信息來請求接口的 demo, 並介紹瞭如何搭建代理池等功能.

npm i
npm run dev

如何實現代理

axios

目前 axios 有一個 bug 導致自帶的 proxy 方式無效, 好在這可以使用一個第三方庫 https-proxy-agent 或 node-tunnel 解決

你也可能隨機從公用示例獲取一個 http://demo.spiderpy.cn/get/?type=https

const axios = require('axios').default
const http = axios.create({
  baseURL: 'https://httpbin.org/',
  proxy: false,
})

// 由於很多接口都要走代理, 所以應該在攔截器裏應用
http.interceptors.request.use(async (config) => {
  // 這裏可以異步通過 api 去請求最新的代理服務器配置
  // 127.0.0.1:1080 是你的代理服務器的 ip 和端口, 由於我本地搭建了一個, 所以我使用我本地的測試
  config.httpsAgent = await new require('https-proxy-agent')(`http://127.0.0.1:1080`)
  return config
}, (err) => Promise.reject(err))
http.interceptors.response.use((res) => res.data, (err) => Promise.reject(err))

new Promise(async () => {
  const data = await http.get(`/ip`).catch((err) => console.log(String(err)))
  // 如果這個地方返回了你的代理 ip 的地址, 則表示成功應用了代理
  console.log(`data`, data)
})

如何實現隨機 UA

user-agents 表示訪問的客戶端瀏覽器信息. 我們要找常見的那些, 這樣能更好的讓機器人融入人類的大洪流中, 哈哈哈!

一些常用的 UA 像這樣:

const userAgents = [
  'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20',
  'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
  '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) ,Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
  'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
  'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
  'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
  'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre',
  'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52',
  'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
  'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)',
  'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
  'Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6',
  'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
  'Opera/9.25 (Windows NT 5.1; U; en), Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
];

module.exports = userAgents;

然後再隨機從中選擇一條:

import userAgents from '../src/userAgent';
let userAgent = userAgents[parseInt(Math.random() * userAgents.length)];

感覺很完美. 其實還要複製粘貼, 寫個隨機還挺麻煩的呢!

我們可以把上面兩端代碼優化成一行:

(new (require('user-agents'))).data.userAgent

這樣就顯得優美了許多.

User-Agents 是一個 JavaScript 包,用於根據它們在市場上的使用頻率生成隨機用戶代理。每天都會自動發佈新版本的軟件包,因此數據始終是最新的。生成的數據包括難以找到的瀏覽器指紋屬性,強大的過濾功能允許您限制生成的用戶代理以滿足您的確切需求。

實現代理池

爬蟲代理IP池項目, 主要功能爲定時採集網上發佈的免費代理驗證入庫, 定時驗證入庫的代理保證代理的可用性, 提供API和CLI兩種使用方式. 同時你也可以擴展代理源以增加代理池IP的質量和數量.

本代理池使用的是 https://github.com/jhao104/proxy_pool .

安裝 docker

uname -r
yum update
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum -y install docker-ce-20.10.12-3.el7
systemctl start docker
systemctl enable docker
docker version

安裝 redis

yum -y install epel-release-7-14
yum -y install redis-3.2.12-2.el7
systemctl start redis

# 配置 redis
  # 修改密碼 foobared 爲 jdbjdkojbk
  sed -i 's/# requirepass foobared/requirepass jdbjdkojbk/' /etc/redis.conf
  # 修改端口號
  sed -i 's/^port 6379/port 6389/' /etc/redis.conf
  # 配置允許其他電腦鏈接
  sed -i 's/^bind 127.0.0.1/# bind 127.0.0.1/' /etc/redis.conf
  # 重啓 redis
  systemctl restart redis
  # 查看進程
  ps -ef | grep redis
  # 測試連接
  redis-cli -h 127.0.0.1 -p 6389 -a jdbjdkojbk

安裝代理池

docker pull jhao104/proxy_pool:2.4.0
# 注意
docker run -itd --env DB_CONN=redis://:jdbjdkojbk@10.0.8.10:6389/0 -p 5010:5010 jhao104/proxy_pool:2.4.0

其他

完整代碼我已經上傳到了 github 上:歡迎留爪~

卸載 redis

systemctl stop redis
yum remove redis
rm -rf /usr/local/bin/redis*
rm -rf /etc/redis.conf

參考

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