乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

apk反汇编工具apktool问题集锦

发表于 2020-09-15

Apktool的基本使用

解包指令:

1
apktool d [apk文件] -o [解包存放路径]

如果使用的是jar包,则:

1
java -jar apktool.jar d [apk文件] -o [解包存放路径]

打包指令:

1
2
3
apktool b [源码目录] -o [apk文件]
或者
java -jar apktool.jar b [源码目录] -o [apk文件]

签名指令:

1
jarsigner -verbose -keystore [签名文件] -signedjar [签名后的apk 可自定义文件名] [需要签名的apk]  [签名文件的别名]

温馨提示

由于apk在反编译后进行回编时容易出现各种异常情况, 建议解包后立马进行装包测试,以免白费功夫!

问题1 DexBackedDexFile$NotADexFile

apktool反编apk时报错:

1
org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: cf 77 4c c7 9b 21 01 cd

提示很明显,就是非法Dex,这是因为apk里有加密过后的dex文件,比如有些apk的assets目录下有加密后的Dex文件,添加–only-main-classes参数即可

1
apktool d ~/tmp/test.apk -o /tmp/test --only-main-classes

apktool打包时找不到打包后的apk文件

新版的apktool需要加上 -o 参数, 否则只编译不输出apk 文件

1
apktool b ~/tmp/test -o /tmp/test.apk

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android Studio:如何使用Android Studio与夜神模拟器开发调试

发表于 2020-09-15

使用Android Studio与夜神模拟器开发调试:

(1)运行夜神模拟器,

(2)打开命令行窗口,

(3)打开到夜神安装目录(如cd D:\Program Files\NOX\Nox\bin),

(4)执行命令:nox_adb.exe connect 127.0.0.1:62001,连接模拟器,

(5)若Android Studio连接不上夜神,重启模拟器即可。

4、这时在Android Studio窗口上点击run ‘app’(或shift+F10)

会发现弹出的窗口如下所示:

点击OK即可在模拟器上运行app

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python requests库添加自定义cookies的方法

发表于 2020-09-14

一般的情况使用requests.Session()方法就可以解决cookies问题,但是在途中添加cookie遇到了一些问题。

第一种:

1
2
session = requests.Session()
session.cookies['cookie'] = 'cookie-value'12

功能:可以添加cookie,不会清除原cookie
缺点:不能设置path,domain等参数

第二种:

1
2
session = requests.Session()
session.cookies.set('cookie-name', 'cookie-value', path='/', domain='.abc.com')12

功能:设置path、domain等参数。
缺点:清楚原来的cookies

第三种:

1
2
session = requests.Session()
requests.utils.add_dict_to_cookiejar(session.cookies, cookie_dict)12

功能:可以添加cookie,不会清除原cookie
缺点:不能设置path,domain等参数

第四种:

1
2
3
4
session = requests.Session()
c = requests.cookies.RequestsCookieJar()
c.set('cookie-name', 'cookie-value', path='/', domain='.abc.com')
session.cookies.update(c)1234

功能:既能添加cookies,还能添加path,domain等参数。

cookie的path和domain属性

  1. domain表示的是cookie所在的域,默认为请求的地址,如网址为www.test.com/test/test.aspx,那么domain默认为www.test.com。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
  2. path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
  3. 浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。
  4. 含值键值对的cookie:以前一直用的是nam=value单键值对的cookie,一说到含多个子键值对的就蒙了。现在总算弄清楚了。含多个子键值对的cookie格式是name=key1=value1&key2=value2。可以理解为单键值对的值保存一个自定义的多键值字符串,其中的键值对分割符为&,当然可以自定义一个分隔符,但用asp.net获取时是以&为分割符。

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

如何检测获取到的代理ip是否为高匿ip

发表于 2020-09-14

方法一

通过第三方接口检测

1
2
url = "http://httpbin.org/ip"  # 如果返回的ip里面有本机ip,则证明不是匿名代理
url = "http://httpbin.org/get?show_env=1" # "origin"对应的value如果是你的本机ip,则不是匿名代理

示例:

1
2
3
4
5
# 访问http://httpbin.org/ip 返回

{
"origin": "117.136.0.213"
}

