乐趣区

关于python:0基础学爬虫爬虫基础之代理的基本使用

大数据时代,各行各业对数据采集的需要日益增多,网络爬虫的使用也更为宽泛,越来越多的人开始学习网络爬虫这项技术,K 哥爬虫此前曾经推出不少爬虫进阶、逆向相干文章,为实现从易到难全方位笼罩,特设【0 根底学爬虫】专栏,帮忙小白疾速入门爬虫,本期为代理的根本应用。

代理概述

ip 地址是一个惟一地址,它用于标识互联网或本地网络设施,而代理 ip 又名代理服务器(Proxy Server),它的次要作用是作为一个中间层,代替用户与指标服务器进行通信。客户端与服务端进行交互时,与抓包工具一样,客户端发动的申请会通过代理服务器,通过代理服务器进行转发,当服务端接管到申请时,获取到的 ip 就是代理服务器的 ip 地址,这样就实现了实在 ip 的暗藏。

代理作用

代理 ip 的利用范畴十分宽泛,它的次要利用场景有:

冲破拜访限度: 局部网站会依据用户的 IP 地址进行拜访限度,应用代理 ip 能够绕过这些限度。

爬虫数据采集: 在批量数据采集中,爬虫程序须要应用到代理 ip 来避免被指标网站封禁或限度拜访。

进步网络安全性: 通过应用代理 IP 暗藏实在 IP 地址,能够避免黑客攻击和网络钓鱼等平安威逼。

代理分类

代理能够通过不同的特色进行分类,如匿名度、反对协定、地理位置、应用形式、品质等级等。这里次要介绍前三种。

依据匿名度分类

高匿名代理: 高匿名代理也叫做齐全匿名代理,它齐全暗藏了客户端的实在 ip 地址与其它信息,服务端无奈得悉申请来自于哪个客户端,只能获取到代理服务器的 ip 地址。该类型代理速度与稳定性高,然而通过须要付费。

一般匿名代理: 一般匿名代理也叫做匿名代理,它会暗藏客户端的 ip 地址,然而会裸露客户端的其它申请信息,如 HTTP 申请头信息,服务端能够辨认到申请来自代理服务端,但无奈追踪到客户端实在 ip。该类型代理速度较慢,稳定性较低。

通明代理: 通明代理也叫做一般代理,它不会暗藏客户端的 ip 地址与其它申请信息,服务端能够获取到发动申请的实在 ip,因而通明代理没有太大的理论作用,应用较少。

依据反对协定分类

HTTP 代理: HTTP 代理通过 http 协定来转发申请数据包,次要用于申请 web 网页,用来拜访受限制的网站,进步用户的匿名性。

HTTPS 代理: HTTPS 代理通过 https 协定来转发申请数据包,它能够帮忙客户端与服务端建设平安的通信通道,次要用与加密隐衷数据的传输。

FTP 代理: FTP 代理用于转发 FTP 申请,次要用于数据的上传、下载、缓存。它能够提供拜访 FTP 服务器的匿名性、访问控制、速度优化等性能。

SOCKS 代理: SOCKS 代理能够转发任意类型的网络申请,它反对多种身份验证,是一种通用性的网络代理。

依据地理位置分类

分为国外代理与国内代理

代理的应用

上篇文章中,咱们讲到了 urllib、requests、httpx、aiohttp、websocket 这五个网络申请库的应用,这里咱们会介绍如何在应用这些网络申请库时设置代理。

在下文中应用到的代理由 快代理 提供。

通常购买代理后平台会提供 IP 地址、端口号、账号、明码,在代码中设置代理时,代理数据类型通常为字典类型。格局如下:

一般代理格局:

proxy = {'https://': 'http://%(ip)s:%(port)s' % {"ip":ip,"port":port},
    'http://': 'http://%(ip)s:%(port)s' % {"ip":ip,"port":port}
    }

应用账号密码认证形式的格局为:

