图书馆预约脚本新版个人版_requests

script_for_PG

由于之前图书馆敏感的原因下线了GitHub的仓库,也被图书馆管理员叫去谈话,只能在博客里面做一下记录吧,这个是午休期间可以维持座位的脚本,测试可用仅限于四楼东侧座位,其余座位需要轻微修改,早上的预约脚本中mylist可以根据个人需求修改座位号。

日后希望能做出一个完整版个人预约服务脚本,然后放在校内师兄服务器上运行,个人电脑的运行环境不稳定,可能因为宿舍网络原因导致预约失败。

午休脚本

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#!/usr/bin/env python3
# @Author : Guoguo
# @Blog :https://gwyxjtu.github.io
import os
import time
import json
import base64
import requests
from Crypto.Cipher import AES
import re
from lxml import etree
from threading import Thread
import datetime

class XJTUUser(object):

def __init__(self, config_file_path='./config.json'):
with open(config_file_path) as config_file:
config = json.loads(config_file.read())
self.config = config
self.is_login = False
self.session = requests.Session()
self.session.headers.update(config['headers'])
self.session.cookies.update(config['cookies'])


def login(self):
#--------------------------------------
self.weizhi = ''
def vxpush(self,msg):
url = 'http://wxpusher.zjiecode.com/api/send/message'
uid = ''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Content-Type':'application/json;charset=UTF-8'
}
data = {
'appToken':'',
'content': msg,
'contentType':1,
'uids':[uid]
}
print(requests.post(url,headers=headers,json=data).text)

def check_my_seat(self):#返回你的座位字符穿
r = self.session.get('http://rg.lib.xjtu.edu.cn:8010/my/')
dom = etree.HTML(r.text)
a_text = dom.xpath('/html/body/div[2]/center/div[1]/div/div/div/div/div/div[1]/h3/text()[2]')
ans = re.findall('\d+', a_text[0])[0]
#print()
self.weizhi = a_text[0].split('\xa0')[-1].split('\n')[0]
jjj = dom.xpath('/html/body/div[2]/center/div[1]/div/div/div/div/div/div[2]/center/h3[1]')
if(len(jjj)<1):
return 0;
if jjj[0].text == '已取消' or jjj[0].text == '已离馆' or jjj[0].text == '超时未入馆':
vxpush(self,self.config['username']+'没弄上,出现错误')
print(self.config['username']+'没弄上,出现错误')
return 0
else:
vxpush(self,self.config['username']+'弄好了,当前位置'+ans)
print(self.config['username']+'弄好了'+ans)
return 1


def cancel(self):
try:
r = self.session.get("http://rg.lib.xjtu.edu.cn:8010/my/")
pattern = re.compile("cancelconfirm\('(.*?)'\);", re.S)
yu_id = re.findall(pattern, r.text)[0]
print(yu_id)
self.session.get("http://rg.lib.xjtu.edu.cn:8010/my/?cancel=1&ri=" + yu_id)
#微信通知
vxpush(self,'取消成功')
print("取消成功")
return 1
except Exception as e:
print("取消失败\n" + str(e))
return 0
#预约座位
def reserve(self,kid,sp):
r = self.session.get('http://rg.lib.xjtu.edu.cn:8010/ruguan')#入关
#print('--------------------------')
nn = r.text.find('<input id="csrf_token" name="csrf_token" type="hidden" value=')
tok = r.text[nn+1+len('<input id="csrf_token" name="csrf_token" type="hidden" value='):nn+56+len('<input id="csrf_token" name="csrf_token" type="hidden" value=')]
#print(r.text[nn+1+len('<input id="csrf_token" name="csrf_token" type="hidden" value='):nn+56+len('<input id="csrf_token" name="csrf_token" type="hidden" value=')])
data={
'csrf_token':tok,
'csrf_token':tok,
'service':'seat',
'submit':'%E6%8F%90%E4%BA%A4',
'rplace':'east'
}#入关post,比较麻烦
r = self.session.post('http://rg.lib.xjtu.edu.cn:8010/ruguan',data = data)#提交

