爬虫代理搭建与批量安装

代理对于搞爬虫的都不会陌生。公司有一批阿里云服务器用于分布式增量抓取,但对于一些封ip且只需进行一次全量抓取的数据源,或数据量级较小时,如果部署到爬虫集群上又太费事不值得。在网上找的免费代理可用性又太低,于是决定充分利用爬虫服务器的网络资源,在上面搭建自己的代理服务。

squid搭建与配置过程

文中使用的服务器是centos系统。

安装squid

使用yum直接安装即可yum install squid -y,安装完成后配置文件在/etc/squid/目录下。

配置basic认证

不得不说现在网络上扫描器实在太多了。笔者在一台机器上使用默认端口3128开启了squid服务,没有配置访问认证,测试结束后忘记关闭squid服务,过了几个小时就发现服务器负载太高,查看日志(/var/log/squid/)发现是已经被人扫到并用上了。

看来必需要配置访问认证了

1.生成passwords文件 在本机上执行

# 安装htpasswd工具 yum install httpd-tools -y # 生成passwords文件 htpasswd -c passwords authorized_user

2.输入两次密码后生成passwords文件

配置squid认证 将passwords文件上传到爬虫服务器/etc/squid/目录下,编辑/etc/squid/squid.conf文件,添加

 # test mypass
 auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
 auth_param basic realm proxy
 acl authenticated proxy_auth REQUIRED
 http_access allow authenticated

高匿配置

squid默认配置为透明代理,通过squid发送请求时squid会添加x-forwarded-for与via请求头,对方会发现你在使用代理,并根据这个得知你的真实ip,对于爬取数据必需要使用高匿代理,在配置文件中添加如下内容

# High Anonymity Configuration
via off
forwarded_for delete
request_header_access From deny all

批量安装

上面已经介绍了搭建与配置squid的步骤,下面介绍如何通过python批量安装。首先需要通过ssh连接到服务器,使用paramiko库可以通过ssh连接到远程服务器,建立连接后执行上面的命令就可以了,没什么可说的就直接贴代码了

ssh = SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    # 1\. 建立ssh连接
    ssh.connect(**server)
    logger.debug(">>> 1\. 建立ssh连接")
    # 2\. 安装squid
    stdin, stdout, stderr = ssh.exec_command('yum install squid -y')
    if stdout.channel.recv_exit_status() == 0:
        logger.debug(">>> 2\. 安装squid完成")
        with ssh.open_sftp() as sess:
            # 3\. 添加认证账号
            sess.put(AUTH_FILE, '/etc/squid/passwords')
            logger.debug(">>> 3\. 上传auth文件完成")
            # 4\. 更新squid.conf配置文件
            sess.put(SQUID_CONF, '/etc/squid/squid.conf')
            logger.debug(">>> 4\. 上传squid.conf完成")
        # 5\. systemctl start squid启动服务
        stdout = ssh.exec_command('systemctl start squid')[1]
        if stdout.channel.recv_exit_status() == 0:
            logger.debug('>>> 5\. squid服务已启动')
        else:
            logger.error("squid服务启动失败: " + ''.join(stdout.readlines()))
    else:
        logger.error("安装squid失败, ip: %s" % server['hostname'])
except Exception as err:
    logger.error('处理%s失败', server['hostname'])
ssh.close()

完整代码与squid.conf文件已上传到github,有需要的可以看看。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武培轩的专栏

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

当我们在浏览器的地址栏输入 www.cnblogs.com ,然后回车,回车到看到页面到底发生了什么呢? 域名解析 --> 发起TCP的3次握手 --> 建立T...

38570
来自专栏奔跑的蛙牛技术博客

数据库编程

某些jdbc的jar文件自动注册为jar文件,不支持的话需要手动注册,可以在java程序注册,可以通过命令行注入

12130
来自专栏黑白安全

8种DOS命令

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:...

23320
来自专栏小程序之家

如何实现小程序登录鉴权

为了方便用户使用小程序时,使用微信账号授权快速登录软件,微信小程序提供了相关的授权接口。小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快...

2.2K50
来自专栏hbbliyong

将Python脚本打包成可执行文件

本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstal...

24810
来自专栏Laoqi's Linux运维专列

Nginx+Tomcat实现动静分离、负载均衡

66650
来自专栏小狼的世界

利用Apache ab以及GNUPlot来进行Web测试

最近写了几个测试脚本,希望要观察使用PUT方式上传文件和使用POST方式上传文件,两者效率的差别。

11320
来自专栏Java技术交流群809340374

分布式锁的3种实现(数据库、缓存、Zookeeper)

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。

16500
来自专栏云计算教程系列

如何在CentOS 7上安装和配置mod_deflate

Mod_deflate是一个Apache模块,它允许在发送到客户端之前压缩Web服务器的输出。一旦您的网站内容的大小被压缩,其大小就会变小,客户端可以更快地下载...

21200
来自专栏程序员宝库

从 0 到 1 优雅的实现PHP多进程管理

_ | | _ __ __ _ _ __ _ _| |_ ___ | '_...

477110

扫码关注云+社区

领取腾讯云代金券