我要成为python高手

安装python

python的安装,非常简单,这一步跳过,B站上很多大佬讲过。

声明:本次笔记参考B站大佬林粒粒呀 及菜鸟教程

print函数

初学python,这是我们认识的第一个函数,它可以很好的打印出字符串

print('我要成为python高手!')
print("hello! \n hi")

python的变量

python的变量是用来储存和代值的,它得有个名字,然后对它进行赋值,python是从上到下执行,所以需要先对变量赋值,然后才可以正常使用。变量命一般用数字,字母,下划线组成,一个好的项目文档,里面会有介绍如何取变量名。

a = 74
b = 56
c = a + b
print(c)
eating = "晚饭次什么呢?"
eating_not = "窝不想次"
eating_do  = "窝要次"
eating = eating_do

print(eating + "苦瓜汁")
print(eating + "南瓜汁")
print(eating + "香蕉汁")

#窝要次苦瓜汁
#窝要次南瓜汁
#窝要次香蕉汁

python的数学运算

说到python数学的运算,加减乘除就不介绍了,最重要的库就是math啦,极大减小了我们的操作性,我们可以通过math的官方文档来使用它

import math
result = math.log2(8)
print(result)
#3.0

#经典求根公式
x1 = print((-b + math.sqrt(b**2-4*a*c)) / (2*a*c))
x2 = print((-b - math.sqrt(b**2-4*a*c)) / (2*a*c))

python的数据类型----摘抄菜鸟教程

  • Number(数字)-------------Python3 支持 int、float、bool、complex(复数)

  • String(字符串)--------------Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。

  • bool(布尔类型)------------布尔类型即 True 或 False。True 和 False 都是关键字,表示布尔值。

  • List(列表)-----------------List(列表) 是 Python 中使用最频繁的数据类型。

  • Tuple(元组)---------------元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

  • Set(集合)---------------Python 中的集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素。

  • Dictionary(字典)-----------字典(dictionary)是Python中另一个非常有用的内置数据类型。

#对字符串求长度
a = "我要成为python高手"
print(len(a))

#索引获取字符,0开始
print(a[0])

#布尔类型
a1 = True
a2 = False

#空值
a3 = None

#type
print(type(a1))

input函数

input是python里面一个常见的获取输入的函数,它可以获取的用户的数据,它可以返回输入的结果(字符串)

age = int(input("您的年龄是:"))
age_10year = age + 10
print("您10年后的年龄是" + str(age_10year))

python的条件判断

1.条件判断

if [条件]: 布尔值判断真假

[执行条件]

else [条件]:

[执行条件]

肚子饿指数 = int(input("输入当前的指数:"))
if 肚子饿指数 <= 50:
	print("我要喝苦瓜汁,谢谢")
else:
	print("谢谢,我还不饿")

2.嵌套条件语句

if [条件1]:

if [条件2]:

[语句A]

else:

[条件B]

else:

[条件C]

elif嵌套

if [条件1]:

[语句A]

elif [条件2]:

[语句B]

elif [条件3]:

[语句C]

else:

[语句D]

逻辑运算

处了嵌套。有时候还可以使用逻辑运算

if (wddzel > 10 and nddzel > 11 and taddzel > 15 and dajiddzel >20):
	print("次饭")
else:
	print("不饿呢")

python列表

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型,列表是可变的,增加或者修改

list_1 = ["苦瓜","鸡蛋"]
list_1.append("西红柿")
list_1.remove("鸡蛋")
print(list_1)
print(len(list_1))

#列表2
list_2 = [87,89,54,74,0]
# print(min(list_2))
list_2_min = min(list_2)
list_2_max = max(list_2)
list_2_sorted = sorted(list_2)
print(list_2_min)
print(list_2_sorted)

python字典

字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {}

dIct_1 = {key1 : value1, key2 : value2 }
#增
dict_1[key3]=value3
#删
dict_1[key1]=value1
print(dict_1)


#查询
dIct_1 = {key1 : value1, key2 : value2 }
chaxun = input("你要查什么:")
if chaxun in dict_1:
    print("我在这里!"+ chaxun  )
    print(dict_1[chaxun])
else:
    print("找不到呢")
print("现在有" + str(len(dict_1))+"个值")

for循环

重复执行语句

for 变量名 in 可迭代对象

#对变量操作

list = [66,54,74,23,45,68,12,13]
for vale in list:
	if vale > 10:
		print(vale)
	

#结合range函数使用
toal = 0
for i in range(1,101):
	toal = toal + i
print(toal)

while循环

while 条件A:

行动B

count = 0
while count < 60:    
    print("oi")
    count += 1