r = self.session.get('http://rg.lib.xjtu.edu.cn:8010/seat/?kid='+kid+'&sp='+sp)
#print(r.text)
#------------------------------新版判断
#兴庆区的,别的区得自行修改了
if check_my_seat(self) == 1:
#vxpush(self,'预约成功'+str(check_my_seat(self)))
#print('预约成功状态'+str(check_my_seat(self)))
return 1
else:
vxpush(self,'预约失败')
print('预约失败')
return 0
# if(sp == 'west3B'):
# r_w3=self.session.get('http://rg.lib.xjtu.edu.cn:8010/qseat?sp=west3B')
# s2 = json.loads(r_w3.text)['seat']
# if(s2[kid] == 1):
# return 200
# else:
# print('预约了但是没有成功,肯定是你已经预约过了')
# exit(0)
# return 0
# if(sp == 'east3A'):
# r_w3=self.session.get('http://rg.lib.xjtu.edu.cn:8010/qseat?sp=east3A')
# s2 = json.loads(r_w3.text)['seat']
# if(s2[kid] == 1):
# return 200
# else:
# print('预约了但是没有成功,肯定是你已经预约过了')
# exit(0)
# return 0
return r.status_code
def encrypt_pwd(raw_pwd, publicKey='0725@pwdorgopenp'):
''' AES-ECB encrypt '''
publicKey = publicKey.encode('utf-8')
# pkcs7 padding
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
pwd = pad(raw_pwd)
# zero padding
'''
pwd = raw_pwd
while len(raw_pwd.encode('utf-8')) % 16 != 0:
pwd += '\0'
'''
cipher = AES.new(publicKey, AES.MODE_ECB)
pwd = cipher.encrypt(pwd.encode('utf-8'))
return str(base64.b64encode(pwd), encoding='utf-8')

_headers = self.config['headers']
_headers['Content-Type'] = 'application/x-www-form-urlencoded'

# start with 302 redirection from ehall
_r = self.session.get('http://rg.lib.xjtu.edu.cn:8010/auth/login/?next=%2Fseat%2F')

# get cookie route
self.session.get('https://org.xjtu.edu.cn/openplatform/login.html')

# get JcaptchaCode and cookie JSESSIONID & sid_code
r_JcaptchaCode = self.session.post('https://org.xjtu.edu.cn/openplatform/g/admin/getJcaptchaCode',
headers=_headers)

# is_JcaptchaCode_show
url = 'https://org.xjtu.edu.cn/openplatform/g/admin/getIsShowJcaptchaCode'
params = {
'userName': self.config['username'],
'_': str(int(time.time() * 1000))
}
r = self.session.get(url, params=params, headers=_headers)
print(r.text)
# login
url = 'https://org.xjtu.edu.cn/openplatform/g/admin/login'
cookie = {
'cur_appId_':'JL4oKidbLpQ='
}
data = {
"loginType": 1,
"username": self.config['username'],
"pwd": encrypt_pwd(self.config['password']),
"jcaptchaCode": ""
}
_headers['Content-Type'] = 'application/json;charset=UTF-8'
r = self.session.post(url, data=json.dumps(data), headers=_headers,cookies=cookie)
print(r.text)
token = json.loads(r.text)['data']['tokenKey']

