目录
[1. 什么是IP代理?](#1. 什么是IP代理?)
[2. 如何获取IP代理?](#2. 如何获取IP代理?)
[3. 如何使用IP代理?](#3. 如何使用IP代理?)
[4. 如何避免IP代理失效?](#4. 如何避免IP代理失效?)
[5. 代理IP的匿名性](#5. 代理IP的匿名性)
前言
在进行爬虫时,我们很容易会遇到反爬虫机制。网站的反爬虫机制可能会限制请求频率、锁定账号、封禁IP等。为了避免反爬虫机制的限制,我们可以使用IP代理来隐藏本机IP地址。本文将介绍如何在Python爬虫中使用IP代理以避免反爬虫机制。
一、IP代理的使用
1. 什么是IP代理?
IP代理是一种将本机IP地址隐藏起来,使用其他IP地址进行网络请求的技术。通过使用IP代理,我们可以避免被网站封禁IP或限制请求频率。
2. 如何获取IP代理?
我们可以通过以下几种方式获取IP代理:
- 购买付费IP代理:在网络上有许多提供付费IP代理服务的公司,我们可以通过购买这些服务来获取IP代理。
- 免费IP代理网站:在网络上也有许多提供免费IP代理的网站,我们可以通过这些网站来获取IP代理,例如:https://www.zdaye.com/。
- 自己搭建代理服务器:如果有一台自己的服务器或者VPS,我们可以通过搭建代理服务器来获取IP代理。
在获取IP代理时,需要注意代理IP的可用性。有些IP代理质量较差或者已经被封禁,需要通过检测代理IP可用性来筛选可用的代理IP。
3. 如何使用IP代理?
在Python爬虫中,我们一般使用requests库来进行网络请求。requests库提供了一个proxies参数,可以用来指定使用代理IP进行请求。proxies参数是一个字典,键为代理类型(http或https等),值为代理IP和端口号的字符串,格式为:{'http': 'http://xxx.xxx.xxx.xxx:xxxx', 'https': 'https://xxx.xxx.xxx.xxx:xxxx'}。下面是使用代理IP进行网络请求的示例代码:
python
import requests
url = 'http://www.baidu.com'
proxies = {
'http': 'http://xxx.xxx.xxx.xxx:xxxx',
'https': 'https://xxx.xxx.xxx.xxx:xxxx'
}
response = requests.get(url, proxies=proxies)
在这个示例代码中,我们使用requests库向百度发送了一个请求,并通过proxies参数指定使用代理IP进行请求。
4. 如何避免IP代理失效?
IP代理有时候会失效或者被封禁,这时候我们需要更换代理IP。下面是一些常用的避免IP代理失效的方法:
- 使用多个代理IP进行轮流使用。
- 在使用代理IP之前,先检测代理IP的可用性。
- 在使用代理IP时,限制请求频率,避免过于频繁的请求。
- 在使用代理IP时,尽量模拟人的行为,例如:使用代理IP进行登录时,需要先发送登录页面的请求,获取到登录所需要的参数,再发送登录请求。
5. 代理IP的匿名性
IP代理有不同的匿名性等级,分为透明、匿名和高匿,其中高匿的匿名性最高。代理IP提供商一般会说明代理IP的匿名性等级。在使用代理IP时,需要根据需求选择不同匿名性等级的代理IP。
二、代码示例
下面给出一个完整的Python爬虫示例代码,包括如何获取IP代理、如何使用IP代理以及如何避免IP代理失效。这个示例代码通过爬取豆瓣电影Top250页面来演示如何使用IP代理。
python
import requests
from bs4 import BeautifulSoup
import random
import time
import threading
# 获取代理IP
def get_proxies():
url = 'https://www.zdaye.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.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
proxy_list = []
for tr in soup.find_all('tr')[1:]:
tds = tr.find_all('td')
ip = tds[1].text.strip()
port = tds[2].text.strip()
protocol = tds[5].text.strip().lower()
proxy = {'protocol': protocol, 'ip': ip, 'port': port}
proxy_list.append(proxy)
return proxy_list
# 检测代理IP可用性
def check_proxy(proxy, protocol='http'):
proxies = {protocol: protocol + '://' + proxy['ip'] + ':' + proxy['port']}
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.3'}
try:
response = requests.get('http://www.baidu.com', headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
print(proxy, 'is OK')
return True
else:
print(proxy, 'is not OK')
return False
except Exception as e:
print(proxy, 'is not OK', e)
return False
# 获取页面HTML
def get_html(url, proxies=None):
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.3'}
try:
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except Exception as e:
print(e)
return None
# 获取电影信息
def get_movie_info(html):
soup = BeautifulSoup(html, 'html.parser')
movie_list = soup.find_all('div', class_='info')
for movie in movie_list:
title = movie.find('span', class_='title').text.strip()
rating = movie.find('span', class_='rating_num').text.strip()
print(title, rating)
return len(movie_list)
# 主函数
def main():
# 获取代理IP列表
proxy_list = get_proxies()
# 筛选可用代理IP
usable_proxies = []
for proxy in proxy_list:
if check_proxy(proxy):
usable_proxies.append(proxy)
# 如果可用代理IP为空,则退出程序
if len(usable_proxies) == 0:
print('No usable proxies')
return
# 循环使用代理IP爬取页面
url = 'https://movie.douban.com/top250'
count = 0
while count < 5:
# 随机选择一个可用的代理IP
proxy = random.choice(usable_proxies)
# 获取页面HTML
html = get_html(url, proxies={proxy['protocol']: proxy['protocol'] + '://' + proxy['ip'] + ':' + proxy['port']})
# 如果获取页面HTML失败,则更换代理IP
while not html:
print(f'{proxy} failed, try another proxy')
usable_proxies.remove(proxy)
if len(usable_proxies) == 0:
print('No usable proxies')
return
proxy = random.choice(usable_proxies)
html = get_html(url, proxies={proxy['protocol']: proxy['protocol'] + '://' + proxy['ip'] + ':' + proxy['port']})
# 解析页面HTML
count += get_movie_info(html)
# 每隔5秒获取一次页面
time.sleep(5)
print('Done!')
if __name__ == '__main__':
main()
在这个示例代码中,首先使用get_proxies函数获取代理IP列表,然后使用check_proxy函数筛选出可用的代理IP,并保存到usable_proxies列表中。接着在循环中随机选择一个可用的代理IP,使用get_html函数获取页面HTML。如果获取页面HTML失败,则更换代理IP,直到获取成功。使用get_movie_info函数解析页面HTML,获取电影信息。每隔5秒获取一次页面,总计获取5次页面。
总结
在Python爬虫中使用IP代理可以避免反爬虫机制,通过获取代理IP并使用代理IP进行网络请求,从而隐藏本机IP地址,避免被网站封禁IP或限制请求频率。可以使用付费IP代理、免费IP代理网站或自己搭建代理服务器获取IP代理。在使用代理IP时,需要注意代理IP的可用性、匿名性等级以及避免IP代理失效的方法。使用IP代理可以有效提高爬虫的稳定性和可用性。