proxy = {"http": "http://%(user)s:%(pwd)s@%(ip)s:%(port)s/" % {"user": username, "pwd": password, "ip":ip,"port":port},
    "https": "http://%(user)s:%(pwd)s@%(ip)s:%(port)s/" % {"user": username, "pwd": password, "ip":ip,"port":port}
}

如:

proxy = {
    'https': 'http://112.74.202.247:16816',
    'http': 'http://112.74.202.247:16816'
}

urllib

urllib 设置代理须要应用到 ProxyHandler 对象,首先创立一个 ProxyHandler 对象,而后将代理服务器的地址与端口号传给它。而后应用 build_opener 办法创立一个 Opener 对象,将创立好的 ProxyHandler 传入 Opener。最初应用 install_opener 办法将 Opener 对象装置为全局 Opener,这样在之后的所有 urlopen 申请中都会应用这个 Opener 对象。

import urllib.request


proxy = {
    'https': 'http://112.74.202.247:16816',
    'http': 'http://112.74.202.247:16816'
}  #代理地址

proxy_handler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)

response = urllib.request.urlopen('http://httpbin.org/get').read().decode('utf-8')

print(response)
# xxx"origin": "112.74.202.247"xxx

设置代理申请网页后,能够看到响应信息中 origin 的值曾经变成咱们设置的代理 ip 值了。这样就代表代理 ip 设置胜利了,网页服务端获取到的 ip 是代理服务器的 ip 地址。

requests

应用 urllib 设置代理还是比拟繁琐的,这也是 urllib 库的毛病。而在 requests 中设置代理非常简单,Request 对象中提供了一个参数来设置代理。

import requests

proxy = {
    'https': 'http://112.74.202.247:16816',
    'http': 'http://112.74.202.247:16816'
}
url = 'http://httpbin.org/get'

response = requests.get(url,proxies=proxy)

print(response.json())
#xxx'origin': '112.74.202.247'xxx

httpx

httpx 性能、用法与 requests 基本一致,设置形式也是一样的,惟一的区别就在与代理的键名。

import httpx

proxy = {
    'https://': 'http://112.74.202.247:16816',
    'http://': 'http://112.74.202.247:16816'
}
url = 'http://httpbin.org/get'

response = httpx.get(url,proxies=proxy)

print(response.json())
#xxx'origin': '112.74.202.247'xxx

proxy 代理字典中的键名由 http、https 更改为 http:// 和 https://。

应用 httpx Client 设置代理的形式也一样,通过 proxies 参数进行传递。

import httpx

proxy = {
    'https://': 'http://112.74.202.247:16816',
    'http://': 'http://112.74.202.247:16816'
}

with httpx.Client(proxies=proxy) as client:
    response = client.get('https://httpbin.org/get')
    
print(response.json())
#xxx'origin': '112.74.202.247'xxx

aiohttp

aiohttp 中设置代理与其它库有所区别,代理格局为字符串模式,通过 proxy 参数进行传递。

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://httpbin.org/get',proxy=proxy) as response:
            print(await response.json()) ##xxx'origin': '112.74.202.247'xxx
            
if __name__ == '__main__':
    
    proxy = "http://112.74.202.247:16816"
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

websocket

websocket 设置代理有两种形式:

第一种

from websocket import WebSocketApp

def on_message(ws, message):  #接管到音讯时执行
    print(message)
    
def on_open(ws):  #开启连贯时执行
    ws.send("Hello, WebSocket!")  #发送信息
    
if __name__ == "__main__":
    proxies = {
        "http_proxy_host": "112.74.202.247",
        "http_proxy_port": 16816,
    }
    
    ws = WebSocketApp("ws://echo.websocket.org/",on_message=on_message)
    ws.on_open = on_open
    ws.run_forever(**proxies)

第二种

ws = WebSocketApp("ws://echo.websocket.org/",http_proxy_host="112.74.202.247",http_proxy_port=16816)

总结

在爬虫程序开发中,应用代理是十分重要的。不论是大规模批量采集还是简略的爬虫脚本,应用代理都能够减少程序的稳定性,前提是应用的优质代理,优质代理能够帮忙开发者解决很多问题,是爬虫开发者必须学会应用的一种工具。

退出移动版