cookie = {
'cur_appId_':'JL4oKidbLpQ=',
'open_Platform_User' : token
}
r=self.session.get('http://org.xjtu.edu.cn/openplatform/oauth/auth/getRedirectUrl?userType=1&personNo='+self.config['person_id']+'&_=1590998261976',cookies = cookie)
print(r.text)
r=self.session.get(json.loads(r.text)['data'])
r=self.session.get('http://rg.lib.xjtu.edu.cn:8080/bxusr/link.jsp?uid='+self.config['username']+'&cn=%E9%83%AD%E7%8E%8B%E6%87%BF&employeeNumber='+self.config['person_id']+'&depId=%E7%94%B5%E5%AD%90%E4%B8%8E%E4%BF%A1%E6%81%AF%E5%AD%A6%E9%83%A8&mobile')#&email=867718012@qq.com去掉了
#print(r.text)
#---------------------登陆成功------------------------
check_my_seat(self)
re_time = datetime.datetime.now()
while(1):
#ii+=1
r=self.session.get('http://rg.lib.xjtu.edu.cn:8086/qseat?sp=north4east')#兴庆区的,别的区得自行修改了
s = json.loads(r.text)['seat']
#print(s1,s2,s_new)
print('循环次数:')
#vxpush(self,'test')
#print(ii)
#reserve(self,'029','south3middle')
print("位置状态" + str(s[self.weizhi]))
if s[self.weizhi] == 0:
while(1):
if reserve(self,self.weizhi,'north4east') == 1:
print('座位号是'+self.weizhi)
time.sleep(60*25)
while(cancel(self) == 0):
time.sleep(5)

# return(0)
time.sleep(2)
# if((datetime.datetime.now()-re_time).seconds>=300):
# exit(0)

if __name__ == '__main__':
#time.sleep(60*1)#预计一分钟离馆加延迟
dt = '2020-08-19 11:00:02'
ts = int(time.mktime(time.strptime(dt, "%Y-%m-%d %H:%M:%S")))
t = int(time.time())
cha = ts - t
while cha >0:
t = int(time.time())
cha = ts - t
time.sleep(1)
if(cha%100 == 0):
print(cha)
print("开始")
guoguo = XJTUUser('./config.json')
guoguo.login()
exit(0)

凌晨预约脚本

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#!/usr/bin/env python3
# @Author : Guoguo
# @Blog :https://gwyxjtu.github.io
import os
import time
import json
import base64
import requests
from Crypto.Cipher import AES
import re
from lxml import etree
from threading import Thread

our_seat = []

class XJTUUser(object):

def __init__(self, config_file_path='./config.json'):
with open(config_file_path) as config_file:
config = json.loads(config_file.read())
self.config = config
self.is_login = False
self.session = requests.Session()
self.session.headers.update(config['headers'])
self.session.cookies.update(config['cookies'])


def login(self):

#--------------------------------------
def check_my_seat(self):#返回你的座位字符穿
r = self.session.get('http://rg.lib.xjtu.edu.cn:8086/my/')
dom = etree.HTML(r.text)
a_text = dom.xpath('/html/body/div[2]/center/div[1]/div/div/div/div/div/div[1]/h3/text()[2]')
jjj = dom.xpath('/html/body/div[2]/center/div[1]/div/div/div/div/div/div[2]/center/h3[1]')
if(len(jjj)<1):
print('没弄上1,出现错误')
return 0;
if jjj[0].text == '已取消' or jjj[0].text == '已离馆' or jjj[0].text == '超时未入馆':
print('没弄上,出现错误')
return 0
else:
print('弄好了'+str(a_text))
our_seat.append(str(a_text))
return 1



def reserve(self,kid,sp):
r = self.session.get('http://rg.lib.xjtu.edu.cn:8086/ruguan')#入关
#print('--------------------------')
nn = r.text.find('<input id="csrf_token" name="csrf_token" type="hidden" value=')
tok = r.text[nn+1+len('<input id="csrf_token" name="csrf_token" type="hidden" value='):nn+56+len('<input id="csrf_token" name="csrf_token" type="hidden" value=')]
#print(r.text[nn+1+len('<input id="csrf_token" name="csrf_token" type="hidden" value='):nn+56+len('<input id="csrf_token" name="csrf_token" type="hidden" value=')])
data={
'csrf_token':tok,
'csrf_token':tok,
'service':'seat',
'submit':'%E6%8F%90%E4%BA%A4',
'rplace':'east'
}#入关post,比较麻烦
r = self.session.post('http://rg.lib.xjtu.edu.cn:8086/ruguan',data = data)#提交