list1 = ["兄","弟","你","好","香"]
i = 0
while i < len(list1):
    print(list1[i])
    i +=1

现在我们尝试用while来实现对输入的数字求平均值

total = 0
count = 0

user_vale = input("请输入:")
while user_vale != "q":
    num = float(user_vale)
    # total = num + total
    total += num
    count += 1
    user_vale = input("请输入:")
if count == 0:
    result = 0
else:
    result = total / count
print(result)

格式化字符串

format方法,指定替换一些内容

DRY原则----初识函数

Don't Repeat Yourself 写代码时尽量去避免一些重复的事,函数可以很好的把我们避免一些重复的事,自定义函数使用def:格式如下

def sanxing():
    cental_angle_1 = 160
    radius_1 = 30
    sector_area_1 = cental_angle_1 / 360 * 3.14 * radius_1  **2
    print(f'这个扇形的面积是:{sector_area_1}')



#sanxing()



#改进,传参,
def sanxing(cental_angle_1, radius_1):
    # cental_angle_1 = 160
    # radius_1 = 30
    sector_area_1 = cental_angle_1 / 360 * 3.14 * radius_1  **2
    print(f'这个扇形的面积是:{sector_area_1}')



sanxing(60,80)

函数需要调用才会被执行。上面的代码有一些小小的问题,现在我们需要了解一下什么是作用域

作用域:我们在函数里面定义的变量都是局部变量,在函数之外无法访问,像这样


def fun():
    a = 5
    print(a)


print(a)

#NameError: name 'a' is not defined

现在return的作用就体现了,它会在函数调用后,返回我们想要它返回的东西

def fun():
    a = 5
    print(a)
    return(a)


print(fun())

return 的默认返回值是空值,来一个小小的练习,BMI计算器

def BMI(weight,height):
    BMI = weight / height **2 
    if BMI <= 18.5:
        category = "偏瘦"
    elif 18.5 <= BMI <= 25:
        category = "正常"
    elif BMI <= 30:
        category = "偏胖"
    else:
        category = "肥胖"
    print(f'您的分类为:{category}')
    return BMI

reselt=BMI(21,80)
print(reselt)

模块的使用

python大佬们提供了大量的第三方库,我们可以直接拉来用

pip install 模块

引入模块的三种方法

import math | form ... import .... | form...import *

我们也可以去python的标准库找,以及pypi.org这个网站

面向对象编程---oop(菜鸟教程摘抄)

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。

如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。

接下来我们先来简单的了解下面向对象的一些基本特征。

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

  • 局部变量:定义在方法中的变量,只作用于当前实例的类。

  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。

  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

  • 实例化:创建一个类的实例,类的具体对象。

  • 方法:类中定义的函数。

  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

现在我们来尝试实例化对象

class xts:
    def __init__(self,age,name,sex):
        self.age = age
        self.name = name 
        self.sex = sex


xts1 = xts(20,"xts","nv")
print(xts1.name)
print(xts1.age)
print(xts1.sex)

定义对象的方法,方法可以表示对象可以做那些事,现在有一个这样的需求



#定义一个学生类
#学生名字 学号 成绩
#能够打印三科成绩


class student:
    def __init__(self,name,student_id):
        self.name = name
        self.studentd_id = student_id
        self.grades = {"语文": 0,"数学":0,"英语":0}

#调用方法
    def speak(self,course,grade):
        if course in self.grades:
            self.grades[course] = grade

    def print_grades(self):
        print(f'学生{self.name} 学号{self.studentd_id} 的成绩是:')
        for course in self.grades:
            print(f'{course}:{self.grades[course]}分')


#实例化对象
xts = student("小天使","10001")
xts.speak("语文",100)
xts.speak("数学",100)
xts.speak("英语",100)
# print(xts.name,xts.studentd_id,xts.grades)
print(xts.grades)
xts.print_grades()

类的继承

Python中类的继承也就是一个类继承另一个类的话,便可以拥有所继承类的所有属性和方法,此时使用起来不仅方便且节省代码量。就像遗传的那样,儿子会继承父亲的一些特征

class Mammal:
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
        self.num_eye = 2

    def breathe(self):
        print(self.name + "会呼吸")

    def eat(self):
        print(self.name + "要干饭")

#子类
class Human(Mammal):
    def read(self):
        print(self.name + "会看书")      
        

#子类2 猫猫
class cat(Mammal):
    def read(self):
        print(self.name + "在撒娇")

        
xts = Human("小天使","女")
print(xts.name,xts.sex)
xts.breathe()
xts.read()


