Python爬虫5:代理ip

我们都知道很多网站都有反爬机制,其中一种就是限制ip的访问频率,上次我爬百度的图片的时候就是这样的,只爬了300多站就被封了,所以我们需要通过代理ip来切换自己的ip这样就不至于被封了。

当然,有很多代理ip要钱的,虽然有免费的代理ip但是很多都非常不稳定,但是我太穷了,所以我们需要通过Python的爬虫去爬免费代理ip的网站,然后在分别验证ip是否可用,可用的话就保存到我们的数据库中,以后需要用到代理ip时我们就可以直接用就行了,不过目前我还不需要用到这个东西,所以只是随便做了一个案例来说明具体怎么操作,以后需要的时候在自己搭一个代理ip池吧。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests, threading, datetime
from bs4 import BeautifulSoup
from threading import Thread

iplist = []
hostlist = []
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}


def getip():
    for i in range(2, 50):#获取2-50页的IP地址
        target = 'https://www.xicidaili.com/wn/' + str(i)
        req = requests.get(url=target, headers=headers)
        text = BeautifulSoup(req.text, 'lxml').find_all('tr')
        for each in range(1, len(text)):
            iplist.append(text[each].find_all('td')[1].string)
            hostlist.append(text[each].find_all('td')[2].string)#对内容进行处理获得IP地址和端口
        threads = []  
        for a in range(len(iplist)):  # 这里是多线程的代码
            t = Thread(target=testip(iplist[a], hostlist[a]))  # 把函数加到线程里面
            t.start()  # 开始线程
            threads.append(t)  # 把线程都加到列表里面,方便后面判断是否下载完毕
        for t in threads:
            t.join()  # 这里就是等待线程结束的代码
        print("验证下一波ip地址")
        iplist.clear()#把内容清空,继续爬下一页的ip地址
        hostlist.clear()


def testip(ip, host):
    targeturl = 'https://baidu.com'
    proxies = {"https": "https://" + ip + ":" + host}  # 代理ip
    try:
        response = requests.get(url=targeturl, proxies=proxies, headers=headers, timeout=5).status_code
        if response == 200:#代理ip很简单,只需要加上proxies这个参数就可以了
            print(ip + ":" + host)
        else:
            print('0', end='')
    except:
        print('0', end='')#这里用到了错误和异常处理,防止程序报错而自动退出


if __name__ == "__main__":
    getip()
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

Title - Artist
0:00