r = self.session.get('http://rg.lib.xjtu.edu.cn:8086/seat/?kid='+kid+'&sp='+sp)
#print(r.text)
#------------------------------新版判断
#兴庆区的,别的区得自行修改了
if check_my_seat(self) == 1:
print('预约成功'+str(check_my_seat(self)))
return 1
else:
print('预约失败')
return 0

return r.status_code
def encrypt_pwd(raw_pwd, publicKey='0725@pwdorgopenp'):
''' AES-ECB encrypt '''
publicKey = publicKey.encode('utf-8')
# pkcs7 padding
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
pwd = pad(raw_pwd)
# zero padding
'''
pwd = raw_pwd
while len(raw_pwd.encode('utf-8')) % 16 != 0:
pwd += '\0'
'''
cipher = AES.new(publicKey, AES.MODE_ECB)
pwd = cipher.encrypt(pwd.encode('utf-8'))
return str(base64.b64encode(pwd), encoding='utf-8')

_headers = self.config['headers']
_headers['Content-Type'] = 'application/x-www-form-urlencoded'

# start with 302 redirection from ehall
_r = self.session.get('http://rg.lib.xjtu.edu.cn:8086/auth/login/?next=%2Fseat%2F')

# get cookie route
self.session.get('https://org.xjtu.edu.cn/openplatform/login.html')

# get JcaptchaCode and cookie JSESSIONID & sid_code
r_JcaptchaCode = self.session.post('https://org.xjtu.edu.cn/openplatform/g/admin/getJcaptchaCode',
headers=_headers)

# is_JcaptchaCode_show
url = 'https://org.xjtu.edu.cn/openplatform/g/admin/getIsShowJcaptchaCode'
params = {
'userName': self.config['username'],
'_': str(int(time.time() * 1000))
}
r = self.session.get(url, params=params, headers=_headers)
print(r.text)
# login
url = 'https://org.xjtu.edu.cn/openplatform/g/admin/login'
cookie = {
'cur_appId_':'JL4oKidbLpQ='
}
data = {
"loginType": 1,
"username": self.config['username'],
"pwd": encrypt_pwd(self.config['password']),
"jcaptchaCode": ""
}
_headers['Content-Type'] = 'application/json;charset=UTF-8'
r = self.session.post(url, data=json.dumps(data), headers=_headers,cookies=cookie)
print(r.text)
token = json.loads(r.text)['data']['tokenKey']

cookie = {
'cur_appId_':'JL4oKidbLpQ=',
'open_Platform_User' : token
}
r=self.session.get('http://org.xjtu.edu.cn/openplatform/oauth/auth/getRedirectUrl?userType=1&personNo='+self.config['person_id']+'&_=1590998261976',cookies = cookie)
print(r.text)
r=self.session.get(json.loads(r.text)['data'])
r=self.session.get('http://rg.lib.xjtu.edu.cn:8080/bxusr/link.jsp?uid='+self.config['username']+'&cn=%E9%83%AD%E7%8E%8B%E6%87%BF&employeeNumber='+self.config['person_id']+'&depId=%E7%94%B5%E5%AD%90%E4%B8%8E%E4%BF%A1%E6%81%AF%E5%AD%A6%E9%83%A8&mobile')#&email=867718012@qq.com去掉了
#print(r.text)
#---------------------登陆成功------------------------

#print(r_w3.text)
#print('各层座位数量',end = '')
#print(json.loads(r_e3.text)['scount'])
#s.update(json.loads(r_w3.text)['seat'])/seat/?kid=015&sp=north4southwest
#print(s1,s2)


#check_my_seat(self)
my_list = ['G029','G054','G066']
ii=0
while(1):
ii+=1
r=self.session.get('http://rg.lib.xjtu.edu.cn:8086/qseat?sp=north4east')#兴庆区的,别的区得自行修改了

