#coding:utf-8
#获取代理,有很多免费代理,比如西刺:http://www.xicidaili.com/。比较靠谱的方法是购买付费代理。
# 如果本机有相关代理软件的话,软件一般会在本机创建HTTP 或SOCKS 代理服务,本机直接使用此代理也可以。
#CCproxy,它会在本地9743 端口上创建HTTP 代理服务,即代理为127.0.0.1:9743 ,
# 另外还会在9742 端口创建SOCKS 代理服务,即代理为127.0.0.l:9742 。
# 设置代理后测试的网址是:http://httpbin.org/get ,
# 其中origin宇段就是客户端的I P , 我们可以根据它来判断代理是否设置成功,即是否成功伪装了IP.
#首先,我们以最基础的urllib 为例,来看一下代理的设置方法,
#这里我们需要借助ProxyHandler 设置代理,参数是字典类型,键名为协议类型,键值是代理。注意,此处代理前面需要加上协议,
# 即http 或者https 。当请求的链接是http 协议的时候, Proxy Handler会调用http 代理。当请求的链接是ht阳协议的时候,
# 会调用https 代理。此处生效的代理是:http://127.0.0.1:9743。创建完ProxyHandler 对象之后,
# 我们需要利用build_opener ()方法传入该对象来创建一个Opener,这样就相当于此Opener 已经设置好代理了。
# 接下来直接调用Opener 对象的open()方法。运行结果是一个JSON ,它有一个字段origin,标明了客户端的IP 。
# 验证一下,此处的IP 确实为代理的lP ,并不是真实的IP 。这样我们就成功设置好代理,并可以隐藏真实IP。
from urllib.error import URLError
from urllib. request import ProxyHandler, build_opener
proxy = '127.0.0.1:9743'
proxy_handler = ProxyHandler({
'http':'http://' + proxy,
'https':'https://' + proxy
})
opener = build_opener(proxy_handler)
try:
response = opener.open('http://httpbin.org/get')
print(response.read().decode('utf 8'))
except URLError as e:
print(e.reason)
#如果遇到需要认证的代理,这里改变的只是proxy 变量,我们只需要在代理前面加入代理认证的用户名密码即可。
# username 是用户名, password 是密码,username 为foo ,密码为bar ,代理就是foo:bar@127.0.0.1:9743 。
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy = 'foo:bar@127.0.0.1:9743'
proxy_handler = ProxyHandler({
'http':'http://' + proxy,
'https':'https://' + proxy
})
opener = build_opener(proxy_handler)
try:
response = opener.open('http://httpbin.org/get')
print(response.read().decode('utf 8'))
except URLError as e:
print(e.reason)
#如果代理是SOCKS5 类型,需要一个socks 模块,pip3 install PySocks
import socks
import socket
from urllib import request
from urllib.error import URLError
socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
try:
response = request.urlopen('http://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
#requests,它只需要构造代理字典,然后通过proxies 参数即可,而不需要重新构建Opener其运行结果的叫也是代理的IP.
import requests
proxy = '127.0.0.1:9743'
proxies = {
'http':'http://' + proxy,
'https':'https://' + proxy
}
try:
response = requests.get('http://httpbin.org/get', proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
#如果代理需要认证,同样在代理的前面加上用户名密码即可代理的写法就变成如下所示:
#proxy= 'username:password@127.0.0.1:9743'
#如果需要使用SOCKS5 代理,我们需要额外安装一个模块,这个模块叫作requests[socks]
import requests
proxy = '127.0.0.1:1080'
proxies = {
'http' : 'socks5://' + proxy,
'https' : 'socks5://' + proxy
}
try:
response = requests.get('http://httpbin.org/get', proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
#还有一种设置方式,和urllib 中的方法相同,使用socks 模块,也需要像上文一样安装socks库。
# 使用这种方法也可以设置SOCKS5 代理,运行结果完全相同。相比第一种方法,此方法是全局设置。
import requests
import socks
import socket
socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
try:
response = requests.get ('http://httpbin.org/get')
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
#Selenium,包括两种方式: 一种是有界面浏览器,以Chrome为例;另一种是无界面浏览器,以PhantomJS 为例。
# Chrome,通过ChromeOptions来设置代理,在创建Chrome对象的时候用chrome_options 参数传递即可。
from selenium import webdriver
proxy = '127.0.0.1:9743'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
browser = webdriver. Chrome(chrome_options=chrome_options)
browser.get ('http://httpbin.org/get')
#chrome headless模式:
import time
from selenium import webdriver
"""使用无界面模式"""
option = webdriver.ChromeOptions()
option.add_argument('--headless') # 开启无界面模式
option.add_argument('--disable-gpu') # 禁用显卡
option.add_argument("--user-agent=Mozilla/5.0 HAHA") # 替换UA
proxy_str = '127.0.0.1 :9743'
option.add_argument('--proxy-server=https://{}'.format(proxy_str)) # 使用代理ip
browser = webdriver.Chrome(chrome_options=option)
browser.get('http://httpbin.org/get')
time.sleep(3)
print(browser.page_source)
browser.quit()
#如果代理是认证代理,在本地创建一个manifest.json 配置文{牛和background. 脚本来设置认证代理。
# 运行代码之后本地会生成一个proxy_auth_plugin.zip 文件来保存当前配置。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import zipfile
ip = '127.0.0.1'
port = 9743
username = 'foo'
password = 'bar'
manifest_json ="""
{
"version" : "1.0.0",
"manifest_version" : 2,
"name" : "Chrome Proxy",
"permissions" : [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"",
"webRequest",
"webRequestBlocking"
],
"background" : {
"scripts" : ["background.js"]
},
"minimum_chrome_version":"85.0.4183.83"
}
background_js = """
var config = {
mode :"fixed_servers",
rules: {
singleProxy: {
scheme : "http",
host : "%(ip)s",
port: %(port)s
}
}
}
chrome.proxy.settings.set({value:config, scope:"regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username :"%(username)s",
password :"%(password)s"
}
}
}
chrome.webRequest.onAuthRequired.addlistener(
callbackFn,
{urls : [""]},
["blocking"]
)
"""%{'ip' : ip, 'port' : port, 'username' : username, 'password' : password}
plugin_file = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_file, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument('--disable-gpu') # 禁用显卡
chrome_options.add_argument("--user-agent=Mozilla/5.0 HAHA") # 替换UA
chrome_options.add_argument('--no-sandbox')
chrome_options.add_extension(plugin_file)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')
#PhantomJS,代理设置方法可以借助service_args 参数,也就是命令行参数。
# 我们只需要使用service_args 参数,将命令行的一些参数定义为列表,在初始化的时候传递给PhantomJS 对象即可。
#不推荐,推荐使用headless
from selenium import webdriver
service_args = [
'--proxy = 127.0.0.1:9743',
'--proxy-type = http'
]
browser = webdriver.PhantomJS(executable_path='E:\\tools\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe' ,service_args=service_args)
browser.get('http://httpbin.org/get')
print(browser.page_source)
#如果需要认证,那么只需要再加入--proxy-auth选项即可
service_args = []
'--proxy = 127.0.0.1:9743',
'--proxy-type = http',
'--proxy-auth = username:password'
]