偶尔在刷微博的时候,发现自己多了几个粉丝,满心激动,结果点开一看,都是“加我微信”“同城交友”的虚假粉丝,这些粉丝是从哪里来的呢,具体要怎么实现呢,我尝试用Python写了一个简易的批量制作虚假粉丝的小程序。
1 首先创建一个姓名的数据库
first_name.txt中保存一些常见的姓氏,last_name.txt中保存一些常见的名称,如图所示。
Windows中强烈建议不要使用记事本进行编辑,建议使用notepad或者sublime text等软件进行编辑,否则会出现意想不到的错误。

2 把数据库用文件读写到内存中
接着,我们把它读入到数组中 ,读完之后转换成元组tuple数据类型,防止被篡改。
import string
last_name_path = 'C:/Users/xiaokai/Documents/210 - Learning - 编程/Python练习/last_name.txt'
first_name_path = 'C:/Users/xiaokai/Documents/210 - Learning - 编程/Python练习/first_name.txt'
first_name = []
last_name1 = []
last_name2 = []
# 开始读取姓氏
# 注意在open()函数中加入encoding = 'utf-8'
with open(first_name_path, 'r', encoding = 'utf-8') as f:
# 每次读取一行
for line in f.readlines():
# line.split('\n')看到回车就分词,分词结束返回的是一个数组
# 所以line是这样的['刘','\0'],line[0]就是'刘'
first_name.append(line.split('\n')[0])
first_name = tuple(first_name) # 转换成元组
print(first_name)
# 开始读取名字
with open(last_name_path, 'r', encoding = 'utf-8') as f:
for line in f.readlines():
# line.split('\n')是这样的:['凯','\n'],len()==1,说明名字只有一个字
if (1 == len(line.split('\n')[0])):
last_name1.append(line.split('\n')[0])
# line.split('\n')是这样的:['友朋','\n'],len()==2,说明名字有两个字
elif (2 == len(line.split('\n')[0])):
last_name2.append(line.split('\n')[0])
last_name1 = tuple(last_name1)
last_name2 = tuple(last_name2)
print(last_name1)
print(last_name2)
print('='*70) # 打印分隔符
运行效果如下:
('刘', '姚', '王', '周', '赵', '钱', '孙', '李')
('凯', '才', '龙', '飞', '超', '宇', '勇', '甜')
('友朋', '正强', '国庆', '俊男', '佳伟', '小虎', '世荣', '福建')
======================================================================
3 定义虚假用户的父类,自动生成姓名和性别
接着我们定义一个类,叫虚假用户,其中包含两个函数,一个函数生成名字,一个函数生成性别。生成名字的函数在姓氏和名称两个元组各自随机选择一个字符串连接在一起,生成性别的函数直接从男女中间随机选择,需要引入random模块。
# 定义一个父类
import random
class FakeUser:
# num表示虚假用户的个数
def fake_name(self, num, one_word = False, two_word = False):
for i in range(0, num):
if one_word:
full_name = random.choice(first_name) + random.choice(last_name1)
elif two_word:
full_name = random.choice(first_name) + random.choice(last_name2)
else:
full_name = random.choice(first_name) + random.choice(last_name1 + last_name2)
# full_name = random.choice(first_name) + random.choice(last_name)
# i += 1
yield full_name
def fake_gender(self, num):
for i in range(0, num):
gender = random.choice(['男','女'])
yield gender
4 定义一个子类,继承父类FakeUser,自动生成粉丝数量
然后我们定义个子类继承父类,去描述粉丝数量:
# 定义一个继承FakeUser的子类SnsUser
class SnsUser(FakeUser):
# 在定义的同时初始化,被调用的时候会传一个num进来
def __init__(self, num):
SnsUser.amount = num
# few和a_lot都是预先定义好的默认值,传递进来的符号会替换掉默认值
def get_followers(self, few = True, a_lot = False):
j = 0
while (j <= SnsUser.amount):
if few:
# random.randrange(1,50)在1~50之间随机生成数
followers = random.randrange(1,50)
elif a_lot:
followers = random.randrange(200,10000)
j += 1
yield followers
5 批量制造虚假粉丝
我们在程序中使用了循环loop和yield函数,可以批量生成大量的虚假粉丝,最后来到生成部分的实现:
num = int(input('请问你想创建多少个虚假账号?'))
# 开始生成账号
users_a = SnsUser(num)
# zip()函数,同时可以循环两个,或两个以上变量
for name,gender,followers in zip(users_a.fake_name(num),users_a.fake_gender(num),users_a.get_followers()):
print('用户: {}\t的性别是:\t{}, 拥有{}粉丝'.format(name,gender,followers))
运行结果如下:
('刘', '姚', '王', '周', '赵', '钱', '孙', '李')
('凯', '才', '龙', '飞', '超', '宇', '勇', '甜')
('友朋', '正强', '国庆', '俊男', '佳伟', '小虎', '世荣', '福建')
======================================================================
请问你想创建多少个虚假账号?20
用户: 赵飞 的性别是: 女, 拥有49粉丝
用户: 刘俊男 的性别是: 女, 拥有23粉丝
用户: 赵飞 的性别是: 男, 拥有3粉丝
用户: 赵福建 的性别是: 男, 拥有30粉丝
用户: 钱超 的性别是: 男, 拥有32粉丝
用户: 孙龙 的性别是: 女, 拥有34粉丝
用户: 钱正强 的性别是: 女, 拥有3粉丝
用户: 赵佳伟 的性别是: 男, 拥有26粉丝
用户: 孙正强 的性别是: 女, 拥有48粉丝
用户: 刘正强 的性别是: 女, 拥有22粉丝
用户: 孙俊男 的性别是: 男, 拥有24粉丝
用户: 钱小虎 的性别是: 男, 拥有7粉丝
用户: 王甜 的性别是: 女, 拥有4粉丝
用户: 赵龙 的性别是: 女, 拥有39粉丝
用户: 刘世荣 的性别是: 男, 拥有46粉丝
用户: 赵福建 的性别是: 男, 拥有16粉丝
用户: 周甜 的性别是: 男, 拥有1粉丝
用户: 李正强 的性别是: 女, 拥有46粉丝
用户: 周龙 的性别是: 男, 拥有18粉丝
用户: 钱正强 的性别是: 女, 拥有26粉丝
Process finished with exit code 0
6 完整代码附录
最后附上完整代码,如果没有运行成功,请检查两个txt目录是否正确,encoding = 'utf-8'是否加上:
import string
last_name_path = 'C:/Users/xiaokai/Documents/210 - Learning - 编程/Python练习/last_name.txt'
first_name_path = 'C:/Users/xiaokai/Documents/210 - Learning - 编程/Python练习/first_name.txt'
first_name = []
last_name1 = []
last_name2 = []
# 开始读取姓氏
with open(first_name_path, 'r', encoding = 'utf-8') as f:
for line in f.readlines():
first_name.append(line.split('\n')[0])
first_name = tuple(first_name)
print(first_name)
# 开始读取名字
with open(last_name_path, 'r', encoding = 'utf-8') as f:
for line in f.readlines():
if (1 == len(line.split('\n')[0])):
last_name1.append(line.split('\n')[0])
elif (2 == len(line.split('\n')[0])):
last_name2.append(line.split('\n')[0])
last_name1 = tuple(last_name1)
last_name2 = tuple(last_name2)
print(last_name1)
print(last_name2)
print('='*70)
# 定义一个父类
import random
class FakeUser:
def fake_name(self, num, one_word = False, two_word = False):
for i in range(0, num):
if one_word:
full_name = random.choice(first_name) + random.choice(last_name1)
elif two_word:
full_name = random.choice(first_name) + random.choice(last_name2)
else:
full_name = random.choice(first_name) + random.choice(last_name1 + last_name2)
# full_name = random.choice(first_name) + random.choice(last_name)
# i += 1
yield full_name
def fake_gender(self, num):
for i in range(0, num):
gender = random.choice(['男','女'])
yield gender
class SnsUser(FakeUser):
def __init__(self, num):
SnsUser.amount = num
def get_followers(self, few = True, a_lot = False):
j = 0
while (j <= SnsUser.amount):
if few:
followers = random.randrange(1,50)
elif a_lot:
followers = random.randrange(200,10000)
j += 1
yield followers
num = int(input('请问你想创建多少个虚假账号?'))
users_a = SnsUser(num)
for name,gender,followers in zip(users_a.fake_name(num),users_a.fake_gender(num),users_a.get_followers()):
print('用户: {}\t的性别是:\t{}, 拥有{}粉丝'.format(name,gender,followers))
7571



被折叠的 条评论
为什么被折叠?