和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 访问http://httpbin.org/get?show_env=1 返回

{
"args": {
"show_env": "1"
},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Alexatoolbar-Alx-Ns-Ph": "AlexaToolbar/alx-4.0.3",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5f5ebcfe-2047fe040ea2d1e594e5b6e0",
"X-Forwarded-For": "117.136.0.213",
"X-Forwarded-Port": "80",
"X-Forwarded-Proto": "http"
},
"origin": "117.136.0.213",
"url": "http://httpbin.org/get?show_env=1"
}

附上网站源码:https://github.com/postmanlabs/httpbin

方法二

利用某些禁止代理访问的网站进行代理访问测试,比如孔夫子旧书网

步骤:

第一步 先对孔夫子进行高频访问(不使用代理), 直到无法访问为止(说明本机ip已经被禁止)

第二步 换成代理进行访问 如果可以正常访问 则为高匿代理

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import requests
import time
from threading import Thread


def get_gao_ni_ip(ip, file_save):
url = "http://book.kongfz.com/175804/1038155437/"
headers = {
'Cookie': 'PHPSESSID=0d12c303a92043f13a3cc2c329e444f36b44ef71; shoppingCartSessionId=74c831996eb9a1009d79244d7d915040; kfz_uuid=f53edd56-8938-48af-a447-9a07bde47ffa; reciever_area=1006000000; Hm_lvt_bca7840de7b518b3c5e6c6d73ca2662c=1552367977; Hm_lvt_33be6c04e0febc7531a1315c9594b136=1552367977; kfz_trace=f53edd56-8938-48af-a447-9a07bde47ffa|10072231|834871367e51d410|-; acw_tc=65c86a0a15523697386136416e812159c1e7ce1072aea90b9eb27c93ee05cc; BIGipServerpool_nxtqzj=527099402.24615.0000; Hm_lpvt_bca7840de7b518b3c5e6c6d73ca2662c=1552371456; Hm_lpvt_33be6c04e0febc7531a1315c9594b136=1552371456',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
proxies = {
"http": "http://" + ip,
}
try:
resp = requests.get(url=url, headers=headers, proxies=proxies, timeout=2)
# print(resp.text)
if "胡适传论,上" \
"下。_胡明_孔夫子旧书网" in resp.text:
print("ip可用",ip)
file_save.write(ip + '\n')
else:
print("errer")
except:
pass


if __name__ == '__main__':
start_time = time.time()
# 储存可用的ip地址
file_save = open(r'D:\')

with open(r'D:\', 'r',
encoding='utf-8') as file_ips:
ips_list = file_ips.readlines()

thread_list = []
total_num = 0
for ip_one in set(ips_list):
# 前面携带http的
ip = ip_one.strip()
# 直接ip+port的
thred_ip = Thread(target=get_gao_ni_ip, args=[ip, file_save])
thread_list.append(thred_ip)
thred_ip.start()
total_num += 1
print(total_num, total_num)
# 为了是电脑CPU不至于很卡
time.sleep(0.005)
for i in thread_list:
i.join()
file_save.close()
end_time = time.time()
print((end_time - start_time), '秒')

方法三

利用百度搜索关键字 IP,出来的网站的结果,进行爬取,然后利用自己电脑本机ip和request请求响应回来的代理ip进行比较,如果不一样,说明请求的代理IP就是高匿的。

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

全球免费代理获取接口api

发表于 2020-09-14

免费代理IP库

警告

代理IP采集于网络,仅供个人学习使用。请勿用于非法途径,违者后果自负!

获取一个验证通过的代理IP

  • URL: https://ip.jiangxianli.com/api/proxy_ip
  • 响应数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"code":0,
"msg":"成功",
"data":{
"unique_id":"ad0611edba534fd2c39a36d77e383cfb",
"ip":"118.193.107.80",
"port":"80",
"ip_address":"北京市 北京市",
"anonymity":0,
"protocol":"http",
"isp":"电信",
"speed":375,
"validated_at":"2017-12-25 14:38:25",
"created_at":"2017-12-25 14:38:25",
"updated_at":"2017-12-25 14:38:25"
}
}

获取代理IP列表

  • URL: https://ip.jiangxianli.com/api/proxy_ips
  • 请求参数
参数名 数据类型 必传 说明 例子
page int N 第几页 1
country string N 所属国 中国,美国
isp string N ISP 电信,阿里云
order_by string N 排序字段 speed:响应速度,validated_at:最新校验时间 created_at:存活时间
order_rule string N 排序方向 DESC:降序 ASC:升序
  • 响应数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"code":0,
"msg":"成功",
"data":{
"current_page":1,
"data":[
{
"unique_id":"dd2aa4a97ab900ad5c7b679e445d9cde",
"ip":"119.167.153.50",
"port":"8118",
"ip_address":"山东省 青岛市",
"anonymity":0,
"protocol":"http",
"isp":"联通",
"speed":46,
"validated_at":"2017-12-25 15:11:05",
"created_at":"2017-12-25 15:11:05",
"updated_at":"2017-12-25 15:11:05"
},
{
"unique_id":"7468e4ee73bf2be35b36221231ab02d5",
"ip":"119.5.0.42",
"port":"22",
"ip_address":"四川省 南充市",
"anonymity":0,
"protocol":"http",
"isp":"联通",
"speed":127,
"validated_at":"2017-12-25 15:10:04",
"created_at":"2017-12-25 14:38:14",
"updated_at":"2017-12-25 15:10:04"
}
],
"last_page":1,
"per_page":15,
"to":8,
"total":8
}
}

