Python-网页转义字符及正则全文匹配
前言
大部分情况下,通过request去请求网页,response.text返回来的都是正常值,但是有一些反爬虫比较严重的网站(比如知乎)就不会是这样。知乎会返回转义字符,例如:
header = { "User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0", "HOST":"www.zhihu.com", "Referer":"https://www.zhihu.com/signup?next=%2F", } def rget(): response = session.get("https://www.zhihu.com/signup?next=%2F", headers=header) target_str = response.text print(target_str) rget()
在给知乎的登录页面发请求后,打印返回结果(内容太多,只返回一小部分):
"token":{"xsrf":"9b6c6406-db1b-45fa-8626-296c037cfc00","xUDID":"ANBsasFlAg2PTgaqB1CHBtsWMijmJ20s89E="},"account":{"lockLevel":{}
发现有很多字符是转义的,登录需要用到的xsrf字段也在这里面,这样做正则匹配就很麻烦。
解决的办法是将html进行转义:
import html target_str = html.unescape(response.text)
就能够得到正常的返回信息了:
"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},
正则匹配
匹配xsrf的值 (为了方便测试,只将一小部分值提取出来做匹配):
tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xsrf[:"\w-]+', tokens) if matchs: print(matchs.group(0)) else: print("未匹配")
得到输出结果为:
xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920"
然后再借用replace将引号替换,然后用split将值用冒号分开:
import re tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xsrf[:"\w-]+', tokens) nstr = matchs.group(0).replace("\"", "").split(":") finall = nstr[1] print(finall)
就得到了我需要的xsrf:
9febf0fd-7c47-4695-93b6-f670e518d920
xUDID的提取也是如此,这两个值在知乎登录的时候是需要携带的,所以要提取:
import re tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xUDID[:"\w-]+=', tokens) nstr = matchs.group(0).replace("\"", "").split(":") finall = nstr[1] print(finall)
ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc=
re正则匹配html的坑
上面的正则可以匹配到字符串了,如果正常登录的话要将请求返回的内容文本进行匹配的,也就是匹配response.text,代码是否就是
matchs = re.search(r'xUDID[:"\w-]+=', response.text)
坑就在这里!
re默认匹配的是单行字符串,而response.text的返回值虽然是一个html页面的构成,但是它是分行的,第一行是html头<! DOCUMENT html>不是我想要的整个文本进行匹配。
re是支持整个文本匹配的,需要在正则代码加上参数re.DOTALL即可:
matchs = re.search(r'xUDID[:"\w-]+=', response.text, re.DOTALL)
就可以对整个返回的文本进行匹配了
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一学就会的django项目服务器部署nginx-uwsgi-django/build
一、前言 需要在阿里云服务器部署Django-restframework框架,一开始不清楚情况,网上找了很多的文章和办法,东拼西凑也没有能够完全实现nginx和uwsgi的互通。 想学会? 你需要找一个干干净净的、没有安装其他东西的Linux服务器(Centos系统)来跟着这篇文章做。 参考过的文章有 -视频:Nginx + uWsgi 部署 Django + Mezzanine 生产服务器 -文章:uWSGI+django+nginx的工作原理流程与部署历程 -文章:uwsgi官方文档 -文章:Django Nginx+uwsgi 安装配置 -文章:centos7 下通过nginx+uwsgi部署django应用 二、网上文章的遗漏 因为是东拼西凑,所以无论是网上的文章还是自己拼凑的配置,都是没有办法打通的。后来红包求助,才了解到有这几个地方: 1、nginx执行权限 2、uwsgi配置 3、uwsgi设置虚拟环境 4、uwsgi安装问题及插件安装问题 5、django静态文件收集处理 三、部署安装记录 1、创建非管理员账户 由于安全需求,还是配置一个非管理员(自己操作,增加sudo...
- 下一篇
Coding and Paper Letter(六)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ESA_DSQ/article/details/81033977 资源整理 1 Coding: 2 Paper: 1 Coding: 1.Python工程,使用networkx,geopandas,mplleaflet在地图上可视化网络流。 map-network 2.R语言包rsample, 用于创建和汇总不同类型的重采样对象的类和函数。 rsample 3.R语言包lomm,lomm软件包为透明且可重现的工作流程,获取和处理空间(地球观测)数据提供了完整的工具链。 它为景观生态问题提供了一种基于证据的方法。 lomm 4.R语言包deckard,它为Uber刚刚开源的deck.gl数据可视化框架提供了一个接口。它允许用户: 从R交互式渲染数百万个点。 在浏览器中可视化数据,无需专门的软件即可提供富有表现力的可视化。 使用矢量tilesets而不是raster tilesets。 创建非地理空间数据的自定义可视化。 deckard 5.R语言包googleway,提供访问各种Google...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器