python库pycurl简介

pycurl可以返回web相关信息,例如:

HTTPS状态码:200
DNS解析时间:76.67 ms
建立连接时间:107.84 ms
准备传输时间:158.23 ms
传输开始时间:185.80 ms
传输结束总时间:188.38 ms
下载数据包大小:6709 bytes/s
HTTP头部大小:341 byte
平均下载速度:35686 bytes/s

1.curlwebinfo.py

获取web访问信息

import pycurl as pycurl
import os
import certifi

# 创建一个空列表,用于保存url地址
url_list = []

# 创建一个空列表,用于保存url地址探测信息
url_list_check_info = []

class CurlWebInfo(object):
    def __init__(self):
        pass
        # self.curl_web_info()

    def add_url_list(self):
        # 1.打开文件(文件名区分大小写)
        file = open("url_list")

        # 2.读取文件
        # 使用readline函数实现逐行读取
        # 避免文件全部加载进入内存造成内存资源紧缺,且有可能使程序崩溃
        while True:
            url = file.readline()
            # 判断是否可以读取到内容
            if not url:
                return
            url_list.append(url.strip())  # 删除首尾空白
        # 3.关闭文件
        file.close()
        pass

    def curl_web_info(self):
        for url in url_list:
            """设置默认值"""
            namelookup_time = "-100"  # 获取DNS解析时间
            connect_time = "-100"  # 获取建立连接时间
            pretransfer_time = "-100"  # 获取从建立连接到准备传输所消耗的时间
            starttransfer_time = "-100"  # 获取从建立连接到传输开所消耗的时间
            toltal_time = "-100"  # 获取传输的总时间
            http_code = "-100"  # 获取HTTP状态码
            size_downloao = "-100"  # 获取下载数据包大小
            header_size = "-100"  # 获取HTTP头部大小
            speed_download = "-100"  # 获取平均下载速度
            curl_status = 1  # 设置连接状态码

            URL = url  # 探测对象
            c = pycurl.Curl()  # 创建一个Curl对象
            c.setopt(pycurl.SSL_VERIFYPEER, 0)  # 跳过https证书检查
            c.setopt(pycurl.URL, URL)  # 定义请求的URL常量
            c.setopt(pycurl.CONNECTTIMEOUT, 5)  # 定义请求连接的等待时间
            c.setopt(pycurl.TIMEOUT, 5)  # 定义请求超时时间
            c.setopt(pycurl.NOPROGRESS, 1)  # 屏蔽下载进度条
            c.setopt(pycurl.FORBID_REUSE, 1)  # 完成交互后强制断开连接,不重用
            c.setopt(pycurl.MAXREDIRS, 1)  # 指定HTTP重定向的最大数为1
            c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)  # 设置保存DNS信息的时间为30秒

            # 创建一个文件对象,以”wb”方式打开,用来存储返回的http头部及页面内容
            indexfile = open(os.path.dirname(os.path.realpath(__file__)) + "/content.txt", "wb")

            # 将返回的HTTP HEADER定向到 indexfile文件对象
            c.setopt(pycurl.WRITEHEADER, indexfile)

            # 将返回的HTML内容定向到indexfile文件对象
            c.setopt(pycurl.WRITEDATA, indexfile)

            try:
                c.perform()  # 提交请求
            except Exception as e:
                print("connecion error: %s " % str(e))
                indexfile.close()
                c.close()

            try:
                namelookup_time = c.getinfo(c.NAMELOOKUP_TIME)  # 获取DNS解析时间
                connect_time = c.getinfo(c.CONNECT_TIME)  # 获取建立连接时间
                pretransfer_time = c.getinfo(c.PRETRANSFER_TIME)  # 获取从建立连接到准备传输所消耗的时间
                starttransfer_time = c.getinfo(c.STARTTRANSFER_TIME)  # 获取从建立连接到传输开所消耗的时间
                toltal_time = c.getinfo(c.TOTAL_TIME)  # 获取传输的总时间
                http_code = c.getinfo(c.HTTP_CODE)  # 获取HTTP状态码
                size_downloao = c.getinfo(c.SIZE_DOWNLOAD)  # 获取下载数据包大小
                header_size = c.getinfo(c.HEADER_SIZE)  # 获取HTTP头部大小
                speed_download = c.getinfo(c.SPEED_DOWNLOAD)  # 获取平均下载速度
            except Exception as e:
                # 出错后的处理代码
                print("(未知错误")
                # 修改状态码
                curl_status = -1
            finally:
                print("123456")

            curl_web_info = {
                'http_code': http_code,
                'namelookup_time': namelookup_time,
                'connect_time': connect_time,
                'pretransfer_time': pretransfer_time,
                'starttransfer_time': starttransfer_time,
                'size_downloao': size_downloao,
                'header_size': header_size,
                'speed_download': speed_download,
                'toltal_time': toltal_time,
                'url': URL,
                'curl_status': curl_status
            }
            # 将探测信息写入列表中
            url_list_check_info.append(curl_web_info)

            # 关闭文件及Curl对象
            indexfile.close()
            c.close()

    # 返回探测列表
    def return_url_list_check_info(self):
        msg = CurlWebInfo()
        msg.add_url_list()
        msg.curl_web_info()
        return url_list_check_info

