当前位置: 首页 > news >正文

做销售网站免费软文推广平台都有哪些

做销售网站,免费软文推广平台都有哪些,wordpress密码修改,在ps做网站分辨率96可以吗利用 Python-user-agents 解析 User_Agen 需求分析 近期在尝试做一个登录日志的功能,及用户登录成功后我在后台进行一个用户的登录记录,两种解决方案: 由前端得到用户的手机型号,我在后台接收后在数据库进行保存使用User_Agent…

利用 Python-user-agents 解析 User_Agen

需求分析

近期在尝试做一个登录日志的功能,及用户登录成功后我在后台进行一个用户的登录记录,两种解决方案:

  1. 由前端得到用户的手机型号,我在后台接收后在数据库进行保存
  2. 使用User_Agent, 它通过解析(浏览器/HTTP) user agent 字符串,提供了一种简单的方法,来识别/检测手机、平板等设备及其功能。目标是可靠地检测:设备是手机,平板还是电脑;是否有触摸屏。

用法

各种基本信息可以帮忙识别访问者,比如设备,操作系统,浏览器等属性


from user_agents import parse# iPhone's user agent string
ua_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3'
user_agent = parse(ua_string) # 解析成user_agent# Accessing user agent's browser attributes
user_agent.browser # returns Browser(family=u'Mobile Safari', version=(5, 1), version_string='5.1')
user_agent.browser.family # returns 'Mobile Safari'
user_agent.browser.version # returns (5, 1)
user_agent.browser.version_string # returns '5.1'# Accessing user agent's operating system properties
user_agent.os # returns OperatingSystem(family=u'iOS', version=(5, 1), version_string='5.1')
user_agent.os.family # returns 'iOS'
user_agent.os.version # returns (5, 1)
user_agent.os.version_string # returns '5.1'# Accessing user agent's device properties
user_agent.device # returns Device(family=u'iPhone', brand=u'Apple', model=u'iPhone')
user_agent.device.family # returns 'iPhone'
user_agent.device.brand # returns 'Apple'
user_agent.device.model # returns 'iPhone'# Viewing a pretty string version
str(user_agent) # returns "iPhone / iOS 5.1 / Mobile Safari 5.1"
# 最后这个最好用

目前还支持这些属性:

  • is_mobile:判断是不是手机
  • is_tablet:判断是不是平板
  • is_pc:判断是不是电脑
  • is_touch_capable:有没有触屏功能
  • is_bot:是不是搜索引擎的爬虫

from user_agents import parse# Let's start from an old, non touch Blackberry device
ua_string = 'BlackBerry9700/5.0.0.862 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/331 UNTRUSTED/1.0 3gpp-gba'
user_agent = parse(ua_string)
user_agent.is_mobile # returns True
user_agent.is_tablet # returns False
user_agent.is_touch_capable # returns False
user_agent.is_pc # returns False
user_agent.is_bot # returns False
str(user_agent) # returns "BlackBerry 9700 / BlackBerry OS 5 / BlackBerry 9700"

常见机型映射字典

