当前位置: 首页 > 后端技术 > Python

认识爬虫:如何使用代理IP避开反爬虫,利用爬虫获取更多可用的免费代理IP?

时间:2023-03-26 17:02:49 Python

在一些网站服务中,除了检测user-agent的身份信息外,还会限制客户端的IP地址。如果同一个客户端访问网站服务器的次数过多,就会被识别为爬虫,因此,限制访问其客户端ip。这样的限制给我们的爬虫带来了麻烦,所以在爬虫中使用代理ip是非常有必要的。使用代理ip进行爬取,有两个问题。一是如何使用,比较简单,二是如何获取这么多代理ip。获取代理ip可以去代理ip网站购买,也有免费代理ip的网站。相对来说,购买的代理ip质量更高。最后,我们可以使用爬虫技术来爬取一些可用的代理ip,这就是下面主要说的。1、如何使用代理ip进行爬取,和前面的请求方式一样。使用代理ip时,在request方法中加入proxies的参数,设置为{"http":"proxyip"}的字典参数值,即可使用代理ip对服务器发起请求。1response=requests.get(url=url,headers=headers,2params=params,proxies={"http":"117.136.27.43"})2.如何抓取其他网站可用的代理ip抓取代理ip思路是比较简单。首先使用网页下载器下载对应的网页,然后提取网页中所有的代理ip。最后一步是验证爬取到的代理ip是否可用,并将验证后的代理ip保存起来,以备后用。后续爬虫使用。使用网页下载器下载网页1#-*-coding:UTF-8-*-23#导入requests扩展库4importrequests5#导入分析库6frombs4importBeautifulSoup78#初始化url地址(这里只获取首页显示的那个ip)9url='http://www.66ip.cn'10#webcontentcurrent11current=''1213try:14headers={15'User-Agent':'Mozilla/5.0(WindowsNT6.3;WOW64;rv:43.0)Gecko/20100101Firefox/43.0'16}17response=requests.get(url=url,timeout=5,headers=headers)18current=response.text1920exceptException:21print('网页下载失败...')解析网页并提取代理ip1#importremodule2importre34#创建正则表达式匹配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#创建正则表达式匹配端口地址7regx_port=re.compile(r'^([0-9]|[1-9]d{1,3}|[1-5]d{4}|6[0-5]{2}[0-3][0-5])$')89#定义初始化ionlisttostoreparsedip10ip_array=[]1112#创建解析对象13beau_soup=BeautifulSoup(current,'html.parser')14#获取所有td标签15trs=beau_soup.find_all('tr')1617#遍历提取ip和port18fortrintrs:19tds=tr.find_all('td')20ip_port=''21f或tdintds:22ifregx_ip.match(td.text):23ip_port=ip_port+'http://'+td.text24ifregx_port.match(td.text):25ip_port='ip:port+'td.text26ifip_port!='':27ip_array.append(ip_port)2829#抓取代理ip30printip_array3132#分包ip和port以字典形式保存33ip_dict_list=[]34foripinip_array:35ip_dict={'http':ip}36ip_dict_list.append(ip_dict)3738printip_dict_list验证获取到的代理ip是否可用1#导入随机扩展库并生成随机数2导入随机数3#验证代理ip4#随机获取代理ip5proxy=ip_dict_list[random.randint(0,len(ip_dict_list)-1)]6#初始化验证成功的ip数组7ip_sucess_array=[]8try:9print'CurrentProxy:',proxy10requests.get(url='http://www.baidu.com',headers=headers,timeout=3,proxies=proxy)11print'验证成功'12ip_sucess_array.append(proxy)13exceptException,e:14print'验证失败'更多精彩去微信t公众号【Python集中营】,专注python技术栈、数据获取、交流社区、干货分享,期待你的加入~