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池等方式来实现高效稳定的爬取工作。