搭建爬虫代理ip池的两种方法(含源码)
前言
ip池的作用就不多说了
我们在爬虫的时候总是会遇到跑的太频繁而导致ip被封号,搭建代理ip池是解决的最好方法,本文提供两种简单的利用爬虫搭建代理ip池的方法。
一、ip池是什么?
简单来说就是存储一堆ip方便自己调用,用于突破反爬虫机制
其他作用自行百度
二、爬取原理
先爬后验再存
意思是先去网站爬取有效数据
通过试验验证ip是否可用
存储到数据库方便调用(mysql)
当然你也可以把他写成方法丢到服务器自己来调用
多线程方法我放到了最后
三、使用步骤
方法一
爬取网站https://www.kuaidaili.com/
主要代码如下:
for page in range(91,150):#自己选取要爬页数
print('==========正在获取第{}页数据============'.format(str(page)))
base_url='https://www.kuaidaili.com/free/inha/{}/'.format(str(page))
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
response=requests.get(base_url,headers=headers)
data=response.text
html_data = etree.HTML(data)
parse_list=html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')
for tr in parse_list:
dict_proxies={}
http_type=tr.xpath('./td[4]/text()')
ip_num=tr.xpath('./td[1]/text()')
ip_port=tr.xpath('./td[2]/text()')
dict_proxies[http_type[0]]=ip_num[0]+':'+ip_port[0]
print(dict_proxies)
proxies_list.append(dict_proxies)
time.sleep(0.5)
验证
主要代码如下:
def check_ip(proxies_list):
headers = {
'Referer':'https://www.liepin.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
can_use=[]
for proxy in proxies_list:
try:
response=requests.get('https://baidu.com',headers=headers,proxies=proxy,timeout=0.1)
if response.status_code==200:
can_use.append(proxy)
else:
print('不可使用')
except Exception as e:
print(e)
finally:
print('当前IP',proxy,'通过')
print(can_use)
return can_use
通过构造方法,用get请求网址https://baidu.com看是否能用
存取到mysql
主要代码如下:
db = pymysql.connect(
host="****",#数据库
port=3306,
user="****",#用户
passwd="****",#密码
db="****",#表名
charset='utf8'
)
for ip in can_use:
for realip in ip:
cursor= db.cursor()
sql='INSERT INTO IP地址(IP地址,是否可用) values(%s,%s)'
cursor.execute(sql,(ip[realip],'可用'))
db.commit()
方法二
验证和存取步骤相同跳过,主要看爬取
爬取网站http://www.xicidaili.com/nn/
代码如下:
url = "http://www.xicidaili.com/nn/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
ip_list = get_ip_list(url,headers=headers)
proxies = get_random_ip(ip_list)
canuseIP=check_ip(ip_list)
def get_ip_list(url,headers):
web_data = requests.get(url,headers=headers)
soup = BeautifulSoup(web_data.text,'lxml')
ips = soup.find_all('tr')
ip_list = []
#第一个tr是列名
for i in range(1,len(ips)):
ip_info = ips[i]
tds = ip_info.find_all('td')
ip_list.append(tds[1].text+":"+tds[2].text)
return ip_list
def get_random_ip(ip_list):
proxy_list = []
for ip in ip_list:
proxy_list.append('http://'+ip)
proxy_ip = random.choice(proxy_list)
proxies = {'http':proxy_ip}
return proxies
多线程爬取
当然你也可以用多线程爬取,因为我觉得就这样爬就很快了够用了所以我在源码没有放上
你可以自行加进去
代码如下:
with ThreadPoolExecutor(max_workers=5) as t: # 创建一个最大容纳数量为5的线程池
task1 = t.submit(pa, (1)) #pa是你爬虫函数
task2 = t.submit(pa, (2)) # 通过submit提交执行的函数到线程池中
task3 = t.submit(pa, (3))
task4 = t.submit(pa, (4))
task5 = t.submit(pa, (5))
源码
已上传到github
可直接使用:链接
我分了主次,主就是方法一次就是方法二,推荐方法一(快,且大多ip有用)