一、前言
近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来获取代理IP,以及如何在爬虫中使用代理IP。
二、获取代理IP
获取代理IP有两种方式:免费代理IP网站和收费代理IP服务。免费代理IP网站通常提供一些免费的代理IP,但是这些代理IP质量很不稳定,很容易被封禁或失效;收费代理IP服务则提供稳定、可靠的代理IP,但需要付费购买。由于本文主要介绍如何使用Python爬虫,因此我们将使用免费代理IP网站进行代理IP的获取。
具体来说,我们可以使用爬虫抓取一些免费代理IP网站上的代理IP列表。这里以站大爷免费代理IP为例,具体步骤如下:
- 打开站大爷代理网站(https://www.zdaye.com/),选择代理IP类型和位置,点击搜索按钮。
- 打开开发者工具(F12),进入网络选项卡,点击清空按钮,再点击"获取更多内容"按钮,观察是否有新的请求被发送。
- 发现一个名为"nn"的请求,请求的URL为https://www.zdaye.com/nn/1,其中"nn"表示高匿代理IP,而数字"1"表示页码。我们可以通过修改页码来获取不同页的代理IP。
- 在请求头中添加"User-Agent"字段,模拟浏览器请求,避免被服务器拒绝。
- 抓取响应中的HTML代码,使用正则表达式或BeautifulSoup库从中提取代理IP及其端口号。
下面是具体的Python代码实现:
python
import requests
from bs4 import BeautifulSoup
import re
# 抓取代理IP列表
def fetch_proxy_ips():
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'}
url_template = 'http://www.zdaye.com/nn/{}'
proxy_ips = []
for page in range(1, 11):
url = url_template.format(page)
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
trs = soup.find_all('tr')
for tr in trs[1:]:
tds = tr.find_all('td')
proxy_ip = tds[1].text + ':' + tds[2].text
proxy_ips.append(proxy_ip)
return proxy_ips
# 测试代理IP是否可用
def test_proxy_ip(proxy_ip):
url = 'http://httpbin.org/ip'
proxies = {
'http': 'http://' + proxy_ip,
'https': 'https://' + proxy_ip
}
try:
resp = requests.get(url, proxies=proxies, timeout=5)
resp.raise_for_status()
return True
except:
return False
# 获取可用的代理IP
def get_valid_proxy_ips():
proxy_ips = fetch_proxy_ips()
valid_proxy_ips = []
for proxy_ip in proxy_ips:
if test_proxy_ip(proxy_ip):
valid_proxy_ips.append(proxy_ip)
return valid_proxy_ips
print(get_valid_proxy_ips())
在上面的代码中,我们首先使用fetch_proxy_ips()函数抓取西刺代理网站上的前10页高匿代理IP列表,然后使用test_proxy_ip()函数测试每个代理IP是否可用(测试URL为http://httpbin.org/ip),最后使用get_valid_proxy_ips()函数返回可用的代理IP列表。
三、使用代理IP
使用代理IP可以在requests库中指定proxies参数。proxies参数是一个字典类型,其中键名是协议(http或https),键值是代理IP及其端口号。例如,如果我们要使用代理IP地址为"1.2.3.4",端口号为"5678"的代理服务器,则proxies参数应该为:
python
proxies = {
'http': 'http://1.2.3.4:5678',
'https': 'https://1.2.3.4:5678'
}
下面是一个简单的爬虫示例,使用代理IP爬取JD商品搜索页面:
python
import requests
# 使用代理IP爬取京东商品搜索页面
def crawl_jd_goods(query, proxy_ip):
url_template = 'https://search.jd.com/Search?keyword={}&enc=utf-8&page={}'
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'}
proxies = {
'http': 'http://' + proxy_ip,
'https': 'https://' + proxy_ip
}
for page in range(1, 6):
url = url_template.format(query, page)
resp = requests.get(url, headers=headers, proxies=proxies)
print(resp.status_code)
print(resp.text)
# 获取可用的代理IP
proxy_ips = get_valid_proxy_ips()
# 使用第一个可用的代理IP爬取京东商品搜索页面
query = 'Python编程'
proxy_ip = proxy_ips[0]
crawl_jd_goods(query, proxy_ip)
在上面的代码中,我们首先获取可用的代理IP列表,然后使用第一个可用的代理IP爬取京东商品搜索页面(搜索关键字为"Python编程")。
四、总结
需要注意的是,代理IP并不是万能的,在一些反爬虫机制非常强大的网站上,即使使用代理IP也很容易被封禁。此外,一些代理IP质量较差,访问速度较慢,甚至会返回错误响应。因此,在实际使用中需要根据具体情况选择可用的代理IP。