maomao = cat("喵喵","母")
print(maomao .name,maomao.sex)
maomao.breathe()
maomao.read()


#super方法

# 父类

class Mammal:
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
        self.num_eye = 2

    def breathe(self):
        print(self.name + "会呼吸")

    def eat(self):
        print(self.name + "要干饭")

#子类 引入super方法
class Human(Mammal):
    def __init__(self, name, sex):
        super().__init__(name, sex)
        self.has_tail = False




    def read(self):
        print(self.name + "会看书")      
        

#子类2 猫猫
class cat(Mammal):
    def __init__(self, name, sex):
        super().__init__(name, sex)
        self.has_tail = False


    def read(self):
        print(self.name + "在撒娇")

        
xts = Human("小天使","女")
print(xts.name,xts.sex)
xts.breathe()
xts.read()


maomao = cat("喵喵","母")
print(maomao .name,maomao.sex)
maomao.breathe()
maomao.read()

做个小练习,巩固一下吧

#类的继承练习:人力系统
#员工分为两类 全职员工 FulltimeEmployee 兼职员工 ParttimeEmployee
#全职和兼职都要姓名 工号等属性
#都具备打印信息 print_info (打印姓名 工号的方法)
#全职有'月薪' calculate_monthly_pay属性
#兼职有日薪daily_salary 每月工作天数 work_days 属性
#全职和兼职都有计算月薪 calculate_monthly_pay的方法,但具体计算方法不一样

class Employee:
    def __init__(self,name,id):
        self.name = name
        self.id = id 

    def print_info(self):
        print(f'员工{self.name },工号是{self.id}')



#全职员工
class FulltimeEmployee(Employee):
    def __init__(self, name, id,monthly_salary):
        super().__init__(name, id)
        self.monthly_salary = monthly_salary

    def calculate_monthly_pay(self):
        return self.monthly_salary
    

#兼职员工
class ParttimeEmployee(Employee):
    def __init__(self, name, id,daily_salary,workdays):
        super().__init__(name, id)
        self.daily_salary = daily_salary 
        self.workdays = workdays


    def calculate_monthly_pay(self):
        return self.daily_salary * self.workdays
    

xts = FulltimeEmployee("小天使","10001","3K")
xxts = ParttimeEmployee("小小天使","10002",8,23)
result=xxts.calculate_monthly_pay()
print(result)

文件操作

目录结构就像树根一样,/表示根目录,一切的文件和目录都在根目录下面,windowns的每个磁盘都有根目录。

绝对路径:从根目录出发,以/开头 C:\hmoe\data\a.py

相对路径:从参照目录出发 data\a.py

很多编辑器可以帮我们复制路径,所以不用担心

现在我们来用python来操作文件。

#读文件的方法
f = open('./data.txt',"r",encoding="utf-8")
print(f.read())
#read会占用大量的内存 传入字节可以避免这个问题
print(f.read(10))

#readline 只会读一行的内容

line = f.readline() #读第一行

while line != "":  #判断当前行是否为空
    print(line)    #不为空则打印下一行

    line = f.readline() #读取下一行


# readlines的用法 结合for循环使用
f = open('./data.txt',"r",encoding="utf-8")
lines = f.readlines() #把每行内容都存储在列表里
for line in lines:
    print(line)

#读完要记得关闭文件
f.close()

#法2
with open("文件路径") as f:
    print(f.read)

上面学习了读文件,那么接下来怎么写呢?非常简单。


#写文件
#和读文件差不多 也是要先打开
#如果已经存在了该文件,那么用W模式会把原文件清空
with open("文件路径","w",encoding="utf-8") as f:
    f.write("fgdhjubdshj!\n")

#a模式表示追加内容
with open("文件路径","a",encoding="utf-8") as f:
    f.write("hello world!")

#读写模式
with open("文件路径","r+a",encoding="utf-8") as f:
    f.write("hello world!")


# 实践时间
with open("./paem.txt","w",encoding="utf-8") as f:
    f.write("我是小天使\n")
    f.write("成功地当上了客服\n")

with open("./paem.txt","a",encoding="utf-8") as f:
    f.write("工资1800\n")
    f.write("每天笑哈哈\n")

来到这里。你已经非常棒了,接下来我们学习python的异常处理,避免程序炸了

# #异常的类型,列如
number_list = [56,23,-5,96]
# number_list[4]  #IndexError: list index out of range 索引错误

print(56 / 0) #ZeroDivisionError: division by zero 除零错误

f = open("./ht,txt","r")  #FileNotFoundError: [Errno 2] No such file or directory: './ht,txt'  找不到文件错误

