近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来获取代理IP,以及如何在爬虫中使用代理IP。
获取代理IP有两种方式:免费代理IP网站和收费代理IP服务。免费代理IP网站通常提供一些免费的代理IP,但是这些代理IP质量很不稳定,很容易被封禁或失效;收费代理IP服务则提供稳定、可靠的代理IP,但需要付费购买。由于本文主要介绍如何使用Python爬虫,因此我们将使用免费代理IP网站进行代理IP的获取。
具体来说,我们可以使用爬虫抓取一些免费代理IP网站上的代理IP列表。这里以站大爷免费代理IP为例,具体步骤如下:
下面是具体的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可以在requests库中指定proxies参数。proxies参数是一个字典类型,其中键名是协议(http或https),键值是代理IP及其端口号。例如,如果我们要使用代理IP地址为“1.2.3.4”,端口号为“5678”的代理服务器,则proxies参数应该为:
- proxies = {
- 'http': 'http://1.2.3.4:5678',
- 'https': 'https://1.2.3.4:5678'
- }
下面是一个简单的爬虫示例,使用代理IP爬取JD商品搜索页面:
- 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。