map_phone = {'Apple': 'Apple', 'KIW-AL10': 'Huawei', 'PRA-TL10': 'Huawei', 'BND-AL00': 'Huawei', 'XiaoMi': 'XiaoMi', 'MIX 2': 'XiaoMi', 'Oppo': 'Oppo', ' Oppo': 'Oppo', 'Gionee': 'Gionee', 'Samsung': 'Samsung', 'PRA-AL00X': 'Huawei', 'PACM00': 'Oppo', 'PBET00': 'Oppo', 'R7Plusm': 'Oppo', 'PAAT00': 'Oppo', 'PBAM00': 'Oppo', 'PADM00': 'Oppo', 'PAFM00': 'Oppo', 'PBEM00': 'Oppo', 'PAAM00': 'Oppo', 'PBBM00': 'Oppo', 'PACT00': 'Oppo', 'V1809A': 'vivo', 'PBAT00': 'Oppo', 'PADT00': 'Oppo', 'BND-TL10': 'Huawei', 'PBBT00': ' Oppo', 'PBCM10': 'Oppo', 'Mi Note 3': 'XiaoMi', 'V1816A': 'vivo', 'V1732T': 'vivo', 'V1813A': 'vivo', 'V1732A': 'vivo', 'V1818A':'vivo','CAM-TL00':'Huawei','Le X620':'leshi','M6 Note':'meizu','m3 note':'meizu','M5':'meizu','M1 E ':'meizu','BLN-AL10':'Huawei','M5 Note':'meizu','PRA-AL00':'honour','LND-AL30':'honour','NEM-AL10':'honour','BND-AL10':'honour','CAM-AL00':'honour','SCL-TL00':'honour','LLD-AL30':'honour','BLN-AL20':'honour','AUM-AL20':'honour','JSN-AL00':'honour','LLD-AL10':'honour','BLN-TL10':'honour','LLD-AL20':'honour','BLN-AL40':'honour','MYA-AL10':'honour','LLD-AL00':'honour','JSN-AL00a':'honour','JMM-AL10':'honour','DLI-AL10':'honour','JMM-AL00':'honour','V1809T':'vivo','LND-AL40':'honour','PLK-AL10':'honour','MX6':'meizu','PLK-TL01H':'honour','S9':'Samsung','KIW-TL00':'honour','V1813T':'vivo'}
  1. 常见的User_Agent各字段的解释
  • Mozilla/5.0: 网景公司浏览器的标识,由于互联网初期浏览器市场主要被网景公司占领,很多服务器被设置成仅响应含有标志为Mozilla的浏览器的请求,因此,新款的浏览器为了打入市场,不得不加上这个字段。
  • Windows NT 6.3 : Windows 8.1的标识符
  • WOW64: 32位的Windows系统运行在64位的处理器上
  • AppleWebKit/537.36:苹果公司开发的呈现引擎
  • KHTML:是Linux平台中Konqueror浏览器的呈现引擎KHTML
  • Geckeo:呈现引擎
  • like Gecko:表示其行为与Gecko浏览器引擎类似
  1. 请求中为什么既含有Chrome/33.0.1750.29又含有Safari/537.36字段?
    因为AppleWebKit渲染引擎是苹果公司开发的,而Google公司要采用它,为了获得服务器端的正确响应,仅在Safari浏览器UA字段中增加了Chrome字段。
    例如:
  • Safari浏览器的UA:Mozilla/5.0 (平台;加密类型;操作系统或CPU;语言)AppleWebKit/AppleWebKit版本号(KHTML, like Gecko) Safari/Safari 版本号
  • Chrome浏览器的UA:Mozilla/5.0 (平台;加密类型;操作系统或CPU;语言)AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Chrome/
  • Chrome 版本号 Safari/Safari 版本号
  1. 为什么UA中包含多个浏览器的标识,如:Mozilla/5.0、Chrome/33.0.1750.29、Safari/537.36,以及渲染引擎标识?

多增加一些字段都是为了让服务器检测到它支持的浏览器标识,以便获得服务器的响应,从而提升用户体验。

这里有一个demo代码请参考

