首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
14,225 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,459 阅读
3
gradle-5.4.1-all.zip下载
9,503 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
8,199 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
7,015 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
617
篇文章
累计收到
629
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
143
篇与
的结果
2020-06-17
抖音字体反爬,爬虫字体反爬策略——每周一个爬虫小教程系列
在B站上看到一个关于抖音字体反爬的视频,看完之后,精神抖擞,不禁感觉,我又行了,于是在模拟器上下载了一个抖音,打开了我尘封已久的抖音号。可以看见显示的数字是正常的,但是查看源码就是错误的。既然是字体反爬,那就得去找下字体,双击下载然后用在线字体编辑器打开看一下。我们看到这个数字1的Unicode是$E602,是不是和源代码中的差不多呢。在教程里面说到对于字体反爬,需要用模块将字体转为xml,相当于字典,然后就这样替换吧。将字体文件转换为xml文件需要用到的模块是fonttoole,这里需要自行安装一下。from fontTools.ttLib import TTFont font = TTFont('iconfont_9eb9a50.woff') font.saveXML('DouYinFont.xml')转换完成之后的XML文件。我们来搜索一下我们之前的数字1,他的Unicode就是E602,然后可以发现这里和之前在线字体网站上的结果是一样的然后我们来将XML文件提取出来,并输出一下(XML提取我目前也不会,所以是跟着教程写的,后期再去了解一下吧)a = font['cmap'].getBestCmap() print(a)这个时候发现似乎这些都变成了数字,而不是之前的$E602这样子的,是因为进制转换了,由原始的16进制,转成了10进制。然后我们需要将这个字典中的十进制数字转成这种16进制,然后还得把0x替换为&#x然后用代码实现就是酱紫的,大概就是提取出cmap这个节点的信息,然后遍历这个字典,然后重新转换成16进制然后变成字符串,在替换一下。a = font['cmap'].getBestCmap() b = {} for key, value in a.items(): b[str(hex(key)).replace('0x', '&#x')] = value print(b)然后就是用代码将num_这些转换为数字,参照这张字体在线编辑器的即可c = { 'num_': '1', 'num_1': '0', 'num_2': '3', 'num_3': '2', 'num_4': '4', 'num_5': '5', 'num_6': '6', 'num_7': '9', 'num_8': '7', 'num_9': '8', }然后改进一下之前的代码:for key, value in a.items(): b[str(hex(key)).replace('0x', '&#x')] = c[value] print(b)然后为了和网页源码里面一样()所以还需要做一些修改,在后面加一个分号和空格。for key, value in a.items(): b[str(hex(key)).replace('0x', '&#x')+'; '] = c[value] print(b)然后就是请求源码,然后替换了。headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', } url = 'https://www.iesdouyin.com/share/user/91723415754' res = requests.get(url=url, headers=headers).text for key, value in b.items(): if key in res: res = res.replace(key, value+' ') print(res)
2020年06月17日
1,483 阅读
2 评论
0 点赞
2020-06-17
ORM常用数据字段类型及字段参数选项
这个摘自Django官方文档,只保留了教程所提到的以及个人感觉会用到的数据类型及参数选项。官方文档地址:https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/强大的谷歌翻译拯救了我,虽然有这份文档有中文选项但是似乎只有开头那么几句是中文首先是Field字段类型。AutoField类AutoField(** options)会IntegerField根据可用ID自动递增。您通常不需要直接使用它;如果没有另外指定,主键字段将自动添加到模型中。请参阅自动设置主键。这个就相当于我们自己设置的第一列自增的int型的ID吧。BigAutoField¶类BigAutoField(** options)一个64位整数,非常类似于,AutoField不同之处在于它保证可以匹配从1到的数字9223372036854775807。BigIntegerField¶类BigIntegerField(** options)¶一个64位整数,非常类似于,IntegerField不同之处在于它保证可以匹配从-9223372036854775808到的 数字9223372036854775807。此字段的默认表单小部件是 NumberInput。
2020年06月17日
948 阅读
0 评论
0 点赞
2020-06-15
ORM模型的使用,创建ORM模型,ORM模型映射到数据库,ORM模型增删改查
第一步、创建ORM模型。ORM模型通常放在app的models.py文件中,所以创建该文件,然后需要在settings.py中INSTALLED_APPS添加该app的名称。举个栗子。我的app名称为front,然后在这个目录下新增一个models.py文件在文件中添加自己需要的表以及列如,创建一个表book,列:ID,name,author,pricefrom django.db import models class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=100, null=False) author = models.CharField(max_length=100, null=False) price = models.FloatField(null=False, default=0)在settings.py中INSTALLED_APPS添加该app的名称第二步、映射到数据库中。需要记住两行指令。python manage.py makemigrations #来生成迁移脚本文件。 python manage.py migrate #来将迁移脚本文件映射到数据库中注意:如果输入 Python manage.py makemigrations提示No changes detected,解决方案:输入这行指令即可:python manage.py makemigrations --empty yourappname第三步、增删改查。增:def index(request): # 添加数据 book = Book(name='www.lanol.cn', author='Lan', price=100) book.save() return HttpResponse('你好')查:通过主键:def index(request): # 查询数据 # 1,通过主键 book = Book.objects.get(pk=1) result = f'书本ID:{book.id} 书本名称:{book.name} 书本价格:{book.price}' return HttpResponse(result)查询所有数据:books = Book.objects.all()查找指定数据:调用objects的filter方法。单条件: books = Book.objects.filter(name=' 多条件: books = Book.objects.filter(name='www.lanol.cn',author='lan')删除数据:先get到再删除book = Book.objects.get(name='www.lanol.cn') book.delete()修改数据:先查找到,再修改,修改后保存。book = Book.objects.get(name='www.lanol.cn') book.name = 'lanol.cn' book.save()
2020年06月15日
1,182 阅读
0 评论
0 点赞
2020-06-15
Django连接MySQL缺少mysqlclient包,Python3.8安装mysqlclient
解决方案:下载whl文件,直接安装whl文件在https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient找到适合自己版本的mysqlclient比如我的是win32所以下载的下载到本地之后,最好放到项目文件夹内,在pycharm之中pip,因为这样就可以省略进入虚拟环境的步骤。然后成功安装
2020年06月15日
879 阅读
0 评论
0 点赞
2020-06-14
Django模板结构优化所需要的三个Tag:include,extends,block
利用include引入模板文件一般的网页都有头部(header),底部(footer),然后这些部分通常是不会变的,所以在Django中可以利用include引入模板文件,如我的头部文件是:header.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello www.lanol.cn</title> </head>底部文件是:footer.html<div class="footer"> <p>这是Lan的小站的底部文件</p> </div>然后首页文件只需要这样写就可以了:index.html{% include 'header.html' %} <div class="content"> <h1>这是首页文件</h1> </div> {% include 'footer.html' %}默认include标签包含模版,会自动的使用主模版中的上下文,也即可以自动的使用主模版中的变量。如果想传入一些其他的参数,那么可以使用with语句。示例代码如下:# header.html <p>Website:{{ username }}</p> # main.html {% include "header.html" with Website='www.lanol.cn' %}利用extends继承模板文件extends可以直接引用整个文件比如base.html:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是base模板</h1> </body> <div class="footer"> <p>这是Lan的小站的底部文件</p> </div> </html>然后index.html只需要一句就可以了:{% extends 'base.html' %}需要注意的是:extends标签必须放在模版的第一行。子模板中的代码必须放在block中,否则将不会被渲染。利用block修改继承的目标文件如果我们需要修改base.html的内容,我们需要在base.html中加一个block,代码中的content为自己起的名字,可以根据需求改<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是base模板</h1> </body> <div class="footer"> {% block content %} {% endblock %} </div> </html>然后在index中就可以修改了。{% extends 'base.html' %} {% block content %} <h1>这是block插入</h1> {% endblock %}
2020年06月14日
730 阅读
0 评论
0 点赞
2020-06-14
Pycharm生成代码模板,一键生成作者信息日期等
首先呢,来一张效果图。这是一个刚刚新建的py文件,但是已经自动生成了作者等信息。一开始,我还是看一些视频发现他们创建文件就自带这种感觉挺装13的,于是就百度了一下,大概了解到这么一个东西。这个是在Pycharm里面设置的,设置路径:file -->settings–>editor–>file and code templates然后就可以根据自己的需求来为所欲为了。比如我的就是这个# -*- coding: utf-8 -*- """ ------------------------------------------------- @ Author :Lan @ Blog :www.lanol.cn @ Date : ${DATE} @ Description:I'm in charge of my Code ------------------------------------------------- """然后下面是一些变量,根据自己需求添加修改即可${PROJECT_NAME} - 当前Project名称; ${NAME} - 在创建文件的对话框中指定的文件名; ${USER} - 当前用户名; ${DATE} - 当前系统日期; ${TIME} - 当前系统时间; ${YEAR} - 年; ${MONTH} - 月; ${DAY} - 日; ${HOUR} - 小时; ${MINUTE} - 分钟; ${PRODUCT_NAME} - 创建文件的IDE名称; ${MONTH_NAME_SHORT} - 英文月份缩写, 如: Jan, Feb, etc; ${MONTH_NAME_FULL} - 英文月份全称, 如: January, February, etc;
2020年06月14日
841 阅读
0 评论
0 点赞
2020-06-13
实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列
从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的)这次需要用到的知识:Python基础知识Requests模块Xpath模块(说白了就是HTML)有看我的博客:www.lanol.cn首先来到这个页面https://www.bilibili.com/ranking/all/0/0/1,目前是全站榜,我们尝试切换到原创榜,就会发现网址栏对应的网址改变了,所以我们只需要修改网址就可以获取想要的榜单(我不确定会不会每天都变,没观察)然后改变这个投稿类型和日期网址也会改变到这里我们就已经获取到想要爬取的网址了。request中的url也就确定了。url = ‘https://www.bilibili.com/ranking/all/0/0/1’我们按快捷键Ctrl+U,查看源代码,然后搜索一下排行第一的视频。我们可以发现在源代码里面有,这样的话我们就可以直接用requests模块获取源码,再利用Xpath解析网页了。有关Xpath的时候方法可以看这篇文章Python爬虫:Xpath语法笔记。然后来开始写代码,第一步永远都不会变的,先导入Requests模块和将网页源码转换为可以Xpath的模块(这两个模块如果没有可以pip一下,博客内也有教程,搜索即可)import requests import parsel然后就是做一个请求头(伪装成普通浏览器去访问),一般来说刚开始只加一个user-agent就可以了,如果有反爬机制,再去加。请求头也就是这一块我们一开始只放一个user-agent进去user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36我们复制下来之后是上面这样的,然后我们要转换成Python里面字典的格式。也就是加个引号就行了。'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'然后放到Python代码中就是这样子的。headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' }这样requests模块中的headers就构造好了然后就是写上这一句就可以获取到源码了。response = requests.get(url=url, headers=headers).text这句话的意思就是调用requests模块,然后get请求这个url,最后将获取到的内容取text格式然后赋值给response。我们来执行看一下,不要忘记输出一下哦。这样子我们的页面源码就获取到了,而且里面可以看到我们之前搜索的排行第一的视频:【官方MV】Mojito - 周杰伦。然后我们回到网站,右键视频标题,点击检查。我们再在源码这右键一下,点击Copy,点击Copy Xpath,这样Xpath就复制下来了,动画演示:原文地址:www.lanol.cn//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[1]/div[2]/div[2]/a我们将这句Xpath粘贴到浏览器插件里面测试一下。可以看见我们已经可以选中这句标题了,然后我们再利用HTML知识修改一下这句话,就可以获取到所有标题了。//div[2]/div[2]/a我们放到Python里面执行一下。发现获取的内容似乎有点多,这里不仅把标题弄出来了,而且还将这句代码弄出来了,我们在后面加一个text()只获取文本内容。这样就可以了,我们再来试一下获取分数。一如之前的操作,右键分数,点击检查,再在代码处右键,点击Copy,点击Copy Xpath。//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[20]/div[2]/div[2]/div[2]/div再修改一下这句话,以获取我们想要的全部内容。//div[2]/div[2]/div[2]/div/text()然后放到Python里面执行一下。成功获取所有分数。综上我们想要获取的信息都已经取到了。然后就是写到表格之中,这里为了方便直接写到csv即可。直接贴代码了。with open('B站排行榜www.lanol.cn.csv', 'w') as f: f.write('标题,分数 ') for index, i in enumerate(titles): f.write(f'{i},{grades[index]} ')这样子,就可以了,这个只是一个思路,获取更多信息你可以自由发挥。所有代码一共才17行,人生苦短,Python当歌,其实其他语言也可以,只是麻烦了一点而已。所有代码如下:[CommShow]import parsel import requests url = 'https://www.bilibili.com/ranking/all/0/0/1' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' } response = requests.get(url=url, headers=headers).text response = parsel.Selector(response) # www.lanol.cn Lan的小站 titles = response.xpath('//div[2]/div[2]/a/text()').extract() grades = response.xpath('//div[2]/div[2]/div[2]/div/text()').extract() with open('B站排行榜www.lanol.cn.csv', 'w') as f: f.write('标题,分数 ') for index, i in enumerate(titles): f.write(f'{i},{grades[index]} ') print(grades)[/CommShow]
2020年06月13日
2,367 阅读
6 评论
0 点赞
1
...
12
13
14
...
21