事由
前段时间搞爬虫项目,为了避免本地IP给锁掉,尝试了使用代理池,但貌似免费代理IP很多用不了,就很尴尬。刚好手头有一台云服务器,计划着搭建个代理IP,以便于在python中的requests库中使用proxies代理IP访问。正常的Python requests爬虫语法结构大致如下:
import requests
response=requests.get("http://www.baidu.com",proxies={"http://IP地址:端口号"})
print(response.status_code) // 查看响应状态
proxies这个参数是可以省略的(默认使用本地IP去访问网站),也就说,搭建好的代理IP或者代理池IP都可以添加到proxies参数中,将模拟使用该IP访问所需要爬取的网站,避免本地IP因访问过多而泄露隐私或被封锁IP。
Windows系统上常用的代理服务器搭建工具有Apache和ccproxy,前者是免费的,后者付费但有图形化界面。这里只做Apache24的代理IP搭建。(ccproxy我没能跑起来啊啊啊)因为IP隐私问题,我将使用虚拟机来复刻一遍搭建的过程,使用到的系统镜像是Windows Server 2012 R2。(镜像分享-百度云盘)
一、下载Apache24
阿帕奇官网可以下载到所需要的版本(Apache官网),打开该网址后,选择网页左上角的“Download!”;打开新页面后找到“Files for Microsoft Windows”;点击进入到“Downloading Apache for Windows”中选择“ApacheHaus”;在“Apache 2.4 Server Binaries”列表下找到自己心仪的版本,再点击版本号对应的“Dowload Locations”下的图标:,浏览器就会自动匹配合适的Apache配置文件压缩包。(本段落中蓝字部分可以直接跳转到对应页面的,但还是建议一步一步来,需要匹配系统识别)图示如下:
二、配置环境
接下来就是最关键的配置问题,涉及到防火墙、阿帕奇配置文件的修改及端口号开放问题。
1.解压文件包
先把上一步下载好的zip压缩包内的文件解压到自己喜欢的位置,我这里是直接放在桌面了,只要能记得住 Apache24 这个文件夹位置就行。
2.关闭防火墙
打开Windows系统下的cmd命令行,输入“net stop mpssvc”再回车,关闭防火墙后,输入“ipconfig”查看本机的IPv4地址,记下来就行。
3.修改httpd.conf
在 Apache24 文件夹下打开 conf 文件夹,就能找到 httpd.conf 这个配置文件了。通过修改该文件内的内容来实现代理IP的搭建。
鼠标右键 httpd.conf ,打开方式,用记事本编辑。
修改 Define SRVROOT " " 内容,在双引号内加入Apache24 文件夹路径(路径用的斜杠号是"/"而不是"\");Listen加上IPv4地址和8088端口作为代理开放代理(如192.168.121.140:8088);手动删除配置文件前的#号,启动代理服务的so文件(proxy相关服务和mod_slotmem_shm.so);在文件末尾添加以下内容:
ProxyRequests On
<Proxy *>
Require all granted
</Proxy>
AllowCONNECT 8080 808
具体内容:
三、启动代理服务
打开cmd后cd进入到 Apache24 目录下的 bin ,启动httpd.exe,第一次使用这个文件需要输入“httpd.exe -k install”。
cd C:\User\Administrator\Desktop\Apache24\bin
(httpd.exe -k install)
httpd.exe -k start
正常出现上图这样,小卡一下然后跳下一行,就是代理服务已经启动好了。如果要关闭代理IP,可以用“httpd.exe -k stop”,如下图:
接下来就可以,使用该IP地址所绑定的代理端口,尝试进行网络爬虫。
四、爬虫实践-代理IP效果
简单访问一下百度,看看能不能返回状态码。Python的代码(requests库)如下:
import requests
def load_page(url):
headers = {
"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0;"
"Windows NT 6.1; Trident / 5.0;"
}
proxy_list = [
{'http': 'http://175.178.223.138:8088'}
]
# 使用代理服务器发送GET请求,接收服务器返回的响应
# response = requests.get(url, headers=headers)
# return response.text
for per_ip in proxy_list.copy():
try:
response = requests.get(url, headers=headers, proxies=per_ip, timeout=5)
except:
print(f"IP地址:{per_ip['http']}无效")
proxy_list.remove(per_ip)
else:
print(f"IP地址:{per_ip['http']}有效") # 若IP有效则返回状态码
print("状态码为:" + str(response.status_code))
if __name__ == "__main__":
base_url = 'https://www.baidu.com'
load_page(base_url)
PS:httpd.exe -k install出现丢失VCRUNTIME140.dll问题
在执行安装httpd.exe命令有可能会显示下图缺组件(vc运行库)的情况:
这个并不好处理,需要直接进微软的C++文档下载对应的C++库,个人推荐的Windows Server 2012 R2 VC下载链接:Visual Studio 2012 x64,同时需要打开Windows更新(控制面版-系统和安全-Windows更新)和Microsoft.Net.Framework。(仅供参考,因为我的虚拟机也出现这种情况,但云服务器没有,跑去下载后发现还是安装不了)
所以,有更好的解决方法,直接去下载一个vcruntime.dll,放在Windows系统中的C:\Windows\SysWOW64中,再运行一次httpd.exe -k install。如果又出现了缺某某某.dll的情况且下载不到的情况下,可以使用360管家中的dll修复。当然,可以把别人能用的一整个SysWOW64文件夹拷贝过去替换掉本地的SysWOW64(我的虚拟机遇到这个问题就是这样解决的。。。)SysWOW64文件夹分享-百度云盘(里面也有我用的vcruntime.dll)
-- THE END --文章来源:https://uudwc.com/A/pZzP
文章来源地址https://uudwc.com/A/pZzP