Python_光阴不虚度(持续更新)

不适合人类阅读,非常水的自我笔记

Posted by Eli0t on 2020-02-19

Catalog

  1. 基础语法
  2. 爬虫
  3. 报错总结

基础语法

集体注释快捷键:cmd + /

如果 Python2 和 Python3 同时有 pip,则使用方法如下:

  • Python2
    python2 -m pip install XXX
  • Python3:
    python3 -m pip install XXX

告别 Print
相比Print调试往往需要写很多行 Print语 句,使用 PySnooper 仅仅一行代码就能实现对整个函数的调试,更加高效;相比 Logging 模块,使用 PySnooper 无需进行繁琐的配置,更加简单。
import pysnooper

字符串操作

1
2
flag='eli0t'
print(flag[-3:]) # i0t

将字符串转换为字节包

1
2
junk = "aaaabaaa"
junk.encode() # 就这样。。。

字符串转数组

1
2
flag=",1,2,w,e,d,f,g,v,b,5,6,t,y,u,j,k"
flag=flag.split(",")

字符串转数组

1
2
flag = "{'status': '1', 'info': 'OK', 'infocode': '10000', 'province': '香港特别行政区', 'city': '香港特别行政区', 'adcode': '810000', 'rectangle': '113.6340702,22.01163526;114.6531701,22.69765408'}"
flag = ast.literal_eval(flag)

数组转字符串

1
2
3
flag=['1','2','3','4']
flag=",".join(flag)
#flag=1,2,3,4

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

1
2
3
4
str = "00000003210Runoob01230000000"; 
print str.strip( '0' ); # 去除首尾字符 0
str2 = " Runoob "; # 去除首尾空格
print str2.strip();

利用 python 生成终端

1
2
python -c 'import pty; pty.spawn("/bin/bash")'
#渗透中使用可以获取一个稳定的shell用处大

if name == “main“: 原理

python中“if name==’main‘:”理解与总结
使模块导入时较为方便,“name”是Python的内置变量,用于指代当前模块。

os 与 sys

1
print(os.getcwd)

sys.argv[ ]的用法解释
sys.argv[0]指的是此 py 程序
sys.argv[1]指的是后面加的第一位参数
sys.argv[1:]指的是后面加的所有参数

文件操作

1
2
3
pic="flag"
with open("./flag.txt","r") as file:
file.write(pic)

schedule将时间⌚️加入程序(这里举例的很简单,还有多线程的)

1
2
3
4
5
6
7
8
import schedule
import time
def more():
print("Hey!")
schedule.every(10).seconds.do(more)
while True:
schedule.run_pending()
time.sleep(2) #这个是一定要的

编码检测

chardet.detect()

1
2
3
import chardet
data = '最新の主要ニュース'.encode('euc-jp')
print(chardet.detect(data))

输出{'encoding': 'EUC-JP', 'confidence': 0.99, 'langu age': 'Japanese'}

python编码,普通文章
ASCII编码:只能表示127个字符。
GB2312编码:中国的文字编码,2个字节表示一个字符。
Unicode编码:万国码,也用2个字节存储一个字符。
utf-8编码:utf-8编码把存储英文依旧用一个字节,汉字就3个字节。特别是生僻的编程4-6字节,如果传输大量英文,utf-8作用就很明显了。

utf-8编码进行存储时有极大地优势,但是当读取到计算机内存时却不大合适,因为utf-8编码是变长的,不方便寻址和索引,所以在计算机内存中,还是转化为Unicode编码合适些。这就可以解释为什么每次读取文本时,要将编码转化为Unicode编码,而将内存中的字符写入文件存储时,要将编码转化为utf-8了。

二进制文件编码

data.encode("euc-jp")

网页文件(字符串)编码

re.encoding="utf-8"

发送邮件smtplib

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
import smtplib
#smtplib 用于邮件的发信动作
from email.mime.text import MIMEText
from email.header import Hesder as H

test='''
Hello Eli0t!
I am you.
python is amazime.
'''
from_addr="XXXXXXX" #发送人邮箱📮
password="XXXXXXX" #邮箱的POP3/SMTP授权码
to_addrs=["XXXXXXXX","XXXXXXXX"] #收信人邮箱📮
smtp_server="smtp.qq.com"
msg=MIMEText(text,"plain","utf-8") #正文内容
msg["from"]=H(from_addr)
msg["to"]=H(",".join(to_addrs))
msg["subject"]=H("python test")

server = smtplib.SMTP_SSL(smtp_server) #加密传输
server.connect(smtp_server,465)
#邮箱POP3服务器:pop.qq.com(端口995)
#邮箱SMTP服务器:smtp.qq.com(端口465或587)
server.login(from_addr,password)
server.sendmail(from_addr,to_addrs,msg.as_string())
server.quit()

示例:
smtp

爬虫

网页源码编码检测(我目前只会用request库的这种方法)

1
2
3
4
import urllib.request as ur
import chardet
data = ur.urlopen("http://www.ybm911.work").read()
print(chardet.detect(data))

BeautifulSoup

