代码样例-Http隧道
本文档包含编程请求http隧道的代码样例,供开发者参考。
代码样例使用说明
- 代码样例不能直接运行,因为代码中的隧道服务器域名
XXX.XXX.com
、端口号15818
、用户名username
(隧道代理tid)、密码password
都是虚构的,请替换成您自己的信息。查看我的隧道信息>> - 隧道代理不需要使用API链接等其他方式获取代理IP,所有请求将在隧道服务器上进行更换IP并转发。
- 建议关闭HTTP协议的keep-alive功能,避免因连接复用导致隧道不能切换IP。
- 代码样例正常运行所需的运行环境和注意事项在样例末尾均有说明,使用前请仔细阅读。
- 使用代码样例过程中遇到问题请联系售后客服,我们会为您提供技术支持。
特别注意
以下代码样例均为基础样例,运行基础样例并不能保证成功爬取目标网站。目标网站通常具备反爬机制,比如跳转需要输入验证码的页面。
我们建议您在开发过程中基于基础样例进行如下改进:
- 合理控制对目标网站的请求频率,建议对同一网站1个代理IP每秒请求不超过1次;
- 发出的http请求尽可能带上完整的header信息。
Python3
requests
requests(推荐)
使用提示
- 基于requests的代码样例支持访问http,https网页,推荐使用
- requests不是python原生库,需要安装才能使用:
pip install requests
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用requests请求隧道服务器
请求http和https网页均适用
"""
import requests
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名密码方式
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},
"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "http": "http://%(proxy)s/" % {"proxy": tunnel},
# "https": "http://%(proxy)s/" % {"proxy": tunnel}
# }
# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"
# 使用隧道域名发送请求
response = requests.get(target_url, proxies=proxies)
# 获取页面内容
if response.status_code == 200:
print(response.text) # 请勿使用keep-alive复用连接(会导致隧道不能切换IP)
aiohttp
aiohttp
使用提示
- 基于aiohttp的代码样例支持访问http,https网页
- aiohttp不是python原生库,需要安装才能使用:
pip install aiohttp
- aiohttp只支持Python3.5及以上
- 如Windows系统使用aiohttp访问https网站抛出异常,在import asyncio后调用 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())即可解决。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用aiohttp请求代理服务器
请求http和https网页均适用
"""
import aiohttp
import asyncio
# asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) windows系统请求https网站报错时调用此方法
page_url = "https://dev.kdlapi.com/testproxy" # 要访问的目标网页
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名和密码方式
username = "username"
password = "password"
proxy_auth = aiohttp.BasicAuth(username, password)
async def fetch(session, url):
async with session.get(url, proxy="http://"+tunnel, proxy_auth=proxy_auth) as response:
return await response.text()
async def main():
# aiohttp默认使用严格的HTTPS协议检查。可以通过将ssl设置为False来放松认证检查
# async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
async with aiohttp.ClientSession() as session:
html = await fetch(session, page_url)
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
httpx
httpx
使用提示
- 基于httpx的代码样例支持访问http,https网页
- httpx不是python原生库,需要安装才能使用:
pip install httpx
- httpx运行环境要求 Python3.7+
- httpx暂时还不支持SOCKS代理
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用requests请求代理服务器
请求http和https网页均适用
"""
import httpx
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名和密码方式
username = "username"
password = "password"
proxy_url = "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
proxies = httpx.Proxy(
url=proxy_url
)
with httpx.Client(proxies=proxies) as client:
r = client.get('https://dev.kdlapi.com/testproxy')
print(r.text)
urllib
urllib
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用urllib请求隧道服务器
请求http和https网页均适用
"""
import urllib.request
import ssl
# 全局取消证书验证,避免访问https网页报错
ssl._create_default_https_context = ssl._create_unverified_context
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名密码方式
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},
"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "http": "http://%(proxy)s/" % {"proxy": tunnel},
# "https": "http://%(proxy)s/" % {"proxy": tunnel}
# }
# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"
# 使用隧道域名发送请求
proxy_support = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(proxy_support)
# urllib.request.install_opener(opener) 注意此处是全局设置代理,如用这种写法进程内之后的所有urllib请求都会使用代理
# response = urllib.request.urlopen(target_url)
response = opener.open(target_url)
# 获取页面内容
if response.code == 200:
print(response.read().decode('utf-8'))
socket
socket
使用提示
- 基于socket的代码样例支持访问http,https网页
- socks不是python原生库,需要安装才能使用:
pip install PySocks
- 使用socket发起http请求需要按http协议格式完整构造http request
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用socket请求隧道服务器
请求http和https网页均适用
"""
import socket
import socks # pip install PySocks
socks.set_default_proxy(socks.HTTP, addr='XXX.XXX.com', port=15818, username='username',password='password') # 设置代理类型为HTPP
# socks.set_default_proxy(socks.SOCKS5, addr='XXX.XXX.com', port=20818) # 设置代理类型为socks
socket.socket = socks.socksocket # 把代理添加到socket
def main():
sock = socket.socket()
sock.connect(('dev.kdlapi.com', 80)) # 连接
# 按照http协议格式完整构造http request
request = 'GET https://dev.kdlapi.com/testproxy \r\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36\r\n Connection: close' # 包含method, url, headers
response = b'' # 接收数据
sock.send(request.encode()) # 发送请求
chunk = sock.recv(1024) # 一次接收1024字节数据
while chunk: # 循环接收数据,若没有数据了说明已接收完
response += chunk
chunk = sock.recv(1024)
print(response.decode())
if __name__ == '__main__':
main()
pyppeteer
pyppeteer
使用提示
- 基于pyppeteer的代码样例支持访问http,https网页
- pyppeteer不是python原生库,需要安装才能使用:
pip install pyppeteer
- pyppeteer只支持Python3.5及以上
- pyppeteer是异步渲染网页,需要使用asyncio等库
#!/#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
请求http和https网页均适用
"""
import asyncio
from pyppeteer import launch
# 隧道服务器
proxy_raw = "XXX.XXX.com:15818"
def accounts():
# 用户名密码, 若已添加白名单则不需要添加
username = "username"
password = "password"
account = {"username": username, "password": password}
return account
async def main():
# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"
browser = await launch({'headless': False, 'args': ['--disable-infobars', '--proxy-server=' + proxy_raw]})
page = await browser.newPage()
await page.authenticate(accounts()) # 白名单方式,注释本行(需提前设置白名单)
await page.setViewport({'width': 1920, 'height': 1080})
# 使用代理IP发送请求
await page.goto(target_url)
await asyncio.sleep(209)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
playwright
playwright
使用提示
- 基于playwright的代码样例支持访问http,https网页
- playwright不是python原生库,需要安装才能使用:
pip install playwright
- 如果您的计算机上没有支持的浏览器,需要执行
playwright install
以安装依赖文件 - playwright只支持Python3.7及以上
- playwright支持同步或异步执行,以下为同步执行示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
请求http和https网页均适用
"""
from playwright.sync_api import sync_playwright
# 隧道服务器:端口
tunnel = "XXX.XXX.com:15818"
# 用户名密码方式
username = "username"
password = "password"
# 要访问的目标网页
url = "https://dev.kdlapi.com/testproxy"
proxies = {
"server": tunnel,
"username": username,
"password": password
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "server": tunnel,
# }
with sync_playwright() as playwright:
# headless=True 无头模式,不显示浏览器窗口
# browser = playwright.chromium.launch(channel="msedge", headless=True, proxy=proxies) # Microsoft Edge 浏览器
# browser = playwright.firefox.launch(headless=True, proxy=proxies) # Mozilla Firefox 浏览器
# browser = playwright.webkit.launch(headless=True, proxy=proxies) # WebKit 浏览器,如 Apple Safari
browser = playwright.chromium.launch(channel="chrome", headless=True, proxy=proxies) # Google Chrome 浏览器
context = browser.new_context()
page = context.new_page()
page.goto(url)
content = page.content()
print(content)
# other actions...
browser.close()
Python2
requests
requests(推荐)
使用提示
- 基于requests的代码样例支持访问http,https网页,推荐使用
- requests不是python原生库,需要安装才能使用:
pip install requests
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用requests请求隧道服务器
请求http和https网页均适用
"""
import requests
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名密码方式
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},
"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "http": "http://%(proxy)s/" % {"proxy": tunnel},
# "https": "http://%(proxy)s/" % {"proxy": tunnel}
# }
# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"
# 使用隧道域名发送请求
response = requests.get(target_url, proxies=proxies)
# 获取页面内容
if response.status_code == 200:
print response.text
urllib2
urllib2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
使用urllib2请求隧道服务器
请求http和https网页均适用
"""
import urllib2
import ssl
# 全局取消证书验证,避免访问https网页报错
ssl._create_default_https_context = ssl._create_unverified_context
# 隧道域名:端口号
tunnel = "XXX.XXX.com:15818"
# 用户名密码方式
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},
"https": "https://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "http": "http://%(proxy)s/" % {"proxy": tunnel},
# "https": "https://%(proxy)s/" % {"proxy": tunnel}
# }
# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"
# 使用隧道域名发