————————————————————————————————————————
代理的作用与原理
代理服务器在写爬虫的时候会经常用到,主要作用有隐藏真实IP和提高访问速度等。其原理是这样一回事:形象地说,它是网络信息的中转站。在我们正常请求一个网站时,是发送了请求给Web服务器,Web服务器把响应传回给我们。如果设置了代理服务器,实际上就是在本机和服务器之间搭建了一个桥,此时本机不是直接向Web服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给Web服务器,接着由代理服务器再把Web服务器返回的响应转发给本机。这样我们同样可以正常访问网页,但这个过程中Web服务器识别出的真实IP就不再是我们本机的IP了,就成功实现了IP伪装,这就是代理的基本原理。
本地搭建代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ProxyHandler({
'http':'http://127.0.0.1:63342',
#'https':'https//127.0.0.1:63342'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
这里使用了ProxyHandler,其参数是一个字典,键名是协议类型(比如HTTP或者HTTPS等),键值是代理链接,可以添加多个代理。
然后,利用这个Handler及build_opener()方法构造一个Opener,之后发送请求即可。
一个小坑
上述代码中https参数部分容易被新手忽略,因为这里是本地代理服务器,而你的本地服务器并没有取得SSl证书,也就并没有https协议(https是http的一个安全版本)。如果上面并没有注释的话(http和https两个参数同时存在)就会报错“Tunnel connection failed: 404 Not Found”,如下:
注释掉https参数就可以,如:
#'https':'https//127.0.0.1:63342'
端口未打开报错
“[WinError 10061] 由于目标计算机积极拒绝,无法连接。”如下:
报错原因:9743端口在我们的电脑并没有开放(因每个人的电脑而异),以至于无法对外进行连接。
如何查询端口在个人电脑是否开放?
查看端口信息状态
补个知识
快捷键“win+R”打开cmd,键入
netstat -ano
然后可以得到以下图片的ip和端口信息:
LISTENING为电脑已经开放了的监听端口。
查看指定端口的占用情况:
以上面搭建的端口(63342)为例
netstat -aon|findstr "63342"
可以看到“63342”端口被进程号为18220的进程所占用,我们可以根据进程号查看多应的进程。
tasklist|findstr “18220”
可以看到是我刚刚进行连接的pycharm占用了改端口。
如果我们不想它占用就把改程序kill了以结束该进程:
taskkill /f /t /im pycharm64.exe
(我这里就不演示结束进程了,懒得再开了,哈哈哈!)
服务器代理
刚刚演示的是是用我的主机搭建本地服务器代理,现在我用的自己的服务器进行代理,在这我的服务器是已经取得了SSL证书了,即可以使用https参数。
一个程序员杂谈公众号,欢迎关注。
有不足之处望留言指正
——————END——————
Programmer:柘月十七