i = 'jfddf' * 'fkhjdl' 
print(i) #TypeError: can't multiply sequence by non-int of type 'str' 类型错误
#异常类型非常的多,写的越多,错的越多,趁早放弃才是正途,哈哈哈,开个玩笑

#平时就应该多测试,把bug找出来,如果是客户的问题,那我们可以预判一波
try:    #可能出现异常的代码
    o = float(input("需要一个数字:"))
except ValueError:
    print("您输入的不是数字,请重新运行程序")

except: #把所有的问题都指向一个问题
    print("发生了未知的错误,请重新运行")

finally:   #不管错误是否发生,都会运行
    print("程序结束运行")


#测试是非常重要的

bug是什么?让程序跑不起来的东西,只要写代码,就不存在不写bug的程序员

python爬虫实战

爬虫的基本原理----转载在腾讯云爬虫0126

经过了上面的学习,已经掌握了python的基础,现在我们可以尝试做一些有趣的东西,比如,爬虫。什么的爬虫

爬虫是一种自动化程序,能够模拟人类的浏览行为,从网络上获取数据。爬虫的工作原理主要包括网页请求、数据解析和数据存储等几个步骤。本文将详细介绍爬虫的基本工作原理,帮助读者更好地理解和应用爬虫技术。

首先,爬虫的第一步是网页请求。爬虫需要向目标网站发送HTTP请求,获取网页的内容。在发送请求之前,爬虫需要确定要爬取的目标网址,并选择合适的请求方法(如GET或POST)。爬虫还可以设置请求头部信息,模拟浏览器的请求,以避免被网站的反爬虫机制拦截。一旦发送了请求,爬虫就会等待服务器的响应,获取网页的内容。

接下来,爬虫需要对获取到的网页内容进行解析。网页通常是使用HTML、XMLJSON等标记语言编写的,爬虫需要根据网页的结构和规则,提取出需要的数据。爬虫可以使用解析库(如BeautifulSoup、lxml等)来解析网页,提取出标签、属性、文本等信息。爬虫还可以使用正则表达式来匹配和提取特定的数据。解析网页的过程中,爬虫还可以进行数据清洗和处理,以获取更加干净和规范的数据。

最后,爬虫需要将解析后的数据进行存储。爬虫可以将数据保存到本地文件或数据库中,以便后续的分析和应用。爬虫可以使用文件操作库(如csv、json、pickle等)来保存数据到文件中,也可以使用数据库操作库(如MySQLMongoDB等)来保存数据到数据库中。在存储数据的过程中,爬虫还可以进行去重和去噪的操作,以确保数据的唯一性和准确性。

爬取音乐---网易云

源码如下,它可以帮我获取到https://music.163.com/discover/toplist?id=19723756这个网页里面的音乐,并把它们存放在xtsza这个文件夹里面

import requests
import re
import os

#网易云的爬取

#新建文夹夹
filename = 'xtsza\\'
if not os.path.exists(filename):
    os.mkdir(filename)

url = 'https://music.163.com/discover/toplist?id=19723756'
# url = 'https://music.163.com/my/m/music/playlist?id=2693688039'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
}
response = requests.get(url = url,headers=headers)
# print(response.text)

#正则表达,获取歌名和id
html_data = re.findall('<li><a href="/song\?id=(\d+)">(.*?)</a>',response.text)
# print(html_data)

#遍历网页的数据,使用接口下载
for num_id,title in html_data:
# http://music.163.com/song/media/outer/url?id={music}.mp3
    music_url = f'http://music.163.com/song/media/outer/url?id={num_id}.mp3'
    music_content=requests.get(url=music_url,headers=headers).content
    #保存
    with open(filename+ title +'.mp3',mode='wb') as f:
        f.write(music_content)

    print(num_id,title)

我们可以到该文件夹查看这些音乐。

爬取小说

爬虫也可以爬取小说,并将它们以txt文本文件的形式保存的下来,这里我选择了非常火的小说蛊真人为例子,话不多说,直接看源码吧

#爬取小说蛊真人
import requests
from bs4 import BeautifulSoup
import time

# 小说基础URL
base_url = "https://wap.biqige.info/0/573/"
output_file = "蛊真人2.txt"

# 自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
}