#print('各层座位数量',end = '')
s = json.loads(r.text)['seat']
print('循环次数:')
print(ii)
for i in my_list:
if s[i] == 0:
print(i)
if reserve(self,i,'north4east') == 1:
return(0)
for i in s:
if s[i] == 0:
print(i)
if reserve(self,i,'north4east') == 1:
return(0)
time.sleep(2)

if __name__ == '__main__':

guoguo = XJTUUser('./config.json')
zxz = XJTUUser('./config_zxz.json')
dt = '2020-08-20 06:00:02'
ts = int(time.mktime(time.strptime(dt, "%Y-%m-%d %H:%M:%S")))
t = int(time.time())
cha = ts - t
while cha >0:
t = int(time.time())
cha = ts - t
time.sleep(1)
if(cha%100 == 0):
print(cha)
print("开始")

#guoguo.login()
#别的人就分别建立新的结构体就行
#ruo = XJTUUser('./config_1.json')
guoguo.login()
zxz.login()
exit(0)

config文件

{
    "username": "netid",
    "password": "",
    "person_id":"217611****",
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
    },
    "cookies": {}
}

考研加油!

myrio小车

代码放在仓库https://github.com/gwyxjtu/myrio_car

一、实验设备与软件
1.NI myRIO一块,小车一台,自备iPad或手机。
2.软件系统:Win7系统,Labview2015开发软件,NI myRIO2015驱动程序,APP软件Data Dashboard For LabVIEW。
3.在iPad或手机上自行下载APP软件Data Dashboard For LabVIEW,Data Dashboard免费支持运行iOS,Android的智能手机和平板电脑。

  1. 由于实验室电源有限,且点亮不稳定,自行从网上购置了12V锂电池一块,红外传感器两个。
    二、实验具体内容
    实验一:手机遥控小车
    首先是按照电路控制连接电机驱动电路,连接线路板。其中D0留给之后控制小车轮子旋转方向,PWM用于控制小车轮子转速。
  2. 问题以及解决方法:
    (1) 12V不能单独引导面包板上方的联通列中,最好单独插在一行,因为12V电压较大,面包板电阻不可忽略。
    (2) myrio板子同样需要接地,否则会出现轮子一会正向转动,一会反向转动且只能受到微弱无规律的控制。
    (3) 具体芯片的调试方法可以先对调两组芯片,然后观察控制效果,如果两个轮子都不受控制,很有可能是。
    在这里插入图片描述
  3. 设计思路和程序图
    按照差分的思路设计小车路线控制,具体线路设计连线图如下,总共只用到了两个myrio的四个A组端口,分别是两个PWM,占用A组29,31端口,和d0分别输出给两个电机。
    在这里插入图片描述
    PWM的使用方法就是两个参数,两个电机的占空比分别是p1+p2,p1-p2,p1用来控制小车的整体速度,p2用来跳街两个轮子差异,也可以用来转向,在后面的实验中负责补偿小车速度。
    实验二:基于红外传感器的自动循迹小车
  4. 传感器原理以及连线
    红外循迹的传感器共有四个接线端,分别是VCC,GND,D0,A0,接线时候VCC接myrio的5V电压,GND连接地端,D0指的是红外的数字输出,A0指的是模拟输出,我们这里使用D0数字输出,即用螺丝刀调节红外传感器灵敏度,使得在黑线和普通地板返回不同的数字数值。如果使用模拟输入,则需要在程序中新增共享变量动态调整。
    Labview中加入NImyrio的digital in,同时设置myrio的端口,我们这里使用A口的15和17引脚。
  5. 程序框图以及算法设计
    开始想到的思路有两种,一种是用红外传感器识别黑线,如果离开黑线则调节,第二种思路是用两个红外传感器夹住黑线,反馈调节。
    最终我们选择了第二种思路,即用两个传感器来夹住赛道,原因是第一种的设计思路对传感器质量要求较高,同时过抖的弯道,比如垂直,第一种设计只能以十分卡顿的试错方法来过弯,而夹住赛道的方法有更多的控制手段。
    设计框图如下,现在进行详细介绍
    在这里插入图片描述
    首先将框图划分为三个区域,其中区域3就是实验一的差分控制,即p1和p2分别负责转速和转向补偿。区域1是一个逻辑判断,即四种情况,分别为:一,左侧右侧都没压黑线。二,左侧右侧都压住黑线。三,左侧压,右侧不压黑线,四,右侧压,左侧不压黑线。为了保证小车能成功通过十字路口,所以两侧都为黑线的时候直行,两侧都不压黑线的时候视为在赛道上,同样直行,如果一侧压住一侧不压,这时候就需要转向来控制,这里使用一个共享变量cons_1,在区域一的上方标记,用来控制自动转向的灵敏度,灵敏度过低会冲出弯道,灵敏度过高会左右摇摆,行进效率低下。仅仅依靠区域1和区域3的框图已经可以实现循迹,但是控制效果不佳,很容易速度过快冲出赛道。区域2在后面的优化里详细描述。

