在一些网站服务中,除了对 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# 网页内容 current11current = ''1213try: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.text1920except 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寄存解析后的ip10ip_array = []1112# 创立解析对象13beau_soup = BeautifulSoup(current, 'html.parser')14# 获取所有的td标签15trs = beau_soup.find_all('tr')1617# 遍历提取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.text24 if regx_port.match(td.text):25 ip_port = ip_port + ':' + td.text26 if ip_port != '':27 ip_array.append(ip_port)2829# 爬取到的代理ip30print ip_array3132# 分装 ip和端口应用字典的模式保留33ip_dict_list = []34for ip in ip_array:35 ip_dict = {'http':ip}36 ip_dict_list.append(ip_dict)3738print 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 '以后代理:',proxy10 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 技术栈,材料获取、交换社区、干货分享,期待你的退出~