现在大部分门户网站都会做一些反爬虫的策略,对于长期做数据爬虫的程序猿来说那是深有体会。其实说白了就是用同一个地址频繁去爬虫一个网页很容易导致ip被关进小黑屋,为了安全起见,就不得不使用一些技术手段去爬虫人家公开的信息。
为什么要用高匿爬虫ip
我们可以对比不同类型的爬虫ip的区别,根据爬虫ip的匿名程度,爬虫ip可以分为如下类别:
高度匿名爬虫ip:会将数据包原封不动的转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的IP则是爬虫ip服务器的IP。
普通匿名爬虫ip:会在数据包上做一些改动,服务器上有可能发现这是个爬虫ip服务器,也有一定几率追查到客户端的真实IP。
透明爬虫ip:不但改动了数据包,还会告诉服务器客户端的真实IP。
间谍爬虫ip:指组织或个人创建的用户记录用户传输的数据,然后进行研究、监控等目的的爬虫ip服务器。
运行环境
Python运行环境:Windows + python3.6
用到的模块:requests、bs4、json
如未安装的模块,请使用pip instatll xxxxxx进行安装,例如:pip install requests
爬取百度免费爬虫ip
这里,我只大概爬取百度高匿爬虫ip50页的数据,当然了,爬100页,爬全部,都是可以的,就不多说了;
def run(self): """执行入口""" page_list = range(1, 51) with open("ip.json", "w") as write_file: for page in page_list: # 分页爬取数据 print('开始爬取第' + str(page) + '页IP数据') ip_url = self.base_url + str(page) html = self.get_url_html(ip_url) soup = BeautifulSoup(html, 'html.parser') # IP列表 ip_list = soup.select('#ip_list .odd') for ip_tr in ip_list: # 单条Ip信息 td_list = ip_tr.select('td') ip_address = td_list[1].get_text() ip_port = td_list[2].get_text() ip_type = td_list[5].get_text() info = {'ip': ip_address, 'port': ip_port, 'type': ip_type} # 先校验一下IP的有效性再存储 check_res = self.check_ip(info) if check_res: print('IP有效:', info) self.json_data.append(info) else: print('IP无效:', info) json.dump(self.json_data, write_file)
检测爬虫ip是否有效
爬取到的爬虫ip可能不能用,为了方便使用的时候,不报太多异常错误,所以需要先检测一下IP是否能正常使用,是否是有效爬虫ip,我这里列了三个网站,都可以很方便的检测IP地址是否能有效使用.
http://icanhazip.com/ 这个网站能直接返回爬虫ip的IP地址
http://www.ip.cn/ 查询到爬虫ip的IP地址和位置信息
http://ip.chinaz.com/ 站长工具也能定位到IP地址和位置信息
def check_ip(self, ip_info): """测试IP地址是否有效""" ip_url = ip_info['ip'] + ':' + str(ip_info['port']) proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url} res = False try: request = requests.get(url=self.check_url, headers=self.header, proxies=proxies, timeout=3) if request.status_code == 200: res = True except Exception as error_info: res = False return res
存储爬虫ip
我这里就不搞那些花里胡哨的,我直接把所有有效的爬虫ip的json格式的数据存储到文件中,当然了,也可以存储到MongoDB或者MySQL数据库中,不管怎样存储,在使用的时候都是随机选取一个IP,更加方便快捷。
完整代码
作为一个热心的程序员,为了方便部分人想偷懒,不直接去交友网站查看,我在这里也贴一下源码出来吧,如果有啥问题,最好还是去交友网站找我,请接码……
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 利用requests+bs4爬取国内高匿爬虫ip author: gxcuizy date: 2020-06-19 """ import requests from bs4 import BeautifulSoup import json class GetIpData(object): """爬取50页国内高匿爬虫ip""" header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'} base_url = 'http://jshk.com.cn/' check_url = 'https://www.ip.cn/' json_data = [] def get_url_html(self, url): """请求页面html""" request = requests.get(url=url, headers=self.header, timeout=5) html = False if request.status_code == 200: html = request.content return html def check_ip(self, ip_info): """测试IP地址是否有效""" ip_url = ip_info['ip'] + ':' + str(ip_info['port']) proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url} res = False try: request = requests.get(url=self.check_url, headers=self.header, proxies=proxies, timeout=3) if request.status_code == 200: res = True except Exception as error_info: res = False return res def run(self): """执行入口""" page_list = range(1, 51) with open("ip.json", "w") as write_file: for page in page_list: # 分页爬取数据 print('开始爬取第' + str(page) + '页IP数据') ip_url = self.base_url + str(page) html = self.get_url_html(ip_url) soup = BeautifulSoup(html, 'html.parser') # IP列表 ip_list = soup.select('#ip_list .odd') for ip_tr in ip_list: # 单条Ip信息 td_list = ip_tr.select('td') ip_address = td_list[1].get_text() ip_port = td_list[2].get_text() ip_type = td_list[5].get_text() info = {'ip': ip_address, 'port': ip_port, 'type': ip_type} # 先校验一下IP的有效性再存储 check_res = self.check_ip(info) if check_res: print('IP有效:', info) self.json_data.append(info) else: print('IP无效:', info) json.dump(self.json_data, write_file) # 程序主入口 if __name__ == '__main__': # 实例化 ip = GetIpData() # 执行脚本 ip.run()标签:info,python,ip,self,list,爬虫,爬取,url From: https://www.cnblogs.com/q-q56731526/p/17210629.html