在这里插入图片描述

  1. 优化方法
    仅凭借区域1和区域3的控制不足以完成很急的弯道。所以加上区域2的优化,区域2首先判断区域一传来的函数值,让小车在弯道时一边轮子转速为0,即在输出的地方直接乘以0,在另一个轮子上给出compensate_1的转速,具体可以通过ipad调节。
    如果需要更快的车速过弯,则需要再转弯时给小车整体一个倒退的速度,即强制减速,然后旋转,这里赋值了一个常数0.7,经过测试0.5到0.8之间都可以,由于转弯速度和转弯稳定程度是不可调和的一对矛盾,这里只能取一个折中。具体的演示再视频中展示。
  2. 问题以及解决方法
    (1)弯道过激,小车冲出弯道的问题,这里使用强制减速和自转的方法调节,实际运行的情况小车会在弯道的时候减速,符合生活经验,开车在弯道时确实需要减速。
    (2)十字路口,这里选择十字路口走直线穿过。

实验三:可以避障的自动循迹小车

  1. 传感器原理以及连线
    避障使用的是实验室提供的红外测距传感器,共有三个接线端,分别是5V vcc,GND接地端,A0模拟信号输出。这里使用两个传感器,这样可以判断转向方向。
  2. 程序框图以及算法设计
    这里设计的避障优先级高于寻路,所以避障有权利给寻路的输出乘以0然后加上自己的输出。右上方是d0,即当两个传感器都检测距离低于一个阈值的时候倒退。
    在这里插入图片描述
    情形一:两个距离很远
    按照循迹来,给循迹的输出乘以1,并且加上0,d0全部对F进行或运算,即不变。
    情形二:两个距离都很近
    输出乘以0,并且给一个avoid_acc,同时d0反转。即过近自转的速度,实际展示为贴近墙壁后旋转的角度,这里设置为0.3,旋转的角度略大于90度。
    情形三:一侧距离过近,一侧距离过远
    让一个轮子不转,另一个轮子旋转,绕过障碍。
  3. 优化方法
    先前版本的设计是检测距离过近的时候直线后退,这样有一个致命问题,就是小车会卡在距离阈值那里,前前后后运动,所以这里没有选择直线倒退,选择两个传感器都过近的时候自转。即为一侧前进,一侧后退,具体的演示参考视频,效果很不错。

