- my_fake_useragent 和 fake_useragent实质基本一致,可以调用里面的方法User Agent
class UserAgent():
parsed_json_data = load_parsed_json_data()
def __init__(self,
family=None,
os_family=None,
phone=None,
version_range=None,
):
"""
:param mode: default mode
:param family: 不设置则不管 指定浏览器类型
:param os_family: 不设置则不管 指定操作系统
:param phone: 指定是否是手机端 True 是 False 不是 不设置默认None则不管
:param version_range: 不设置则不管 指定浏览器版本范围
手机检测 根据设备family参数之外 操作系统检测到 android 或 ios 也认为是移动端
"""
if isinstance(family, str):
family = family.lower()
self.family = [family]
elif isinstance(family, (list, tuple)):
self.family = [f.lower() for f in family]
elif family is None:
self.family = None
else:
raise ValueError('family')
if isinstance(os_family, str):
os_family = os_family.lower()
self.os_family = [os_family]
elif isinstance(os_family, (list, tuple)):
self.os_family = [f.lower() for f in os_family]
elif os_family is None:
self.os_family = None
else:
raise ValueError('os_family')
self.phone = phone
if self.phone not in [None, True, False]:
raise ValueError('phone')
self.version_range = version_range
self.filter_func = build_stream_function(filter_family,
filter_os_family, filter_phone,
filter_version_range)
def random(self):
user_agent_list = self.get_useragent_list()
if user_agent_list:
return random.choice(user_agent_list)
else:
raise Exception('empty result')
def get_useragent_list(self):
origin_data = []
for key in self.parsed_json_data:
origin_data += self.parsed_json_data[key]
d = {
'data': origin_data,
'family': self.family,
'version_range': self.version_range,
'os_family': self.os_family,
'phone': self.phone
}
d = self.filter_func(d)
ua_string_list = [i['string'] for i in d['data']]
return ua_string_list
def test_possible_family(self):
t1 = set()
for k, v in self.parsed_json_data.items():
for i in v:
t1.add(i['user_agent']['family'])
return t1
def test_possible_os_family(self):
t1 = set()
for k, v in self.parsed_json_data.items():
for i in v:
t1.add(i['os']['family'])
return t1
def test_possible_device_family(self):
t1 = set()
for k, v in self.parsed_json_data.items():
for i in v:
t1.add(i['device']['family'])
return t1
一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测。
浏览器的 UA 字串
标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
浏览器标识
由于很多网站在进行 UA 检测的时候忽略了两位数版本号,所以可能造成 浏览器及之后版本收到糟糕的页面,因此自 浏览器 10 之后的版本中浏览器标识项固定为 浏览器,在 UA 字串尾部添加真实版本信息。
操作系统标识
FreeBSD
X11; FreeBSD (version no.) i386
X11; FreeBSD (version no.) AMD64
Linux
X11; Linux ppc
X11; Linux ppc64
X11; Linux i686
X11; Linux x86_64
Mac
Macintosh; PPC Mac OS X
Macintosh; Intel Mac OS X
Solaris
X11; SunOS i86pc
X11; SunOS sun4u
Windows:
Windows NT 10.0 对应操作系统windows 10
windows NT 6.2 对应操作系统 windows 8
Windows NT 6.1 对应操作系统 windows 7
Windows NT 6.0 对应操作系统 windows vista
Windows NT 5.2 对应操作系统 windows 2003
Windows NT 5.1 对应操作系统 windows xp
Windows NT 5.0 对应操作系统 windows 2000
Windows ME
Windows 98
加密等级标识
N: 表示无安全加密
I: 表示弱安全加密
U: 表示强安全加密
浏览器语言
在首选项 > 常规 > 语言中指定的语言
渲染引擎
浏览器 使用 Presto 渲染引擎,格式为: Presto/版本号
版本信息
显示 浏览器 真实版本信息,格式为: Version/版本号