python 抓取 快代理-开放代理 IP

python 抓取 快代理-开放代理 IP

简介

  1. 抓取快代理-开放代理栏目;
  2. 默认抓取所有的数据,共10页;
  3. 抓取关键词: ip port;
  4. 时间间隔默认:2s,时间太短会导致抓取失败;
  5. 保存形式:text文本

创建KuaiDaiLiOps.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
import re
import time
import requests
from bs4 import BeautifulSoup


class KuaiDaiLiOps(object):
    def __init__(self):
        self.session = requests.session()
        self.proxies = None
        self.timeout = 5
        self.time_interval = 2
        self.headers = {
            "Accept": "text/html,application/xhtml+xml,"
                      "application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate, sdch, br",
            "Accept-Language": "zh-CN,zh;q=0.8",
            "Connection": "Keep-Alive",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) "
                          "AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/55.0.2883.87 Safari/537.36",
        }

    def get_status(self, url):
        """
        获取状态
        :param url: 访问地址
        :return: 返回response或False
        """
        response = self.session.get(
            url=url,
            headers=self.headers,
            proxies=self.proxies,
            timeout=self.timeout,
            # verify=False,
            # allow_redirects=False
        )
        if response.status_code == 200:
            return response
        else:
            print("ERROR: 网络连接失败! status: %s url: %s" % (response.status_code, url))
            return False

    def get_index(self, url):
        """
        访问首页,建立连接
        :param url:
        :return:
        """
        response = self.get_status(url)
        if response:
            # response.encoding = "utf-8"
            # html = response.text
            # print(html)
            print("首页,建立连接...")
            return True
        else:
            print("ERROR: 首页访问失败!")
            return False

    def parse_page(self, url):
        """
        页数解析--只有10页
        :param url:
        :return:
        """
        response = self.get_status(url)
        if not response:
            return None
        html = response.text
        soup = BeautifulSoup(html, "html5lib")
        pages = soup.select("#listnav > ul > li > a")
        url_list = []
        for page in pages:
            # title = page.text
            href = page.get("href")
            get_url = re.findall(r"(https://.*?)/", url)
            url = get_url[0] + href
            url_list.append(url)

        return url_list

    def parse_html(self, url):
        """
        页面解析
        :param url:
        :return:
        """
        print(url)
        response = self.get_status(url)
        if not response:
            return None
        html = response.text
        soup = BeautifulSoup(html, "html5lib")
        trs = soup.select("#freelist tbody > tr")
        ip_port_list = []
        for tr in trs:
            tds = tr.find_all("td")
            ip = port = hidden = ip_type = get_post_support = location = speed = last_verification_time = ""
            for i in range(len(tds)):
                # "IP": ["PORT", "匿名度", "类型", "get/post支持", "位置", "响应速度	", "最后验证时间"],
                ip = tds[0].text
                port = tds[1].text
                ip_port = ip + ":" + port + "\n"
                if not ip:
                    continue
                ip_port_list.append(ip_port)

        return ip_port_list

    @staticmethod
    def write_to_text(path, content):
        path = os.path.abspath(path)
        with open(path, 'a+', encoding='utf-8') as f:
            f.writelines(content)

    def main(self):
        # 首页
        url = "https://www.kuaidaili.com"
        self.get_index(url)

        # 页数解析
        url = "https://www.kuaidaili.com/ops/"
        url_list = self.parse_page(url)

        path = os.path.join(os.getcwd(), "IP.txt")
        path = os.path.abspath(path)
        # 翻页
        for url in url_list:
            ip_port_list = self.parse_html(url)  # 解析页面
            self.write_to_text(path, ip_port_list)
            time.sleep(self.time_interval)  # 请求间隔时间


if __name__ == '__main__':
    kdl = KuaiDaiLiOps()
    kdl.main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值