2023/1/31
关于论坛后端接口编写小结
1,了解小程序原型图流程和细节性的东西
2,数据库关联结构仔细分析,找到最容易查询的关键字段,标语表之间靠什么关联
2023/2/10
在小程序抓包过程中,如果要实现批量抓取,必须解决cookie问题,但是cookie值太多,对比当前用户COOKIE 进行筛选,缩小范围,找到关键参数值
源码js关键字找不到,寻找加密方式找不到, 跳转思路可能set-cookie在跳转页面里面,如果还找不到,则从头开始走流程用charles抓。
302跳转,cookie 在服务端怎么拿可用找到参数直接调用,cookie参数值在本地怎么拿 allow_redirects=False 默认为True
2023/2/13
关于多线程,多进程以及python 线程池的了解和使用
多进程:对系统的cup资源进行最大的利用
多线程:对系统分配给当前进程的cup资源进行最大限度的运用
window 核心是主多线程 liunx核心主是多进程,每一个请求开出一个进程
可用将多线程理解为多个人多张桌子吃饭
多进程可用理解为多个人在同一张桌子吃饭
进程是系统资源分配的基本单位,线程是进程资源分配的基本单位
关于python中concurrent.futurn的应用
协程案例
# python 源码
import asyncio
import requests
import time
async def result(url):
res = await request_url(url)
print(url, res)
async def request_url(url):
res = requests.get(url, proxies={'https': None, 'http': None}, verify=False)
print(url)
await asyncio.sleep(2)
print("execute_time:", time.time() - start)
return res
url_list = ["https://www.csdn.net/",
"https://blog.csdn.net/qq_43380180/article/details/111573642",
"https://www.baidu.com/",
]
start = time.time()
print(f"start_time:{start}\n")
task = [result(url) for url in url_list]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task))
endtime = time.time() - start
print("\nendtime:", time.time())
print("all_execute_time:", endtime)
websocket优化
#服务端
import asyncio
import websockets
IP_ADDR = "127.0.0.1"
IP_PORT = "8888"
# 握手,通过接收hello,发送"123"来进行双方的握手。
async def serverHands(websocket):
while True:
recv_text = await websocket.recv()
print("recv_text=" + recv_text)
if recv_text == "hello":
print("connected success")
await websocket.send("123")
return True
else:
await websocket.send("False")
return None
# 接收从客户端发来的消息并处理,再返给客户端ok
async def serverRecv(websocket):
while True:
recv_text = await websocket.recv()
print("recv:", recv_text)
if recv_text !='exit':
await websocket.send("ok!!!")
# 握手并且接收数据
async def serverRun(websocket, path):
print(path)
if await serverHands(websocket):
while True:
try:
await serverRecv(websocket)
except:
continue
# main function
if __name__ == '__main__':
print("======server main begin======")
server = websockets.serve(serverRun, IP_ADDR, IP_PORT,ping_interval=None)
asyncio.get_event_loop().run_until_complete(server)
asyncio.get_event_loop().run_forever()
#客户端
import asyncio
import websockets
IP_ADDR = "127.0.0.1"
IP_PORT = "8888"
# 握手,通过发送hello,接收"123"来进行双方的握手。
async def clientHands(websocket):
while True:
await websocket.send("hello")
response_str = await websocket.recv()
if "123" in response_str:
print("握手成功")
return True
else:
return False
# 向服务器端发送消息
async def clientSend(websocket):
while True:
name='小王'
input_text = input(f"{name}: ")
if input_text == "exit":
print(f'"exit", bye!')
await websocket.send(input_text)
await websocket.close(reason="exit")
return False
await websocket.send(input_text)
recv_text = await websocket.recv()
print(f"{recv_text}")
# 进行websocket连接
async def clientRun():
ipaddress = IP_ADDR + ":" + IP_PORT
async with websockets.connect("ws://" + ipaddress, ping_interval=None) as websocket:
if await clientHands(websocket):
await clientSend(websocket)
# main function
if __name__ == '__main__':
print("======client main begin======")
asyncio.get_event_loop().run_until_complete(clientRun())
2023/2/16
DATABASE = os.path.join(os.path.dirname(__file__), "db.sqlite3")
os.path.join 表示路径链接 os.path.dirname(__file__) 表示当前脚本的路径
from flask import Flask,request,jsonify,g
数据库中的g表示全局变量
flask数据库链接
def connect_db():
db = getattr(g, 'db', None)
if db is None:
conn = sqlite3.connect(DATABASE)
conn.row_factory = lambda cursor, row: {
key: value for key, value in zip([col[0] for col in cursor.description], row)
}
db = g.db = conn
return db
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def close_db(exception):
if hasattr(g, 'db'):
g.db.close()
'select name,grade,commentNum,cityName,sceneryThemeName from dataList where cityId=? limit ? offset ?',(spiderid,pagesize,offset, 在sqlite3里面可用?代替字符
2023/2/21
请求参数一切正常,但是接口还是调不通说明请求头的 'content-type':m.content_type, 可能不同 或者 没有 'accept': '*/*', 尽量保持请求头和保持抓包接口一致
关于MultipartEncoder对参数进行封装的用法和django文件参数的接受
m=MultipartEncoder(fields={'id':'WU_FILE_0','name': imge_file.name,'type':imge_file.content_type,'lastModifiedDate':now_time,'size':str(imge_file.size),'file':(imge_file.name,imge_file.read(),imge_file.content_type)},boundary=boundary)
爬虫有情况可以储存原json,关键时候前后端交互有妙用