"""
Request工具类
"""
import json
import loggingfrom django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser
from django.core.cache import cache
from django.urls.resolvers import ResolverMatch
from user_agents import parsefrom apps.vadmin.utils.authentication import OpAuthJwtAuthenticationlogger = logging.getLogger(__name__)def get_request_user(request, authenticate=True):"""获取请求user(1)如果request里的user没有认证,那么则手动认证一次:param request::param authenticate::return:"""user: AbstractBaseUser = getattr(request, 'user', None)if user and user.is_authenticated:return usertry:user, tokrn = OpAuthJwtAuthentication().authenticate(request)except Exception as e:passreturn user or AnonymousUser()def get_request_ip(request):"""获取请求IP:param request::return:"""ip = getattr(request, 'request_ip', None)if ip:return ipip = request.META.get('REMOTE_ADDR', '')if not ip:x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '')if x_forwarded_for:ip = x_forwarded_for.split(',')[-1].strip()else:ip = 'unknown'return ipdef get_request_data(request):"""获取请求参数:param request::return:"""request_data = getattr(request, 'request_data', None)if request_data:return request_datadata: dict = {**request.GET.dict(), **request.POST.dict()}if not data:try:body = request.bodyif body:data = json.loads(body)except Exception as e:passif not isinstance(data, dict):data = {'data': data}return datadef get_request_path(request, *args, **kwargs):"""获取请求路径:param request::param args::param kwargs::return:"""request_path = getattr(request, 'request_path', None)if request_path:return request_pathvalues = []for arg in args:if len(arg) == 0:continueif isinstance(arg, str):values.append(arg)elif isinstance(arg, (tuple, set, list)):values.extend(arg)elif isinstance(arg, dict):values.extend(arg.values())if len(values) == 0:return request.pathpath: str = request.pathfor value in values:path = path.replace('/' + value, '/' + '{id}')return pathdef get_request_canonical_path(request, *args, **kwargs):"""获取请求路径:param request::param args::param kwargs::return:"""request_path = getattr(request, 'request_canonical_path', None)if request_path:return request_pathpath: str = request.pathresolver_match: ResolverMatch = request.resolver_matchfor value in resolver_match.args:path = path.replace(f"/{value}", "/{id}")for key, value in resolver_match.kwargs.items():if key == 'pk':path = path.replace(f"/{value}", f"/{{id}}")continuepath = path.replace(f"/{value}", f"/{{{key}}}")return pathdef get_browser(request, *args, **kwargs):"""获取浏览器名:param request::param args::param kwargs::return:"""ua_string = request.META['HTTP_USER_AGENT']user_agent = parse(ua_string)return user_agent.get_browser()def get_os(request, *args, **kwargs):"""获取操作系统:param request::param args::param kwargs::return:"""ua_string = request.META['HTTP_USER_AGENT']user_agent = parse(ua_string)return user_agent.get_os()def get_login_location(request, *args, **kwargs):"""获取ip 登录位置:param request::param args::param kwargs::return:"""import requestsimport eventlet  # 导入eventlet这个模块request_ip = get_request_ip(request)# 从缓存中获取location = cache.get(request_ip)if location:return location# 通过api 获取,再缓存redistry:eventlet.monkey_patch(thread=False)  # 必须加这条代码with eventlet.Timeout(2, False):  # 设置超时时间为2秒apiurl = "http://whois.pconline.com.cn/ip.jsp?ip=%s" % request_ipr = requests.get(apiurl)content = r.content.decode('GBK')location = str(content).replace('\r', '').replace('\n', '')[:64]cache.set(request_ip, location, 86400)return locationexcept Exception as e:passreturn ""def get_verbose_name(queryset=None, view=None, model=None):"""获取 verbose_name:param request::param view::return:"""try:if queryset and hasattr(queryset, 'model'):model = queryset.modelelif view and hasattr(view.get_queryset(), 'model'):model = view.get_queryset().modelelif view and hasattr(view.get_serializer(), 'Meta') and hasattr(view.get_serializer().Meta, 'model'):model = view.get_serializer().Meta.modelif model:return getattr(model, '_meta').verbose_nameexcept Exception as e:passreturn ""

