python搭建自己的代理池
我将从以下几步开始简单介绍自己搭建的过程,供大家一起学习和进步,也希望获得批评指正。
(一)获取免费的ip代理
(二)检测ip代理的有效性和写入文件
(一)获取免费的ip代理
可以从爬取网上提供的免费ip代理,代码如下:
#!/user/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Mr 雷'
import requests
from fake_useragent import UserAgent
import re
from lxml import etree
#获取西刺代理
def get_xici_proxy():
r=requests.get('https://www.xicidaili.com/?_id=015448211445',headers=headers,timeout=20)
r.encoding=r.apparent_encoding
pattern=r'<td class="country">.*?<td>(.*?)<.*?<td>(.*?)</td>.*?<td class="country">'
content_list=re.findall(pattern,r.text,re.S)
for content in content_list:
ip=content[0]+':'+content[1]
ip_list.append(ip)
print('-----xici爬取完毕-----')
#获取66代理
def get_66_proxy():
url='http://www.66ip.cn/'
html=etree.HTML(get_html(url))
page_num=html.xpath(r'//*[@id="PageList"]/a[12]/text()')[0]
print(page_num)
for i in range(1,int(page_num)+1):
new_url=url+str(i)+'.html'
text=get_html(new_url)
if text is None:
continue
pattern=r'</tr>.*?<tr>.*?<td>(.*?)</td>.*?<td>(.*?)</td>'
content_list=re.findall(pattern,text,re.S)
if len(content_list)==1:
continue
print('获取第{}页信息'.format(i))
content_list.pop(0)
for content in content_list:
ip=content[0] + ':' + content[1]
ip_list.append(ip)
print('-----66爬取完毕-----')
#获取89代理
def get_89_proxy():
url='http://www.89ip.cn/index_'
i=1
while True:
new_url=url+str(i)+'.html'
text=get_html(new_url)
if text is None:
continue
pattern=r'<tr>.*?>(.*?)</.*?<td>(.*?)</td>'
content_list = re.findall(pattern, text, re.S)
# 若该页面没有所需要的信息,结束循环
if not len(content_list):
break
print('获取第{}页信息'.format(i))
i += 1
content_list.pop(0)
for content in content_list:
ip=re.sub(r"[\n\t]", "", content[0])
port=re.sub(r"[\n\t]", "", content[1])
ip=ip + ':' + port
ip_list.append(ip)
print('总共成功爬取{}页'.format(i-1))
print('-----89爬取完毕-----')
#获取网页信息
def get_html(url):
global count
try:
r=requests.get(url,headers=headers,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
print('获取网页失败')
count+=1
return None
if __name__ == '__main__':
ip_list=list()
count=0
ua=UserAgent()
headers={'User-Agent':ua.random}
i=1
get_xici_proxy()
get_66_proxy()
get_89_proxy()
f = open('ip_test1.txt', 'a+')
for ip in ip_list:
print('开始写入第{}条信息'.format(i))
f.write('\n' + ip)
i+=1
print('写入成功')
print('爬取失败{}页'.format(count))
f.close()
(二)检测ip代理的有效性
在此使用百度网址进行测试,代码如下:
#!/user/bin/env python3
# -*- coding: utf-8 -*-
__author__ ='Mr 雷'
import pandasas pd
import requests
import time
import random
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'}
ip_list=list()
text=pd.read_table('ip_test1.txt',names=['ip'])
count=0
i=0
# 提取出500个不同ip
for ipin random.sample(list(text['ip']),500):
i+=1
print('开始验证第{}个'.format(i))
proxies={'https':'https://'+ip,
'http':'http://'+ip}
url='https://www.baidu.com/'
try:
r=requests.get(url,proxies=proxies,timeout=10,headers=headers)
r.raise_for_status()
if r.status_code==200:
ip_list.append(ip)
except:
count +=1
continue
# time.sleep(3)
if len(ip_list):
f =open('ip_test2.txt', 'a+')
for ipin ip_list:
f.write('\n' + ip)
print('-----可用ip有{}个-----'.format(len(ip_list)))
print('-----不可用ip有{}个-----'.format(count))
等到代码执行结束,就可以进行实战了,从这些可用代理中随机选择即可。
注:由于本人涉及的只是小型爬虫项目,所以可能很多高端技术没有涉及到,但大概原理就是的,后面学习了可以再次填充。