python request库代理ip的筛选及检测
2019-07-26 本文已影响25人
永恒君的百宝箱
记录request库代理ip筛选及检测方法
目的
如果爬虫对某一个网站持续的爬取,网站可能会对你的ip进行封禁,从而导致无法爬取内容。使用代理ip的目的就是绕开网站对你的封禁。
查找代理ip
网上有很多网址提供免费的代理ip,如:
http://www.xicidaili.com/nn/
https://lab.crossincode.com/proxy/
https://www.kuaidaili.com/free/inha/
http://ip.zdaye.com/dayProxy/ip/314239.html
http://www.89ip.cn/index.html
https://ip.ihuan.me/
但是这些网址有个缺点就是,提供的ip不稳定,需要手动一个一个去筛选。
自动筛选
为了减少这个操作的时间,永恒君写了一个python代码,可以帮助筛选出当下可以使用的代理ip
以http://www.xicidaili.com/nn/为例,从这上面筛选,代码只选了第一页的ip
#筛选出可用的代理ip,存入ip_list_OK 列表中
#随机从ip_list_OK 列表中选择一个作为代理ip
from bs4 import BeautifulSoup
import requests
import random
from fake_useragent import UserAgent
import lxml
#从代理ip网站获取代理ip列表函数,并检测可用性,返回ip列表
def get_ip_list(url):#获取可用的代理ip列表,存入ip_list_OK 列表中
ua=UserAgent()
headers = {
"User-Agent": ua.random
}
web_data = requests.get(url,headers=headers)
soup = BeautifulSoup(web_data.text, 'lxml')
ips = soup.find_all('tr')
ip_list = []#用来存储代理ip网站爬取下来的原始ip列表
ip_list_OK=[]#用来存储从原始ip列表中筛选出来的可用ip列表
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)
print("原始ip_list为:")
print(ip_list)
for ip in ip_list:
try:
proxy_host = "http://" + ip
proxy_temp = {"http": proxy_host}
res = requests.get("http://txt.go.sohu.com/ip/soip",headers=headers,proxies=proxy_temp,timeout=5).status_code
print(res,proxy_host+" is OK")
ip_list_OK.append(proxy_host)
except Exception as e:
ip_list.remove(ip)
print(proxy_host+" is delete")
continue
print("可用ip_list为:")
print(ip_list_OK)
return ip_list_OK
def get_random_ip(ip_list):#随机从ip_list_OK 列表中选择一个代理ip
proxy_list = []
for ip in ip_list:
proxy_list.append(ip)
proxy_ip = random.choice(proxy_list)
#print("hhhh")
#print(proxy_ip )
proxies = {'http': proxy_ip}
return proxies
#调用代理
if __name__ == '__main__':
url = 'http://www.xicidaili.com/nn'
good_ip_list = get_ip_list(url)
proxies = get_random_ip(good_ip_list)
print(proxies)
通过上面的代码,得到的good_ip_list即是可以使用的代理ip
。
验证ip是否设置成功
设置了代理ip,那如何知道ip是否设置成功呢?最简单的方法就是访问网站,看ip是否变更为你设置的ip。
这里提供一个网站:http://txt.go.sohu.com/ip/soip
你只要访问它,就会返回你当前的ip地址。
下面代码就是设置ip后访问上述网站,检测是否成功返回设置的ip。
#检测代理ip是否成功代理,网站会返回访问的IP地址。如果和设置的一样,说明成功。
import requests
from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import re
ua = UserAgent()
headers = {"User-Agent": ua.random}
proxies = {
"http": "http://210.5.10.87:53281",
}
url='http://txt.go.sohu.com/ip/soip'#该网站会返回访问设备的公网ip地址
res = requests.get(url,headers=headers,proxies=proxies,timeout=5)
print(res.status_code)
html = res.text
ip = re.findall(r'\d+.\d+.\d+.\d+',html)#用正则表达式筛选出ip地址
print(ip)
image.png