访问频率限制

请注意访问频率以及防止无效页的数据获取。多次违规操作访问将被限制IP访问。如需解除IP请在修正操作后,ISSUE中申请解除限制。

详情参见:https://github.com/jiangxianli/ProxyIpLib

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

windows平台下一款强大的免费代理获取工具ProxyFire(烈火代理)

发表于 2020-09-14

简介

proxyfire是一个强大的在线代理收集和分类工具。它支持http、socks4、socks5、隧道和ssl代理验证。它可以将代理分为socks代理、超级匿名代理、一般匿名代理、透明代理、网关代理。它具有强大的论坛吸收功能、搜索引擎吸收功能、代理扫描功能。并对代理的查询国家、代理重复、智能删除代理水印、代理无序等功能进行了研究。默认设置可用于每天获取数千个新的代理列表

截图

本帖附件

点击下载

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

如何判断客户端是否使用了代理

发表于 2020-09-14

要判断客户端是否使用代理服务器,可以从客户端所发送的环境变量信息来判断。

具体来说,就是看HTTP_VIA字段,如果这个字段设置了,说明客户端使用了代理服务器。

匿名级别可以参考下表来判断。

给出一个应用例子,可以挂上代理试试效果: http://ip.mixsec.org/

一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 您的真实 IP
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

除此之外,可以通过proxy judges总 结其他一些可供参考的判定信息,一遍于在实践中加以利用。

最后写一个php例子,仅供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(!empty($_SERVER['HTTP_VIA']))  //使用了代理
{
if(!isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
//Anonymous Proxies 普通匿名代理服务器

​ //代理IP地址为 $_SERVER['REMOTE_ADDR']

}
else
{
//Transparent Proxies 透明代理服务器
//代理IP地址为 $_SERVER['REMOTE_ADDR']
//真实ip地址为 $_SERVER['HTTP_X_FORWARDED_FOR']
}
}
else //没有代理或者是高匿名代理
{
//真实ip地址为 $_SERVER['REMOTE_ADDR']
}

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于MySQL数据库基础备份

发表于 2020-09-11

mysqldump备份

img

备份命令

格式:mysqldump -u用户名 -p密码 数据库名 > 文件名.sql

例如:

1
mysqldump -uroot -ppassword  cmdb > /data/backup/cmdb.sql

备份压缩

导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩

格式:mysqldump --u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz

例如:

1
mysqldump  -uroot -ppassword  cmdb | gzip > /data/backup/cmdb.sql.gz

备份同个库多个表

格式:mysqldump -u用户名 -p密码 --database 数据库名 表1 表2 .... > 文件名.sql

例如 :

1
mysqldump -uroot -ppassword cmdb t1 t2 > /data/backup/cmdb_t1_t2.sql