if __name__ == '__main__':
    test = CurlWebInfo()
    list = []
    list = test.return_url_list_check_info()
    for webibfo_list in list:
        if webibfo_list is not None:
            print(webibfo_list)
        else:
            break

2.application.py

输出web访问信息

import smtplib
import curlwebinfo
from email.mime.text import MIMEText
from email.header import Header

# 创建CurlWebInfo实例
CURL_WEB_INFO = curlwebinfo.CurlWebInfo

# 创建一个空字典,存储所有采集信息
receiver_url_list_check_info = []

"""
使用的元素有:

"""

# 打印输出相关数据
# sendEmail

# web探测
def receiver_curl_web_info():
    curl_web_info = CURL_WEB_INFO.return_url_list_check_info(self=True)
    if curl_web_info:
        receiver_url_list_check_info = curl_web_info
    else:
        return
    # 遍历列表
    for info in receiver_url_list_check_info:
        print(info)

# 程序启动入口
if __name__ == '__main__':
    receiver_curl_web_info()

3.url_list

https://www.baidu.com
......

4.实现效果

{'http_code': '-100', 'namelookup_time': '-100', 'connect_time': '-100', 'pretransfer_time': '-100', 'starttransfer_time': '-100', 'size_downloao': '-100', 'header_size': '-100', 'speed_download': '-100', 'toltal_time': '-100', 'url': 'https://www.baidu.coss', 'curl_status': -1}
{'http_code': 200, 'namelookup_time': 0.008825, 'connect_time': 0.039627, 'pretransfer_time': 0.078427, 'starttransfer_time': 0.096421, 'size_downloao': 227.0, 'header_size': 879, 'speed_download': 2364.0, 'toltal_time': 0.096446, 'url': 'https://www.baidu.com', 'curl_status': 1}
{'http_code': 200, 'namelookup_time': 0.008211, 'connect_time': 0.039058, 'pretransfer_time': 0.061932, 'starttransfer_time': 0.084628, 'size_downloao': 984.0, 'header_size': 271, 'speed_download': 11714.0, 'toltal_time': 0.084652, 'url': 'xxx', 'curl_status': 1}
{'http_code': 200, 'namelookup_time': 0.045153, 'connect_time': 0.075333, 'pretransfer_time': 0.097549, 'starttransfer_time': 0.123353, 'size_downloao': 5176.0, 'header_size': 296, 'speed_download': 42081.0, 'toltal_time': 0.123378, 'url': 'xxx', 'curl_status': 1}
{'http_code': 301, 'namelookup_time': 0.005891, 'connect_time': 0.035221, 'pretransfer_time': 0.035542, 'starttransfer_time': 0.054511, 'size_downloao': 162.0, 'header_size': 251, 'speed_download': 3000.0, 'toltal_time': 0.054537, 'url': 'xxx', 'curl_status': 1}
{'http_code': 200, 'namelookup_time': 0.005009, 'connect_time': 0.031912, 'pretransfer_time': 0.051745, 'starttransfer_time': 0.090513, 'size_downloao': 12978.0, 'header_size': 297, 'speed_download': 144200.0, 'toltal_time': 0.090659, 'url': 'xxx', 'curl_status': 1}
上一篇:python-pycurl失败,但是curl(来自bash)在ubuntu中工作


下一篇:我如何安装pyCurl?