1
2
3
4
5
6
7
8
9
10
11
import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
html = res.text
soup = BeautifulSoup( html,'html.parser')
items = soup.find_all(class_='books')
for item in items:
kind = item.find('h2')
title = item.find(class_='title')
brief = item.find(class_='info')
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text)

应对AJAX

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
import requests
import json
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'

headers = {
'referer':'https://y.qq.com/portal/search.html',
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}

for x in range(5):

params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'sizer.yqq.lyric_next',
'searchid':'94267071827046963',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'sem':'1',
't':'7',
'p':str(x+1),
'n':'10',
'w':'周杰伦',
'g_tk':'1714057807',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
res = requests.get(url, params = params)
jsonres = json.loads(res.text)
list_lyric = jsonres['data']['lyric']['list']
for lyric in list_lyric:
print(lyric['content'])

Cookic_session

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
import requests,json
session = requests.session()
#创建会话。
headers = {
'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'
}
#添加请求头,避免被反爬虫。
try:
#如果能读取到cookies文件,执行以下代码,跳过except的代码,不用登录就能发表评论。账号:spiderman;密码:crawler334566
with open('cookies.txt','r') as f:
cookies_dict=json.loads(f.read())
cookies=requests.utils.cookiejar_from_dict(cookies_dict)
#把转成字典的cookies再转成cookies本来的格式。
session.cookies = cookies
#获取会话下的cookies
except FileNotFoundError:
#如果读取不到cookies文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookies,再评论。
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'
#登录的网址。
data = {'log': input('请输入你的账号:'),
'pwd': input('请输入你的密码:'),
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin/',
'testcookie': '1'}
#登录的参数。
session.post(url, headers=headers, data=data)
#在会话下,用post发起登录请求。
cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
#把cookies转化成字典。
cookies_str = json.dumps(cookies_dict)
#调用json模块的dump函数,把cookies从字典再转成字符串。
with open('cookies.txt','w') as file:
file.write(cookies_str)
''' f = open('cookies.txt', 'w')
#创建名为cookies.txt的文件,以写入模式写入内容
f.write(cookies_str)
#把已经转成字符串的cookies写入文件
f.close()
#关闭文件
'''
url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'
#文章的网址。
data_1 = {
'comment': input('请输入你想评论的内容:'),
'submit': '发表评论',
'comment_post_ID': '13',
'comment_parent': '0'
}
#评论的参数。
session.post(url_1, headers=headers, data=data_1)
#在会话下,用post发起评论请求。

CTF比赛中可用于批量提交flag的库:自动化测试工具🔧selenium

selenium.webdriver可启动Chrome、Firefox、IE。

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
time.sleep(6)
writ=driver.find_element_by_name('wd').send_keys('蜘蛛侠')
btn=driver.find_element_by_id('su')
btn.click()
time.sleep(3)
print('success')
driver.close()

协同爬取monkey

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
from gevent import monkey
monkey.patch_all()
import gevent,requests,bs4,csv,time
from gevent.queue import Queue
work=Queue()
url_1='http://www.boohee.com/food/group/{type}?page={page}'
url_2='http://www.boohee.com/food/view_menu?page={page}'
for t in range(1,10):
for p in range(1,10):
url_real=url_1.format(type=t,page=p)
work.put_nowait(url_real)
for i in range(1,10):
url_real_2=url_2.format(page=i)
work.put_nowait(url_real_2)


#定义crawler函数
def crawler():
headers={
'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'
}
while not work.empty():
url=work.get_nowait()
res=requests.get(url,headers=headers)
bs_res=bs4.BeautifulSoup(res.text,'html.parser')
foods=bs_res.find_all('li',class_='item clearfix')
for food in foods:
food_name = food.find_all('a')[1]['title']
food_url = 'http://www.boohee.com' + food.find_all('a')[1]['href']
food_calorie = food.find('p').text
writer.writerow([food_name, food_calorie, food_url])

#协程爬取
task_list=[]
for x in range(10):
task=gevent.spawn(crawler)
task_list.append(task)

csv_file=open('calorie.csv','w',newline='')
writer=csv.writer(csv_file)
writer.writerow(['food name','food calorie','food url'])

start=time.time()
gevent.joinall(task_list)
end=time.time()
print(end-start)

报错总结

pip换源

pip国内的一些镜像

1
2
3
4
5
  阿里云 http://mirrors.aliyun.com/pypi/simple/ 
  中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  豆瓣(douban) http://pypi.douban.com/simple/
  清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

修改源方法:

临时使用:
可以在使用pip的时候在后面加上-i参数,指定pip源
eg: pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com virtualenv

永久修改:
linux:
修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

速度飞起来了

linux下安装pip

1
2
3
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip -V #查看pip版本

再查下安装路径:
find / -name pip
然做个软连接
ln -sv /usr/local/python/bin/pip /usr/bin/pip

python打开的当前文件目录下的a.txt,报错文件未找到

你可以看看当前路径是什么。

1
2
import os
print os.getcwd()

通常情况下, 当前目录是肢本文件或python.exe 所在的目录。

参考链接

PIP 更换国内安装源:https://blog.csdn.net/yuzaipiaofei/article/details/80891108
https://zhuanlan.zhihu.com/p/68217206