Python爬虫:免费无限获取可用的代理IP

任务思路描述:

先抓取大量的ip(包括不可用和可用的)保存到表1中,再从表1中的所有ip进行筛选,对于可用的ip信息保存到表2中,不可用的ip地址从表1中删除。

  • 抓取西刺代理的任意页网站。并将抓取的结果保存到mysql数据库表1中。
import requests
import parsel
import pymysql

conn = pymysql.connect(host="127.0.0.1", user="root", password="123456", db="ips",charset="utf8")
cursor = conn.cursor()
#获取https://www.xicidaili.com/网站内任意数量的ip地址
def crawl_ips(url):
    header = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
    }
    response = requests.get(url=url, headers=header)
    html = parsel.Selector(response.text)
    #通过xpath筛选出ip地址,端口,地址,http类型,时间
    trs = html.xpath("//table[@id='ip_list']//tr")[1:]
    for tr in trs:
        ip = tr.xpath("./td[2]/text()").get()
        port = tr.xpath("./td[3]/text()").get()
        address = tr.xpath("./td[5]/text()").get()
        proxy_type = tr.xpath("./td[6]/text()").get()
        date_time = tr.xpath("./td[10]/text()").get()
        print(ip,port,address,proxy_type,date_time)
        #插入到数据库表格中
        cursor.execute(
            f"insert into ip_pool(ip,port,address,proxy_type,date_time) \
            VALUES('{ip}' ,'{port}' ,'{address}' ,'{proxy_type}' ,'{date_time}' )"
        )
        conn.commit()
        # ip_list.append((ip, port, address, type, date))
        print(ip ,port, address ,proxy_type ,date_time)


def run(n, m):
    for i in range(n, m):
        url = f"https://www.xicidaili.com/nn/{i}"
        # print(url)
        crawl_ips(url)

n = int(input("请输入你要从’西刺代理‘的第几页开始爬取:"))
m = int(input("请输入你要爬取西刺的页数:"))
run(n, n+m+1)
conn.close()
cursor.close()

结果如图所示:
Python爬虫:免费无限获取可用的代理IP_第1张图片

  • 表1中取出任一ip+port,选出可用的ip地址,并保存到表2中,对于不可用的ip进行删除。
import pymysql
import requests




class GetIP(object):

    def __init__(self):
    #连接数据库
        self.conn = pymysql.connect(host="127.0.0.1",user="root",password="123456", \
                                    db="ips",charset="utf8"
                                    )
        self.cursor = self.conn.cursor()

        self.headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
        }



    def delete_ip(self, ip):
        #从数据库中删除无效的ip
        delete_sql = f'''
            DELETE FROM ip_pool WHERE ip = "{ip}"
        '''
        self.cursor.execute(delete_sql)
        self.conn.commit()
        # res = self.cursor.fetchall()
        print("已删除")


    def judge_ip(self, ip, port):
        #判断一个ip是否可用
        proxy = {
            "http": f"http://{ip}:{port}",
            "https": f"http://{ip}:{port}"
        }
        url = "https://www.baidu.com/"
        try:
            response = requests.get(url=url,headers=self.headers, proxies=proxy, timeout=2)
            code = response.status_code
            # print("状态码类型:", type(code))
            if int(code) >= 200 and code < 300:
                print(f"代理ip:{ip}可用")
                print("准备插入到新的表中")
                #把当前可用的ip和端口保存到表ip_new中
                self.save_new_table(ip, port)
                return True
            else:
                print(f"获取的状态码为:{code}, 不可用即将删除")
                self.delete_ip(ip)
                return False
        except Exception as e:
            print(f"代理ip:{ip}异常,即将删除")
            self.delete_ip(ip)
            return False

    def get_random_ip(self):
        #从数据库中获取随机的一个ip地址
        sql = '''
            SELECT ip,port FROM ip_pool ORDER BY RAND() LIMIT 1
        '''
        self.cursor.execute(sql)
        res = self.cursor.fetchall()[0]
        # print(res)
        ip, port = res[0], res[1]
        judge_res = self.judge_ip(ip, port)
        if judge_res:
            return f"http://{ip}:{port}"
        else:
            return self.get_random_ip()

    def save_new_table(self,ip, port):
        self.cursor.execute(
            f"insert into ip_new(ip,port) VALUES('{ip}' ,'{port}')"
        )
        self.conn.commit()
        print("成功插入到新的表中")


if __name__ == '__main__':
    get_ip = GetIP()
    for i in range(10):
        get_ip.get_random_ip()

结果如图所示:
Python爬虫:免费无限获取可用的代理IP_第2张图片

  • 这样表2中就是大量可使用的ip地址了,如果表2的数据有失效的还可以在修改第二部分代码,对表2的ip进行二次清洗。
    Python爬虫:免费无限获取可用的代理IP_第3张图片

你可能感兴趣的:(笔记,爬虫,python,mysql,pycharm,后端)