利用多线程爬虫搭建代理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有用)

猜你喜欢

转载自blog.csdn.net/qq_43337502/article/details/108069789