🛬前言

大家在用爬虫爬取数据的时候总会遇到被网站封IP的情况,而且封禁时间也会越来越长。

有时候设置爬取延迟,并不能解决问题,因为,虽然你给你的爬虫程序设置了休眠时间,但是你的IP请求会记录在对方服务器的日志中,一看一连串的IP都是同一个,这不禁你禁谁。

所以IP代理的方式就很好的解决了这种问题,多IP请求,欺骗服务器,而且网上也有很多免费的代理地址,

当然只是作为大家学习参考用🙄。

💌实现思路

1.分析目标网站

image-20200430153537046

分页的实现主要是你点击进入不同页面,查看url地址的变化,根据url变化,写出通式。

2.爬取需要的数据

image-20200430153706879

解析数据我使用的parsel库, 建议大家放弃BeautifulSoup和etree。

因为parsel既好用,提升空间也高。

而且parsel库集合了css,xpath,re解析方式。

3.筛选合格的代理IP

我们上一步把数据爬取下来,因为是无差别爬取,所以难免有一些质量差、响应慢的代理Ip,

所以我们需要通过判断响应时间来筛选出合格的代理IP。

try:
    # proxies ——代理IP  timeout=0.1——0.1秒内访问成功算合格
    response = requests.get("http://www.baidu.com", headers=headers, proxies=proxie, timeout=0.2)
    # 状态码200表示请求成功
    if response.status_code == 200:
        proxies_ok.append(proxie)
except Exception as e:
    # 打印垃圾代理IP和错误信息
    print(proxie, e)

🍥代码实现

import pprint
import time
import requests
import parsel


def proxies_get(page, proxies_list):
    """爬取多页代理IP"""
    url = "https://www.kuaidaili.com/free/inha/{}/".format(page)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    # 筛选需要的数据tr
    html = parsel.Selector(response.text)
    tr = html.css('tbody tr')
    # 遍历每行获取td
    for td in tr:
        proxies_dict = {}
        ip_data = td.css('td[data-title*="IP"]::text').get()
        port_data = td.css('td[data-title*="PORT"]::text').get()
        type_data = td.css('td[data-title*="类型"]::text').get()
        # 拼接成 ip:port
        url_str = "{}:{}".format(ip_data, port_data)
        proxies_dict[type_data] = url_str
        # 将字典数据添加到proxies_list列表
        proxies_list.append(proxies_dict)


def check_ip(proxies_list):
    """筛选代理IP的方法"""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
    }
    # 列表接收合格代理IP
    proxies_ok = []
    # 遍历爬下来的全部IP
    i = 0
    for proxie in proxies_list:
        # 捕获请求不成功异常
        try:
            # proxies ——代理IP  timeout=0.2——0.2秒内访问成功算合格
            response = requests.get("http://www.baidu.com", headers=headers, proxies=proxie, timeout=0.2)
            # 状态码200表示请求成功
            if response.status_code == 200:
                proxies_ok.append(proxie)
        except Exception as e:
            # 打印垃圾代理IP和错误信息
            print(proxie, e)
    # 返回合格代理IP
    return proxies_ok


# proxies_list存储未筛选的代理IP
proxies_list = []
# 控制爬取页数
for page in range(3):
    # 休眠时间,防止速度太快,数据没爬下来
    time.sleep(1)
    proxies_get((page + 1), proxies_list)
    print("==============第{}页数据爬取完毕==============".format(page + 1))

# 打印未筛选的代理IP池  pprint格式化 = print打印出来好看点
print(proxies_list, "共有代理IP:{}个".format(len(proxies_list)))
print("===============筛选代理IP================")
# 打印合格代理IP池
proxies_use = check_ip(proxies_list)
print(proxies_use, "共有合格代理IP:{}个".format(len(proxies_use)))

当然也可以直接将获得的代理IP数据存入excel中,以便下次使用。

下一篇介绍 代理IP地址的存入和读取


一个可爱的人