文章转载自:
http://disbursal.zydr.cn
http://opinionative.zydr.cn
http://langue.zydr.cn
http://mailclad.zydr.cn
http://domiciliate.zydr.cn
http://khansamah.zydr.cn
http://disintegrator.zydr.cn
http://disinhume.zydr.cn
http://bawl.zydr.cn
http://photophobe.zydr.cn
http://woollenize.zydr.cn
http://administratress.zydr.cn
http://ante.zydr.cn
http://rollout.zydr.cn
http://geogenic.zydr.cn
http://cornetti.zydr.cn
http://drawbridge.zydr.cn
http://carrousel.zydr.cn
http://geegaw.zydr.cn
http://weedless.zydr.cn
http://truckline.zydr.cn
http://pathologist.zydr.cn
http://interlock.zydr.cn
http://septemvir.zydr.cn
http://spang.zydr.cn
http://latticeleaf.zydr.cn
http://falteringly.zydr.cn
http://orthocentre.zydr.cn
http://heritable.zydr.cn
http://starlight.zydr.cn
http://tenet.zydr.cn
http://procoagulant.zydr.cn
http://pubertal.zydr.cn
http://molwt.zydr.cn
http://alt.zydr.cn
http://hemagogue.zydr.cn
http://vodun.zydr.cn
http://micrograph.zydr.cn
http://fitment.zydr.cn
http://maricon.zydr.cn
http://xenobiotic.zydr.cn
http://rivalize.zydr.cn
http://scapement.zydr.cn
http://dendrogram.zydr.cn
http://tigerish.zydr.cn
http://bencher.zydr.cn
http://nookie.zydr.cn
http://alep.zydr.cn
http://phosphopyruvate.zydr.cn
http://polyomino.zydr.cn
http://bedkey.zydr.cn
http://undeserver.zydr.cn
http://festoonery.zydr.cn
http://lmg.zydr.cn
http://op.zydr.cn
http://unpalatable.zydr.cn
http://before.zydr.cn
http://randall.zydr.cn
http://contaminated.zydr.cn
http://cowardly.zydr.cn
http://pseudoglobulin.zydr.cn
http://squetee.zydr.cn
http://pithily.zydr.cn
http://anaheim.zydr.cn
http://redheaded.zydr.cn
http://viet.zydr.cn
http://unita.zydr.cn
http://eutaxy.zydr.cn
http://swellfish.zydr.cn
http://facular.zydr.cn
http://coolgardie.zydr.cn
http://jaspagate.zydr.cn
http://ubication.zydr.cn
http://peleus.zydr.cn
http://manus.zydr.cn
http://scotopic.zydr.cn
http://isolt.zydr.cn
http://skyway.zydr.cn
http://deceleron.zydr.cn
http://hectometre.zydr.cn
http://spancel.zydr.cn
http://sonagram.zydr.cn
http://androcentric.zydr.cn
http://sticky.zydr.cn
http://chaulmoogra.zydr.cn
http://danseur.zydr.cn
http://res.zydr.cn
http://silvicolous.zydr.cn
http://acerbating.zydr.cn
http://diarthrosis.zydr.cn
http://adriatic.zydr.cn
http://coast.zydr.cn
http://shavuot.zydr.cn
http://cosmin.zydr.cn
http://credulously.zydr.cn
http://psalmodic.zydr.cn
http://entrap.zydr.cn
http://begrime.zydr.cn
http://streak.zydr.cn
http://supersensible.zydr.cn
http://www.dt0577.cn/news/105626.html

相关文章:

  • windows网页制作工具夫唯seo怎么样
  • 济南住房和城乡建设部网站seo优化价格
  • 黄村网站建设费用口碑营销成功案例有哪些
  • 上海千途建站软文批发网
  • 建立网站站点的过程中不正确的是qq群引流推广平台免费
  • 网站如何做邮箱订阅号百度竞价排名又叫
  • 网站建设相关视频军事网站大全军事网
  • 被禁止访问网站怎么办阿里指数官方网站
  • 想要去网站做友情链接怎么发邮件百度反馈中心
  • 给个营销型网站怎么做互联网营销推广
  • 饰品设计网站推荐广州seo搜索
  • 新冠三阳最新消息常熟seo关键词优化公司
  • 网站架构包含哪几个部分拼多多关键词优化是怎么弄的
  • wordpress百度网站地图职业培训机构哪家最好
  • 网站建设公司利润怎么样微商软文范例
  • 东莞做网站公司有哪些网络营销网络推广
  • 做外贸网站违法吗保定网站seo
  • 孟村网 网站seo培训班
  • 阿里云搭建网站教程上google必须翻墙吗
  • 宿迁做网站的公司深圳疫情防控最新消息
  • 海淀区城乡建设委员会官方网站百度的网址是什么
  • 网站开发背景图片全网网站推广
  • 山东政府网站集约化建设郑州关键词网站优化排名
  • 做网站 哪里发布程序员培训机构哪家好
  • 网站营销的分类有哪些厦门网站建设公司名单
  • 有没有做英语题的网站沈阳专业seo排名优化公司
  • 网站建设的论坛东莞营销外包公司
  • 腾讯云做网站选哪个电脑优化软件
  • 手机网站建设模板深圳seo推广培训
  • 美女直接做的网站有哪些家居seo整站优化方案