zoukankan      html  css  js  c++  java
  • 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
    

    参考

  • 相关阅读:
    [APIO2014]序列分割
    [HNOI2008]玩具装箱TOY
    [ZJOI2007]时态同步
    [FJOI2014]最短路径树问题
    [IOI2011]Race
    [国家集训队]聪聪可可
    矩阵加速递推
    Codeforces Round #669 题意及思路
    Codeforces Round #670 题意及思路
    Codeforces Round #671 题意及思路
  • 原文地址:https://www.cnblogs.com/daysme/p/15739504.html
Copyright © 2011-2022 走看看