认识爬虫:怎么使用代理 IP 规避反爬虫以及使用爬虫获取更多可用的免费代理 IP?

204 阅读3分钟

在一些网站服务中,除了对 user-agent 的身份信息进行检测、也对客户端的 ip 地址做了限制,如果是同一个客户端访问此网站服务器的次数过多就会将其识别为爬虫,因而,限制其客户端 ip 的访问。这样的限制给我们的爬虫带来了麻烦,所以使用代理 ip 在爬虫中是非常有必要的。 要使用代理 ip 进行爬虫就面临两个问题,一是怎么使用、这个就相对简单,另一个是怎么获取这么多的代理 ip。获取代理 ip 可以去代理 ip 的站点购买、也有免费的代理 ip 站点,相对来说买的代理 ip 的质量更高一些,最后,我们可以使用爬虫技术来爬取一些可用的代理 ip 也就是下面主要说的内容。

1、怎么使用代理 ip 进行爬虫

和之前使用请求的形式一样,使用代理 ip 时在请求方法上面加入 proxies 的参数设置为 {"http":"代理ip"} 的字典参数值即可使用代理 ip 对服务器发起请求。

1response = requests.get(url=url, headers=headers, 
2                        params=params,proxies={"http":"117.136.27.43"})

2、怎么在其他站点上爬取可用的代理 ip

爬取代理 ip 的思路相对也比较简单,首先使用网页下载器下载相应的网页、然后提取网页中的所有的代理 ip,最后一步就是验证爬取的代理 ip 是否是可用,将验证通过的代理 ip 进行保存以供后续爬虫使用。

使用网页下载器下载网页

 1# -*- coding: UTF-8 -*-
 2
 3# 导入 requests 扩展库
 4import requests
 5# 导入解析库
 6from bs4 import BeautifulSoup
 7
 8# 初始化 url 地址(这里只获取首页展示的 ip)
 9url = 'http://www.66ip.cn'
10# 网页内容 current
11current = ''
12
13try:
14    headers = {
15        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
16    }
17    response = requests.get(url=url, timeout=5, headers=headers)
18    current = response.text
19
20except Exception:
21    print('网页下载失败 ···')

解析网页并提取代理 ip

 1# 导入 re 模块
 2import re
 3
 4# 创建正则表达式匹配ip地址
 5regx_ip = re.compile(r'^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
 6# 创建正则表达式匹配 port 地址
 7regx_port = re.compile(r'^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])$')
 8
 9# 定义初始化list存放解析后的ip
10ip_array = []
11
12# 创建解析对象
13beau_soup = BeautifulSoup(current, 'html.parser')
14# 获取所有的td标签
15trs = beau_soup.find_all('tr')
16
17# 遍历提取ip和端口
18for tr in trs:
19    tds = tr.find_all('td')
20    ip_port = ''
21    for td in tds:
22        if regx_ip.match(td.text):
23            ip_port = ip_port + 'http://' + td.text
24        if regx_port.match(td.text):
25            ip_port = ip_port + ':' + td.text
26    if ip_port != '':
27        ip_array.append(ip_port)
28
29# 爬取到的代理ip
30print ip_array
31
32# 分装 ip和端口使用字典的形式保存
33ip_dict_list = []
34for ip in ip_array:
35    ip_dict = {'http':ip}
36    ip_dict_list.append(ip_dict)
37
38print ip_dict_list

验证获取的代理 ip 是否可用

 1# 导入 random 扩展库、生成随机数
 2import random
 3# 验证代理ip
 4# 随机获取代理ip
 5proxy = ip_dict_list[random.randint(0,len(ip_dict_list) - 1)]
 6# 初始化验证成功的ip数组
 7ip_sucess_array = []
 8try:
 9    print '当前代理:',proxy
10    requests.get(url='http://www.baidu.com',headers=headers,timeout=3,proxies=proxy)
11    print '验证成功'
12    ip_sucess_array.append(proxy)
13except Exception,e:
14    print '验证失败'

更多精彩前往微信公众号【Python 集中营】,专注于 python 技术栈,资料获取、交流社区、干货分享,期待你的加入~

image.png