美文网首页Python
Python爬虫常用工具(更新中)

Python爬虫常用工具(更新中)

作者: 一只小青蛙 | 来源:发表于2020-11-10 18:14 被阅读0次

    打印错误信息,并打印错误行号:

    try:
        print(1/0)
    except Exception as e:
        print(f'Error info: [{e}] | Error line: [{e.__traceback__.tb_lineno}]')
    

    字符串仅保留英文、中文、数字、中文符号、英文符号:

    import re
    > 字符串去除转义符
    def finstring(string):
        s = ''.join(re.findall(
            '[\u4e00-\u9fa5]+|\d+|[a-zA-Z]+|[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]+|[\】\【\,\|\!\#\@\$\%\*\/\.\ \[\]\{\}\>\<\\\)\(\^\"\'\;\:]+',
            string))
        return s
    

    将秒切换为时间格式:

    import datetime
    def shijian(video_length):
        times = datetime.timedelta(seconds=video_length)
        return times
    

    时间戳切换为时间:

    def zh_ctime(timestamp):
        # 转换成localtime
        time_local = time.localtime(timestamp)
        # 转换成新的时间格式
        dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)
        return dt
    

    对比两个字符串的相似度,返回相似值(最大长度支持到100):

    import difflib
    def similarity(str1, str2):
        percentage = 100 - len(str1)     
        str1, str2 = str1 + '*' * percentage, str2 + '*' * percentage
        strnum = difflib.SequenceMatcher(None, str1, str2).quick_ratio()
        return int(strnum * 100)
    

    随机IP

    在一些网站服务中,除了对 user-agent 的身份信息进行检测、

    也对客户端的 ip 地址做了限制,

    如果是同一个客户端访问此网站服务器的次数过多就会将其识别为爬虫,

    因而,限制其客户端 ip 的访问。这样的限制给我们的爬虫带来了麻烦,所以使用代理 ip 在爬虫中是非常有必要的。

    这里我给大家提供一下两个网站供参考

    66代理:http://www.66ip.cn/6.html
    
    快代理:https://www.kuaidaili.com/free/
    

    大家可以将这些ip使用爬虫下载到本地,然后检查每一个ip的状态码判断其是否可用。

    这样每次使用爬虫下载文件的时候。

    只需使用random随机使用一个就可以。

    对比两个字符串的相似度,返回相似百分比:

    import difflib
    def strduibi_lv(str1, str2):
        # percentage = 100 - len(str1)
        # str1, str2 = str1 + '*' * percentage, str2 + '*' * percentage
        strnum = difflib.SequenceMatcher(None, str1, str2).quick_ratio()
        return int(strnum * 100)
    

    快速转换headers,字符串格式转换字典:

    import re
    def str2dict(formstr):
        form = {}
        r = re.findall(r'(.*?):(.*?)\n', formstr)
        for i in r:
            form[i[0].strip()] = i[1].strip()
        return form
    

    时间格式切换为妙:

    def miao(video_length):
        l = video_length.split(':')
        miao = ''
        if len(l) == 3:
            miao = int(l[0]) * 3600 + int(l[1]) * 60 + int(l[2])
        elif len(l) <= 2:
            miao = int(l[0]) * 60 + int(l[1])
        return miao
    

    几天前转换时间格式

    def updata_release(release_time):
        if '前' in release_time:
            tod = datetime.date.today()
            num = re.findall(r'\d+', release_time)
            if '月' in release_time:
                return str(tod - datetime.timedelta(days=(int(num[0]) * 30))) + ' 00:00:00'
            elif '天' in release_time:
                return str(tod - datetime.timedelta(days=int(num[0]))) + ' 00:00:00'
            elif '年' in release_time:
                return str(tod - datetime.timedelta(days=(int(num[0]) * 365))) + ' 00:00:00'
        else:
            return release_time + " 00:00:00"
    

    格式化打印


    随机数等待时间

    爬取人家网站的时候频率不要太高,
    有事没事睡一会,睡久了没效率
    睡短了,被反爬了,那就尴尬了....
    随机数更具有欺骗性
    所以睡多久,random决定!

    import time
    import random
    
    for i in range(1,11):
        time = random.random()*5
        print(f'第{i}次睡了:', time, 's')
    
    '''
    第1次睡了: 0.6327309035891232 s
    第2次睡了: 0.037961811128097045 s
    第3次睡了: 0.7443093721610153 s
    第4次睡了: 0.564336149517787 s
    第5次睡了: 0.39922345839757245 s
    第6次睡了: 0.13724989845026703 s
    第7次睡了: 0.7877693301824763 s
    第8次睡了: 0.5641490602064826 s
    第9次睡了: 0.05517343036931721 s
    第10次睡了: 0.3992618299505627 s
    '''
    

    所以可以试着在爬虫代码加入time.sleep(random.random()*5)
    让子弹飞一会

    Mysql数据库连接语句:

    import re
    import time
    import pymysql
    
    class Mysql_:
        def __init__(self, database, root, password, localhost='localhost'):
            self.database = database
            self.root = root
            self.password = password
            self.localhost = localhost
            self.db = None
            self.cur = None
    
        def __connect(self):
            self.db = pymysql.connect(
                host=self.localhost,
                port=3306,
                user=self.root,
                password=self.password,
                database=self.database,
                charset='utf8'
            )
            self.cur = self.db.cursor()
    
        def __close(self):
            self.cur.close()
            self.db.close()
    
        def select_all(self, sql, **params):
            self.__connect()
            try:
                self.cur.execute(sql, params)
                result = self.cur.fetchall()
                return result
            except Exception as e:
                self.db.rollback()
                print(e)
    
        def select_one(self, sql, **params):
            self.__connect()
            try:
                self.cur.execute(sql, params)
                result = self.cur.fetchone()
                return result
            except Exception as e:
                self.db.rollback()
                print(e)
    
    
    if __name__ == '__main__':
          # 实例化
          mysql = Mysql_("database", 'user', '123456', '127.0.0.1')
          sql = "SELECT * FROM table_name"      # 查询语句
          mysql.select_all(sql)      # 查询符合条件的所有数据
          mysql.select_one(sql)      # 查询符合条件的一条数据
    

    相关文章

      网友评论

        本文标题:Python爬虫常用工具(更新中)

        本文链接:https://www.haomeiwen.com/subject/mqwjbktx.html