取消
最近搜索
清空历史

代码样例-Http隧道

本文档包含编程请求http隧道的代码样例,供开发者参考。

代码样例使用说明

  1. 代码样例不能直接运行,因为代码中的隧道服务器域名XXX.XXX.com、端口号15818、用户名username(隧道代理tid)、密码password都是虚构的,请替换成您自己的信息。查看我的隧道信息>>
  2. 隧道代理不需要使用API链接等其他方式获取代理IP,所有请求将在隧道服务器上进行更换IP并转发。
  3. 建议关闭HTTP协议的keep-alive功能,避免因连接复用导致隧道不能切换IP。
  4. 代码样例正常运行所需的运行环境和注意事项在样例末尾均有说明,使用前请仔细阅读。
  5. 使用代码样例过程中遇到问题请联系售后客服,我们会为您提供技术支持。

特别注意

以下代码样例均为基础样例,运行基础样例并不能保证成功爬取目标网站。目标网站通常具备反爬机制,比如跳转需要输入验证码的页面。

我们建议您在开发过程中基于基础样例进行如下改进:

  1. 合理控制对目标网站的请求频率,建议对同一网站1个代理IP每秒请求不超过1次;
  2. 发出的http请求尽可能带上完整的header信息。

Python3

requests

requests(推荐)

使用提示

  1. 基于requests的代码样例支持访问http,https网页,推荐使用
  2. requests不是python原生库,需要安装才能使用: pip install requests

代码下载:githubgitee

#!/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

使用提示

  1. 基于aiohttp的代码样例支持访问http,https网页
  2. aiohttp不是python原生库,需要安装才能使用: pip install aiohttp
  3. aiohttp只支持Python3.5及以上
  4. 如Windows系统使用aiohttp访问https网站抛出异常,在import asyncio后调用 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())即可解决。

代码下载:githubgitee

#!/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

使用提示

  1. 基于httpx的代码样例支持访问http,https网页
  2. httpx不是python原生库,需要安装才能使用: pip install httpx
  3. httpx运行环境要求 Python3.7+
  4. httpx暂时还不支持SOCKS代理

代码下载:githubgitee

#!/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

使用提示

  1. 基于urllib的代码样例同时支持访问http和https网页
  2. 运行环境要求 python3.x

代码下载:githubgitee

#!/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

使用提示

  1. 基于socket的代码样例支持访问http,https网页
  2. socks不是python原生库,需要安装才能使用: pip install PySocks
  3. 使用socket发起http请求需要按http协议格式完整构造http request

代码下载:githubgitee

#!/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

使用提示

  1. 基于pyppeteer的代码样例支持访问http,https网页
  2. pyppeteer不是python原生库,需要安装才能使用: pip install pyppeteer
  3. pyppeteer只支持Python3.5及以上
  4. pyppeteer是异步渲染网页,需要使用asyncio等库

代码下载:githubgitee

#!/#!/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

使用提示

  1. 基于playwright的代码样例支持访问http,https网页
  2. playwright不是python原生库,需要安装才能使用: pip install playwright
  3. 如果您的计算机上没有支持的浏览器,需要执行 playwright install 以安装依赖文件
  4. playwright只支持Python3.7及以上
  5. 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(推荐)

使用提示

  1. 基于requests的代码样例支持访问http,https网页,推荐使用
  2. requests不是python原生库,需要安装才能使用: pip install requests

代码下载:githubgitee

#!/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

使用提示

  1. 基于urllib2的代码样例同时支持访问http和https网页
  2. 运行环境要求 python2.6 / 2.7

代码下载:githubgitee

#!/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"

# 使用隧道域名发