同时备份多个库

格式:mysqldump -u用户名 -p密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql

例如:

1
mysqldump  -uroot -ppassword --databases cmdb bbs blog > /data/backup/mutil_db.sql

备份实例上所有的数据库

格式:mysqldump -u用户名 -p密码 --all-databases > 文件名.sql

例如:

1
mysqldump -uroot -ppassword --all-databases > /data/backup/all_db.sql

备份数据出带删除数据库或者表的sql备份

格式:mysqldump -u用户名 -p密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql

例如:

1
mysqldump -uroot -ppassword --add-drop-table --add-drop-database cmdb > /data/backup/all_db.sql

备份数据库结构,不备份数据

格式:mysqldump -u用户名 -p密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql

例如:

1
mysqldump --no-data –databases db1 db2 cmdb > /data/backup/structure.sql

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python连接MySql数据库

发表于 2020-09-11

由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 pymysql 模块。

pymysql 模块可以通过 pip 安装。但如果你使用的是 pycharm IDE,则可以使用 project python 安装第三方模块。

[File] >> [settings] >> [Project: python] >> [Project Interpreter] >> [Install按钮]

img

由于Python统一了数据库连接的接口,所以 pymysql 和 MySQLdb 在使用方式上是类似的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#创建数据库连接
pymysql.Connect()参数说明
host(str): MySQL服务器地址
port(int): MySQL服务器端口号
user(str): 用户名
passwd(str): 密码
db(str): 数据库名称
charset(str): 连接编码,存在中文的时候,连接需要添加charset='utf8',否则中文显示乱码。

connection对象支持的方法
cursor() 使用该连接创建并返回游标
commit() 提交当前事务,不然无法保存新建或者修改的数据
rollback() 回滚当前事务
close() 关闭连接

cursor对象支持的方法
execute(op) 执行SQL,并返回受影响行数
fetchone() 取得结果集的下一行
fetchmany(size) 获取结果集的下几行
fetchall() 获取结果集中的所有行
rowcount() 返回数据条数或影响行数
close() 关闭游标对象

==================MySQL===================

首先在连接数据库之前,先创建一个交易表,方便测试 pymysql 的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
DROP TABLE IF EXISTS trade;

