爬虫

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

image.png

验证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
上一篇下一篇

猜你喜欢

热点阅读