Python爬取代理池并清洗可用IP

本次是一个临时项目,因为需要代理IP进行项目中的测试,所以本次只是写了一个高耦合性的脚本。

我比较喜欢使用虚拟解释器,整理三方库比较清晰

依赖安装

pip install requests
pip install beautifulsoup4

一、爬取免费代理池

这里选用的https://www.kuaidaili.com/free/的开放代理。

使用reguests库直接get发现403 Forbidden,添加一个user-agent伪装浏览器。

import requests

url = 'https://www.kuaidaili.com/free/'
headers = {
   "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome"
}
html = requests.get(url, headers=headers)
print(html.text)

成功打印HTML

分析HTML后发现ip和端口都在表格内非常好处理,

使用beautifulsoup库处理

处理过程写在注释

soup = BeautifulSoup(html.text, features="html.parser")
# 获取所有行
data = soup.select('.table-bordered tr')
# 循环处理每一行
for value in data:
    # 获取所有列
    td = value.select('td')
    # 如果是表格主体(非表头)则进行处理
    if td is not None:
        ip = ''
        port = ''
        # 循环处理每一列,获取IP和端口
        for v in td:
            if v['data-title'] == 'IP':
                ip = v.string
            if v['data-title'] == 'PORT':
                port = v.string
        # 清理空的IP或端口
        if ip != '' and port != '':
            # 写入ip.txt
            with open("ip.txt", "a") as f:
                f.write(ip+':'+port+'\n')
            print('抓取到'+ip+':'+port+'并写入文件')

然后将其封装成获取器

然后处理分页

本来还以为需要分析

结果这个网站的分页是路由控制 那就省力了 直接拼接url就好了

然后写出分页器这里由于本项目需求没有抓取全部页面,所以靠for循环来控制页面

# 分页器
def pagination(start, end, sleep):
    for page in range(start, end):
        print('开始抓取第' + str(page) + '页的内容...')
        url = "https://www.kuaidaili.com/free/inha/" + str(page) + "/"
        spider(url)
        # 防止快速请求导致的问题设置睡眠时间
        time.sleep(sleep)

整个爬虫及整理数据的代码如下

import time
import requests
from bs4 import BeautifulSoup


# 获取器
def spider(url):
    # url = 'https://www.kuaidaili.com/free/'
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome"
    }
    html = requests.get(url, headers=headers)
    soup = BeautifulSoup(html.text, features="html.parser")
    # 获取所有行
    data = soup.select('.table-bordered tr')
    # 循环处理每一行
    for value in data:
        # 获取所有列
        td = value.select('td')
        # 如果是表格主体(非表头)则进行处理
        if td is not None:
            ip = ''
            port = ''
            # 循环处理每一列,获取IP和端口
            for v in td:
                if v['data-title'] == 'IP':
                    ip = v.string
                if v['data-title'] == 'PORT':
                    port = v.string
            # 清理空的IP或端口
            if ip != '' and port != '':
                # 写入ip.txt
                with open("ip.txt", "a") as f:
                    f.write(ip + ':' + port + '\n')
                print('抓取到' + ip + ':' + port + '并写入文件')


# 分页器
def pagination(start, end, sleep):
    for page in range(start, end):
        print('开始抓取第' + str(page) + '页的内容...')
        url = "https://www.kuaidaili.com/free/inha/" + str(page) + "/"
        spider(url)
        # 防止快速请求导致的问题设置睡眠时间
        time.sleep(sleep)


if __name__ == "__main__":
    pagination(1, 200, 3)

运行后我们就拥有了一份ip.txt文件内存在200页的代理IP

二、IP清洗

这里我打算分两个脚本来执行,原因是设置睡眠时间会导致抓取的过程较长。两个脚本可以同步进行。

创建cleaner.py

清理器

def ip_cleaner(ip):
    try:
        requests.get('业务上需要检查的链接', proxies={"http": "http://" + ip})
    except:
        return 0
    else:
        return 1

主程序

import requests


def main():
    with open("ip.txt", "r") as ins:
        for line in ins:
            # 清理换行符
            line = line.strip('\n')
            # 执行查询
            res = ip_cleaner(line)
            if res:
                with open("clear_ip.txt", "a") as f:
                    f.write(line + '\n')
                print(line + '  success')
            else:
                print(line + '  failed')


def ip_cleaner(ip):
    try:
        requests.get('https://telegram.org/', proxies={"http": "http://" + ip})
    except:
        return 0
    else:
        return 1


if __name__ == "__main__":
    main()

这样整个爬取加清洗的过程就完成了。

你可能感兴趣的:(python,python,tcp/ip,爬虫)