CREATE TABLE trade (
id int(4) unsigned NOT NULL AUTO_INCREMENT,
name varchar(6) NOT NULL COMMENT '用户真实姓名',
account varchar(15) NOT NULL COMMENT '银行储蓄账号',
saving decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '账户储蓄金额',
expend decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '账户支出总计',
income decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '账户收入总计',
PRIMARY KEY (id),
UNIQUE KEY name_UNIQUE (name)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO trade VALUES (1,'乔布斯','18012345678',0.00,0.00,0.00);

==================Python===================

使用Python脚本实现增删改查和事务处理,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import pymysql.cursors

# 连接数据库
connect = pymysql.Connect(
host='localhost',
port=3310,
user='woider',
passwd='3243',
db='python',
charset='utf8'
)

# 获取游标
cursor = connect.cursor()

# 插入数据
sql = "INSERT INTO trade (name, account, saving) VALUES ( '%s', '%s', %.2f )"
data = ('雷军', '13512345678', 10000)
cursor.execute(sql % data)
connect.commit()
print('成功插入', cursor.rowcount, '条数据')

# 修改数据
sql = "UPDATE trade SET saving = %.2f WHERE account = '%s' "
data = (8888, '13512345678')
cursor.execute(sql % data)
connect.commit()
print('成功修改', cursor.rowcount, '条数据')

# 查询数据
sql = "SELECT name,saving FROM trade WHERE account = '%s' "
data = ('13512345678',)
cursor.execute(sql % data)
for row in cursor.fetchall():
print("Name:%s\tSaving:%.2f" % row)
print('共查找出', cursor.rowcount, '条数据')

# 删除数据
sql = "DELETE FROM trade WHERE account = '%s' LIMIT %d"
data = ('13512345678', 1)
cursor.execute(sql % data)
connect.commit()
print('成功删除', cursor.rowcount, '条数据')

# 事务处理
sql_1 = "UPDATE trade SET saving = saving + 1000 WHERE account = '18012345678' "
sql_2 = "UPDATE trade SET expend = expend + 1000 WHERE account = '18012345678' "
sql_3 = "UPDATE trade SET income = income + 2000 WHERE account = '18012345678' "

try:
cursor.execute(sql_1) # 储蓄增加1000
cursor.execute(sql_2) # 支出增加1000
cursor.execute(sql_3) # 收入增加2000
except Exception as e:
connect.rollback() # 事务回滚
print('事务处理失败', e)
else:
connect.commit() # 事务提交
print('事务处理成功', cursor.rowcount)

# 关闭连接
cursor.close()
connect.close()[![复制代码](https://common.cnblogs.com/images/copycode.gif)

==================测试结果===================

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Django博客开发之将文章html内容写入数据库遇到的坑

发表于 2020-09-11

坑1: Python操作mysql数据库出现pymysql.err.ProgrammingError: (1064, “You have an error in your SQL syntax;

下面为python中做mysql数据库插入数据代码操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pymysql.cursors

# 循环入库操作
for ll in range(0, len(wallPaperBeanList)):
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='ad', password='ad', db='AllThingArePower',
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

# 通过cursor创建游标
cursor = connection.cursor()
insert_sql = "INSERT INTO 'wallpaper' ('category','view_img','img','created_time','img_tag') VALUES ("+ wallPaperBeanList[ll].category +','+wallPaperBeanList[ll].view_img +','+wallPaperBeanList[ll].img +','+wallPaperBeanList[ll].created_time +','+'null' +')'

# print('category==' + wallPaperBeanList[ll].category + ';view_img==' + str(
# wallPaperBeanList[ll].view_img) + ';img==' + str(wallPaperBeanList[ll].img) + ';created_time==' + str(wallPaperBeanList[ll].created_time) + ';img_tag==' + str(wallPaperBeanList[ll].img_tag))
cursor.execute(insert_sql)

# 提交SQL
connection.commit()
# 关闭数据连接
connection.close()

12345678910111213141516171819202122

运行后就出现了下面这个异常,下面贴下完整的异常日志信息:

1
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''wallpaper' ('category','view_img','img','created_time','img_tag') VALUES (Origi' at line 1")1

正常文本没有问题 唯独html文本报错,刚开始我一直以为是mysql语法有错误,但找来找去始终没有找到可以改动的地方,百度后网上有博客讲mysql语句拼接的时候里面可能有参数有双引号导致的,使用pymysql.escape_string()方法把有双引号的参数处理一下就行,这个方案没有解决了我的问题,后来找到了一个比较好的解决方案,就是不要用%或者+操作符来拼接SQL语句,应该使用占位符。即execute的第二个参数。

修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pymysql.cursors

# 循环入库操作
for ll in range(0, len(wallPaperBeanList)):
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='ad', password='ad', db='AllThingArePower',
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

# 通过cursor创建游标
cursor = connection.cursor()
cursor.execute('insert into wallpaper (category,view_img,img,created_time,img_tag) values (%s,%s,%s,%s,%s)', (str(wallPaperBeanList[ll].category), str(
wallPaperBeanList[ll].view_img),str(wallPaperBeanList[ll].img),str(wallPaperBeanList[ll].created_time),str(wallPaperBeanList[ll].img_tag)))

# 提交SQL
connection.commit()
# 关闭数据连接

坑2: 写入数据库中途出现: Mysql失败,异常pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xF0\x9D\x90\xBF;……

问题描述:

  插入Mysql时失败了,python代码报如下异常:

  pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xF0\x9D\x90\xBF;……

原因分析:

  UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方案:

  修改Mysql表的字符集和Pymysql连接库时的字符集。

  1、修改Mysql表的字符集

    说明:将已经建好的表字符集转改成 utf8mb4,排序规则改为 utf8mb4_bin

1
   命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)

    注意:排序规则不是 utf8mb4_general_ci,而是utf8mb4_bin,不要想当然

  2、修改数据库连接的字符集   

1
    conn = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='cncb', charset='utf8mb4')

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…363738…48

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

479 日志
139 标签
RSS
© 2024 乱码三千
本站总访问量420698次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%