三、调试经验总结
1)轮子完全不转

  1. 可以尝试点击程序前面板的停止,如果停止后轮子转动,则程序已经运行。估计是程序逻辑的问题,或者参数初始化失败,重新赋值参数。
  2. 如果点击停止后轮子仍然不转,则检查电路,我们遇到的情况有,电机正负交叉,接地失败,电池没电,myrio电池没电等等。
    2)轮子一直全速转动,不受控制
    大可能是程序没烧上去,原因是myrio电量不足,程序是调试模式,是存储在DRAM里的,断电重连后需要重新烧写程序。
    3)轮子不受控制,或控制逻辑完全错误
    可能是myrio没有接地,myrio也需要接地,否则会随机控制,或控制失败。
    4)轮子一侧转一侧不转,一边受控制,一边不受控制
    1. myrio端口连接错了一位,就是一侧受控一侧不受控。
    2. 测距红外没有提示灯,这时候可以对调测距红外来检查是否是传感器的问题。
      其他调试思路:
  3. 元器件芯片一般不会坏掉,尤其是不可能两个芯片同时坏掉,如果错误是对称的,一般不要怀疑芯片,如果错误不对称,则对调两个芯片查看错误是否对调。
  4. 通过观察myrio上的红色指示灯,是wifi模块,如果每次ipad控制红色灯都会闪烁,则说明myrio已经收到了信号,通信过程错误可以排除。
  5. 可以通过dashboard来判断是否读取到信号,用手机先退出dashboard,在重新连接启动,如果能保存到上次运行的参数,则说明myrio已经存储了数据,通信过程没有问题。

互联网加工作小结

起因

腾飞杯虽然得到了电子信息赛道的特奖,但是对于我个人来说还是有一些遗憾,对项目也是很不舍得,希望能做到更好!

这里展示一下自己所作的内容,其中部分源代码暂时不能开发,等评奖结束后可以开源,目前包括csdn异步http和异步mysql爬虫,哔哩哔哩批量视频爬虫等。

开工前的期望

后端和爬虫

  1. 爬取的范围更为广阔,搜索撸棒性更强。
  2. 保留原文格式,方便读者阅读。

前端

  1. 晃动问题,不能让所有节点完全离开界面,不能让用户找不到节点的位置,这个是腾飞杯版本的最难受的地方。

驱动

  1. 模式切换问题,切换操作过于复杂。

总工作量

  1. 前期图书馆预约和维持脚本,并尝试团队维持脚本,虽然最后由于稳定性原因没有推广。
  2. 新版数据库设计,关系表和内容表分离,提高效率。
  3. 配合小明的爬虫写了一套异步数据库接口,和小明的异步http爬虫配合不错,最终分四天大致上完全部数据。
  4. 提供少量python的数据库调试接口,这个比较简略。
  5. 完善后端java中socket和前端通信部分,升级为新版数据库所对应的版本,目录升级为二级目录,内容更为丰富。
  6. 调试前端,debug。
  7. 节点关系表存储设计和接口。

部分后端的AI推荐算法相关工作等待若哥和钱龙完成,我这里使用random代替。

新版爬虫数据系统设计_v2

搜索正文存储表 spyder_main_table

id keyword link tittle abstract content child_len value
int char 50 char 100 char 200 TEXT TEXT int int
主键 搜索的关键词 本文连接 文章标题 内容摘要(第一轮的摘要在搜索界面存储) 内容全文 子链接的总个数 节点权重价值,目前没有使用

搜索内容表 t_spyder_main_content

id content
主键 内容

子链接存储表 spyder_child_table

id parent_link link tittle abstract content child_len value
int char 100 char 200 char 200 TEXT TEXT int int
主键 父连接地址,作为搜索子链接的索引 当前连接 当前连接标题 当前链接摘要(之后的摘要在父文末就有,展开连接后存储新的连接内容) 当前连接内容 子链接数目 权重

推荐内容表 t_spyder_child_content

id content
主键 内容

评论存储表 t_spyder_comment_table

link target nick_name write_time content value
char 200 char 200 TEXT datetime TEXT int
链接 回复的用户昵称,如果没有回复,就存博客链接 用户昵称 评论时间 评论内容 评分

主菜单表,从大keyword映射到小keyword t_spyder_menu

main_keyword keyword
主菜单节点 子keyword