# 抓取并保存章节内容
def fetch_and_save_chapter(chapter_url):
    response = requests.get(chapter_url, headers=headers)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, "html.parser")

        # 定位内容部分,确认使用正确的 class
        content = soup.find("div", class_="novelcontent")  # 确保这个 class 是正确的
        title = soup.find("title")  # 获取章节标题

        # 如果标题中包含特定字符,提取所需部分
        if title:
            chapter_title = title.get_text().split(" - ")[0]  # 可能需要调整,根据实际格式
        else:
            chapter_title = "未知章节"

        if content:
            with open(output_file, "a", encoding="utf-8") as file:
                file.write(chapter_title + "\n")  # 使用获取到的章节标题
                file.write(content.get_text(separator="\n") + "\n\n")
            print(f"已保存章节:{chapter_title}")
        else:
            print(f"章节内容未找到: {chapter_url}")
    else:
        print(f"无法访问章节:{chapter_url},状态码:{response.status_code}")

# 抓取某一章节的所有分页
def fetch_chapter_with_pagination(chapter_id):
    page_number = 1  # 从第一页开始
    while page_number<=3:
        chapter_url = f"{base_url}{chapter_id}-{page_number}.html"  # 拼接章节URL
        response = requests.get(chapter_url, headers=headers)

        if response.status_code == 200:
            fetch_and_save_chapter(chapter_url)
            page_number += 1  # 进入下一页
            time.sleep(1)  # 添加延时,避免被封禁
        else:
            # 如果返回状态码不是200,说明没有更多的页面了
            print(f"章节 {chapter_id} 的所有页面已抓取完毕。")
            break

# 抓取所有章节
def fetch_all_chapters(start_chapter, end_chapter):
    for chapter_id in range(start_chapter, end_chapter + 1):
        fetch_chapter_with_pagination(chapter_id)  # 抓取每个章节的所有页面
        time.sleep(1)  # 添加延时,避免被封禁

# 调用函数,开始抓取章节
fetch_all_chapters(start_chapter=517662, end_chapter=19765683)

有些小说存在分页的情况,导致每一章只能爬取一部分,这也是我爬取的过程中遇到的一些问题,查阅了一些资料,勉勉强强的解决了,果然是活到老,学到老。爬取小说的大致情况就是这样了

爬取动画片

虽然现在我们的网络相当的发达,随时随地都会在网站上看到各种各样的的动画片,可是,总会有那么些时间,存在一些空白期,比如,高铁或者飞机上,这个时候想看动画片怎么办。聪明的你一定想到了,提前缓存好,是的,这是一个好办法,一集一集的下载又太麻烦了,现在就可以用到我们的爬虫技术了,下面找了一部我非常喜欢的动漫---黑皮女仆与少爷,虽然很好看,但是B站里面没有,呜呜呜

import os
import requests
import time
from tqdm import tqdm

# 创建存放视频的文件夹
download_folder = 'nvpu'
if not os.path.exists(download_folder):
    os.makedirs(download_folder)

# 基础 URL 和集数范围
base_url = "https://play.xfvod.pro/X/X-%E6%96%B0%E6%9D%A5%E7%9A%84%E5%A5%B3%E4%BD%A3%E6%9C%89%E7%82%B9%E6%80%AA/"
total_episodes = 11

def download_video(episode_number, retries=3):
    # 拼接每集的 URL
    episode_url = f"{base_url}{episode_number:02}.mp4"
    video_path = os.path.join(download_folder, f"episode_{episode_number:02}.mp4")
    print(f"正在下载第 {episode_number} 集,保存为: {video_path}")

    # 设置请求重试机制
    for attempt in range(retries):
        try:
            # 发送请求,获取文件大小
            response = requests.get(episode_url, stream=True, timeout=10)
            
            # 检查请求状态
            if response.status_code == 200:
                total_size = int(response.headers.get('content-length', 0))
                with open(video_path, "wb") as video_file, tqdm(
                    total=total_size, unit='B', unit_scale=True, desc=f"第 {episode_number} 集"
                ) as progress_bar:
                    for chunk in response.iter_content(chunk_size=1024):
                        if chunk:
                            video_file.write(chunk)
                            progress_bar.update(len(chunk))
                print(f"第 {episode_number} 集下载完成!\n")
                return
            else:
                print(f"第 {episode_number} 集请求失败,状态码: {response.status_code}")
                break
        except requests.RequestException as e:
            print(f"第 {episode_number} 集下载失败,尝试 {attempt + 1}/{retries} 次。错误: {e}")
            time.sleep(2)  # 等待 2 秒后重试

    print(f"第 {episode_number} 集下载失败,跳过。")

# 执行下载
for episode in range(1, total_episodes + 1):
    download_video(episode)
    time.sleep(1)  # 等待 1 秒,避免请求过于频繁

print("全部视频下载完成!")

视频文件太大了,加上进度条效果更好,等待下载完成,就可以在对应的文件夹里面看到了了。

声明

使用爬虫请在合法的条件下进行,侵犯别人的权益是非常不合法的