python爬虫如何设置代理ip

1. 什么是代理IP?

代理IP(Proxy)是一种服务器,它充当客户端和其他服务器之间的中间人,客户端发送请求时,代理服务器先把请求发送给目标服务器,然后把目标服务器的响应返回给客户端,客户端看不到目标服务器的IP地址,而是只能看到代理服务器的IP地址。

1.1 代理IP的使用场景

代理IP应用广泛,它可以用于以下几种情况:

匿名访问网页:如果我们想要访问某些网站,但我们的IP地址已经被该网站加入了黑名单,我们可以通过使用代理IP来隐藏自己的真实身份。这时候我们可以通过设置代理IP来访问该网站。

提高爬虫效率:在爬取某些网站的过程中,我们需要发送大量的请求,如果不使用代理IP,我们的IP地址容易被该网站发现并加入黑名单。使用代理IP可以有效地降低被屏蔽的风险,同时也可以提高爬虫的效率。

隐藏真实IP地址:有些企业或者组织为了安全考虑,会对外隐藏真实IP地址,使用代理IP可以达到这一目的。

2. Python爬虫如何设置代理IP?

在Python中使用代理IP非常简单,我们只需要在建立请求的时候添加一行代码即可:

import requests

proxies = {'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888'}

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

其中,'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888'表示要使用的代理IP地址和端口号,可以根据自己的需要进行设置。

2.1 如何获取代理IP?

获取代理IP的方式有很多种,例如从免费代理网站上爬取,或者从收费代理IP服务商购买等。这里我们以免费代理网站为例进行讲解。

推荐使用的免费代理网站有:https://www.xicidaili.com/、http://www.goubanjia.com/、https://www.kuaidaili.com/ 等。

2.2 如何筛选可用的代理IP?

虽然免费代理网站提供了大量的代理IP,但是其中不少已经失效或者无法使用。因此,在使用代理IP之前,我们需要对其进行筛选,并找出可用的代理IP。

在Python中,我们可以使用requests库来检测代理IP的可用性,代码实现如下:

import requests

def check_proxy(proxy):

try:

rsp = requests.get('http://httpbin.org/ip', proxies=proxy, timeout=5)

return rsp.json().get('origin').split(',')[-1].strip()

except:

return False

其中,check_proxy函数用于检测一个代理IP是否可用。如果可用,则返回代理IP地址;如果不可用,则返回False。

下面我们来编写一个完整的代理IP测试程序:

import requests

def check_proxy(proxy):

try:

rsp = requests.get('http://httpbin.org/ip', proxies=proxy, timeout=5)

return rsp.json().get('origin').split(',')[-1].strip()

except:

return False

def get_proxy_list():

proxy_list = []

url = 'https://www.xicidaili.com/'

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}

rsp = requests.get(url, headers=headers)

if rsp.status_code == 200:

html = rsp.text

soup = BeautifulSoup(html, 'lxml')

tr_list = soup.select('#ip_list tr')

for tr in tr_list[1:]:

td_list = tr.select('td')

if td_list:

ip = td_list[1].text

port = td_list[2].text

protocol = td_list[5].text.lower()

proxy = {'http': 'http://{}:{}'.format(ip, port), 'https': 'https://{}:{}'.format(ip, port),

'protocol': protocol}

proxy_list.append(proxy)

return proxy_list

def main():

proxy_list = get_proxy_list()

for proxy in proxy_list:

if check_proxy(proxy):

print(proxy)

if __name__ == '__main__':

main()

该程序用于爬取西刺免费代理IP网站,将爬取到的代理IP列表通过check_proxy函数进行可用性检测,最终输出可用的代理IP信息。

2.3 如何设置代理IP池?

在实际应用中,我们可能需要大量的代理IP进行爬取。这时候,我们就需要使用代理IP池,将所有可用的代理IP保存到池中,然后在每次请求时从代理IP池中随机选择一个代理IP。

代理IP池的实现比较简单,可以使用Python的列表或队列来保存所有可用的代理IP,然后在每次请求时随机选择一个代理IP即可。

下面是一个简单的代理IP池的实现:

import random

import requests

class ProxyPool:

def __init__(self):

self.proxy_list = []

self.index = 0

def add_proxy(self, proxy):

self.proxy_list.append(proxy)

def get_proxy(self):

if self.index == len(self.proxy_list):

self.index = 0

proxy = self.proxy_list[self.index]

self.index += 1

return proxy

def check_proxy(proxy):

try:

rsp = requests.get('http://httpbin.org/ip', proxies=proxy, timeout=5)

return rsp.json().get('origin').split(',')[-1].strip()

except:

return False

def get_proxy_list():

proxy_list = []

url = 'https://www.xicidaili.com/'

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}

rsp = requests.get(url, headers=headers)

if rsp.status_code == 200:

html = rsp.text

soup = BeautifulSoup(html, 'lxml')

tr_list = soup.select('#ip_list tr')

for tr in tr_list[1:]:

td_list = tr.select('td')

if td_list:

ip = td_list[1].text

port = td_list[2].text

protocol = td_list[5].text.lower()

proxy = {'http': 'http://{}:{}'.format(ip, port), 'https': 'https://{}:{}'.format(ip, port),

'protocol': protocol}

proxy_list.append(proxy)

return proxy_list

def main():

proxy_list = get_proxy_list()

proxy_pool = ProxyPool()

for proxy in proxy_list:

if check_proxy(proxy):

proxy_pool.add_proxy(proxy)

url = 'https://www.baidu.com/'

while True:

if not proxy_pool.proxy_list:

break

proxy = proxy_pool.get_proxy()

try:

rsp = requests.get(url, proxies=proxy, timeout=5)

print(rsp.text)

except:

continue

if __name__ == '__main__':

main()

该程序首先通过get_proxy_list函数获取所有可用的代理IP,然后将这些代理IP添加到代理IP池中。在实际使用中,我们可以不断地从代理IP池中随机选择一个代理IP进行访问,实现高效稳定的爬取工作。

3. 总结

本文主要介绍了Python爬虫如何设置代理IP。通过使用代理IP,我们可以隐藏自己的真实身份,提高爬虫效率,避免IP地址被封等问题。在实际应用中,我们可以通过筛选可用的代理IP,建立代理IP池等方式来实现高效稳定的爬取工作。

后端开发标签