视频url映射表 t_spyder_url

keyword url
关键词 视频地址

预估搜索子链接,广搜,深度三轮左右,两轮也行。如果当前连接是最后一轮,child_len为0.

子链接存储的数据结构

爬虫设计思路:

  1. 每次get新的连接,在当前索引中存储当前连接的内容,和子链接的数目,然后根据页面的索引,去子链接的表里面存储,当前页面可以存子链接的标题和摘要,展开子链接内容后存子链接的content。

  2. 可以递归爬取三层子链接

  3. 子链接需要检验重复,就连接编号不能一致,可能会用到ignore

  4. ignore查重可能会导致不公平性,比如第一个搜索的节点没有重复内容,第二个就会出现重复内容,最后一个可能百分之七八十都是重复的,效率很低,关联方法可以优化。

关于爬虫想到的两个问题:

  1. 子节点不均衡的问题,(目前想到的办法是设置上限,或者设计多对多的关系,感觉怪怪的)

  2. 优秀博客筛选:
    内容长度大于一定限制
    标题不能含有特殊标签
    内容,标题,阅读量和发表时间。

bilibili视频爬虫

视频爬虫,哔哩哔哩,两个问题,一个是总存储量,即爬不爬第二页,第二个是弹幕,可以爬.

使用阿里云存储对象,

关键词表单

[‘C语言学习’,‘java学习’,‘python’,‘机器学习’,‘Kubernetes’,‘前端’,‘计算机网络’]
[‘C语言指针’,‘C语言结构体’,‘C语言数组’,‘C函数’,‘C语言标准库’,‘C语言算法’,‘C语言内存管理’,‘C语言字符串’,‘C语言实例’,‘C语言错误处理’,‘java数据结构’,‘Java排序算法’,‘java注解’,‘java基础’,‘jvm’,‘java框架’,‘数据库基础’,‘java高并发’,‘java泛型’,‘java反射’,‘python基础’,‘python面向对象’,‘python异步’,‘python文件系统’,‘python异常处理’,‘python数据科学’,‘pythonweb库’,‘python爬虫’,‘python机器学习’,‘python图像处理’,‘计算机视觉’,‘自然语言处理’,‘社会网络分析’,‘推荐算法’,‘数据挖掘’,‘模型诊断’,‘强化学习’,‘模型融合’,‘搜索引擎’,‘统计学习方法’,‘kubernetes环境’,‘kubernetes基础概念’,‘kubernetes基本架构’,‘kubernetes基本调度流程’,‘kubernetes API’,‘kubernetes Master’,‘kubernetes扩展’,‘kubebuilder’,‘kubernetes存储’,‘kubectl’,‘Ajax’,‘HTML’,‘CSS’,‘JavaScript’,‘Dom’,‘HTML5’,‘VUE’,‘React’,‘Angular’,‘jQuery’,‘物理层’,‘数据链路层’,‘网络层’,‘传输层’,‘应用层’,‘网络安全’,‘无线网路’,‘HTTP协议’,‘TCP’,‘DNS’,‘数字认证’]

socket通信

这里的思路是让java后端和python代码隔离,交互只能通过数据库,否则日后维护将更加困难
get_menu这里,必须维护一个手动版的初始节点

mysql win10密码忘记修改

起因

需要本地数据库加速爬虫速度

操作

首先停止mysql服务

net stop mysql

杀进程也可以,不过比较麻烦。

第二部找到安装目录地下的data文件,我一开始想要重置,总给我error说data文件夹下已经有数据,我就直接把data文件夹删除了。

第三步,执行重置操作

mysqld --initialize --user=root --console

重置后会给一个临时密码

第四步,使用刚给的临时密码正常登录

mysql -u root -p

第五步,重置密码

 alter user user() identified by "yourpasswd";

user表重置一下。完事,这下终于知道自己的密码是啥了。

  • Copyrights © 2015-2024 galaxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信