注:本文selenium版本为3.3.0,高版本弃用find_element方法改用BY方法

一、登录

F12进入开发者模式,找到两个文本框的位置,用css路径寻址,两个框的路径分别为#phone#pwd,同理找到登录的位置。(后续定位问题不在赘述,不会css直接右键copy selector万事大吉)

# 账号
user = '12345678'
driver.find_element_by_css_selector('#phone').send_keys(user)
# 密码
p = 'xxxxxx'
driver.find_element_by_css_selector('#pwd').send_keys(p)
driver.find_element_by_css_selector('#loginBtn').click()
time.sleep(2)

二、选择课程

部分账号登录后不会直接显示课程,需要“切换单位”并打开“我学的课”才会显示。

通过selenium的鼠标模拟,选择所在学校的单位(若直接显示了课程可略过),定位课程之前要进入一个iframe,需要driver.switch_to.frame切换。

# 切换单位
# 实例化鼠标操作
actions = ActionChains(driver)
# 定位下拉框
opt = driver.find_element_by_css_selector('body > div.header > div.space-con > ul > li.user > span.icon-down02.icon-h-arrow-l')
# 移动到定位元素
actions.move_to_element(opt)
# 执行操作
actions.perform()
time.sleep(0.5)
driver.find_element_by_css_selector('body > div.header > div.space-con > ul > li.user > div > ul > li:nth-child(2)').click()
time.sleep(0.5)
# 切换完成
driver.find_element_by_css_selector('#mCSB_2_container > ul > li:last-child').click()
# 切换到课程页面
time.sleep(1)
# 切换页面iframe
class_ = driver.find_element_by_css_selector('#frame_content')
driver.switch_to.frame(class_)
try:driver.find_element_by_css_selector('body > div > div > div > div.course-tab > div:nth-child(2)').click()time.sleep(0.5)except:driver.find_element_by_css_selector('body > div > div > div > div.course-tab > div:nth-child(1)').click()time.sleep(0.5)

定位课程
通过link文本的方式来定位课程,注意,只有当文本有link链接时才可用该定位方式。

# 课程名
class_name = 'xxx'
driver.find_element_by_link_text(class_name).click()
time.sleep(0.5)

三、打开网课章节

在进入课程页面后通过“章节”进入。

# 切换回课程页面索引从0开始
driver.switch_to.window(driver.window_handles[1])
driver.switch_to.default_content()
# 点击“章节”
time.sleep(1)
driver.find_element_by_css_selector('#boxscrollleft > div > ul:nth-child(19) > li:nth-child(2) > a').click()
# 切换章节iframe
page_iframe = driver.find_element_by_css_selector('#frame_content-zj')
driver.switch_to.frame(page_iframe)
driver.find_element_by_css_selector('#fanyaChapter > div > div.chapter_body.xs_table > div.chapter_td > div:nth-child(2) > div.catalog_level > ul > li:nth-child(1) > div > div > div.catalog_name').click()


通过第一个视频进入网课页面,再用driver.switch_to.window(driver.window_handles[0])切换到第一个页面关闭“个人空间”页面然后换回“学生学习页面”。

driver.switch_to.window(driver.window_handles[0])
driver.switch_to.default_content()
# 关闭多余页面并切换回视频页面
driver.close()
driver.switch_to.window(driver.window_handles[0])
driver.switch_to.default_content()

四、分析章节标签构造

可以发现子一级的标签在ul标签下的li中,可以通过find_elements来统计子标签数量。

在属性为“orangeNew”的span标签下还有未看完的任务点数量,可以通过获取该信息来确定应当遍历的视频数量。在确认该小节任务点是否看完时也能通过是否为数字来判断。

for section in range(section_, section_end + 1):class_end = len(driver.find_elements_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li'.format(section)))print('第' + str(section) + '章')print('章节数:', str(class_end))for page in range(class_num, 1 + class_end):print('第' + str(page) + '节')time.sleep(2)# 判断有无三级标题# ==============================三级标题处理部分(首)============================= #try:# 三级标题数ul_num = len(driver.find_elements_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li'.format(section,page)))print('三级标题数:{}'.format(ul_num))if ul_num == 0:target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section,page))driver.execute_script("arguments[0].scrollIntoView();", target)target.click()else:for next_page in range(1, ul_num + 1):target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({}) > div'.format(section, page, next_page))# time.sleep(1)driver.execute_script("arguments[0].scrollIntoView();", target)time.sleep(0.5)driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({}) > div'.format(section, page, next_page)).click()num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({})'.format(section, page, next_page)).text.split(' ')[-1]print(num)# 判断当前章节是否看完try:num = re.findall(r'[0-9]+', num)[0]except:print('本节已完成')continue# 通过是否为数字判断是否已完成if num.isdigit():print('未播放数:', num)else:continueplay_video(num)target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section, page))driver.execute_script("arguments[0].scrollIntoView();", target)target.click()# ==============================三级标题处理部分(尾)============================== #except ConnectionError as e:print(e)print('无三级标题')target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section, page))# time.sleep(1)# 拖动到可见区域# driver.execute_script("arguments[0].scrollIntoView();", target)# target.click()time.sleep(4)try:num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({})'.format(section, page)).text.split(' ')[-1]except:num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section,page)).text.split(' ')[-1]print(num)# 判断当前章节是否看完try:num = re.findall(r'[0-9]+', num)[0]except:print('本节已完成')continue# 通过是否为数字判断是否为空章节if num.isdigit():print('未播放数:', num)else:continue

五、分析任务点标签构造

可以发现视频都在div.wrap>div.ans-cc>pdiv下。

展开div可以发现视频在其子节点的iframe标签里,因此可以通过定位对应的div标签切换iframe来定位到任务点的视频。
对比完成和未完成的任务点可以发现,完成的任务点p的子标签div的属性为ans-attach-ct ans-job-finished,未完成的则为ans-attach-ct,可以通过get_attribute['class']来判断任务点是否已经完成。


在视频页面可以发现,当不点击“播放”时不会显示视频的时长,播放视频后才有视频的时长。将定位到时长信息后后通过split方法来分割时间并计算为以秒为单位的时长,注意视频的加载时间会需要time.sleep()1-2秒来保证时长被加载出来。将总时长-当前时长即可得到观看时间既time.sleep()的休眠时间。


# 播放视频部分
def play_video(num):# global total# 记录课程数total = 0time.sleep(1)one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签数量p_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p > div'))# print('p标签数量:', str(p_num))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()# 统计课程数量for p in range(p_num):one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签节点数量s_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(p + 1) + ')> div'))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()total += s_numprint('总任务点:', total)for x in range(0, p_num):one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签节点数量s_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(x + 1) + ')> div'))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()for node in range(1, s_num + 1):print('第' + str(node) + '个视频')one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)flag = driver.find_element_by_css_selector('#ext-gen1045 > div > div > p:nth-child({})> div:nth-child({})'.format(x + 1, node)).get_attribute('class')# 通过属性判断视频是否完成if flag == 'ans-attach-ct ans-job-finished':print('已完成,即将跳转下一个视频')driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()continue# 未完成则继续执行start = driver.find_element_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(x + 1) + ') > div:nth-child(' + str(node) + ')> iframe')driver.switch_to.frame(start)# 播放视频driver.find_element_by_css_selector('#video > button').click()# 最小化页面# driver.minimize_window()time.sleep(2.5)# 当前进度start_time = driver.find_element_by_css_selector('#video > div.vjs-control-bar > div.vjs-progress-control.vjs-control > div').get_attribute('aria-valuetext')start_time = start_time.split(' ')print('本章开始时间为:', start_time[0])start_time_split = start_time[0].split(':')try:if len(start_time_split) == 2:start_time_ = int(start_time_split[0]) * 60 + int(start_time_split[1])elif len(start_time_split) == 3:start_time_ = int(start_time_split[0]) * 60 + int(start_time_split[1]) * 60 + int(start_time_split[2])else:start_time = 0except:start_time = 0time.sleep(2.5)# all_time = driver.find_element_by_css_selector(#    '#video > div.vjs-control-bar > div.vjs-duration.vjs-time-control.vjs-control > span.vjs-duration-display').textall_time = start_time[-1]print('本章总时间为:', all_time)driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()time_split = all_time.split(':')# print(time_split)time_ = int(time_split[0]) * 60 + int(time_split[-1])# 分钟部分用0补至2位print('本章需要花费时间为:{}:{:02d}'.format((time_ - start_time_) // 60, (time_ - start_time_) % 60))print('当前时间为:', time.strftime('%H:%M:%S', time.localtime()))print('正在播放视频......')wait_time = time_ - start_time_ + 5for w in range(1, 101):print('\r' + '-' * int(w) + '>' + str(w) + '%', end='')time.sleep(wait_time / 100)  # time_ - start_time_ + 5print('\n本节视频播放结束')

六、完整代码

代码最后的:

if class_num != 1:class_num = 1

表示选择起始节点后需要从下一章的第一个节点开始遍历。

import re
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
import warningswarnings.filterwarnings('ignore')chrome_options = Options()
chrome_options.add_argument("--mute-audio")  # 静音
# chrome_options.add_argument('--headless')  # 开启静默模式# 实例化驱动并设置引擎为Chrome
driver = webdriver.Chrome('F:/chromedriver/chromedriver.exe', chrome_options=chrome_options)  # 驱动地址
url = 'https://i.chaoxing.com/'
driver.get(url)
driver.maximize_window()
time.sleep(2)
# ============================自选项============================ #
# 账号
user = '12345678'
driver.find_element_by_css_selector('#phone').send_keys(user)
# 密码
p = 'xxxxxx'
driver.find_element_by_css_selector('#pwd').send_keys(p)
driver.find_element_by_css_selector('#loginBtn').click()
time.sleep(2)# 课程名
class_name = '大数据行业项目部署实战'
# 课程起始和结尾
section_ = 1  # 起始章节
section_end = 4  # 结束章节
class_num = 1  # 起始节
# class_end = 1  # 结束节(不必选)
# ============================自选项============================ ## 切换单位
# 实例化鼠标操作
actions = ActionChains(driver)
# 定位下拉框
opt = driver.find_element_by_css_selector('body > div.header > div.space-con > ul > li.user > span.icon-down02.icon-h-arrow-l')
# 移动到定位元素
actions.move_to_element(opt)
# 执行操作
actions.perform()
time.sleep(0.5)
driver.find_element_by_css_selector('body > div.header > div.space-con > ul > li.user > div > ul > li:nth-child(2)').click()
time.sleep(0.5)
# 切换完成
driver.find_element_by_css_selector('#mCSB_2_container > ul > li:last-child').click()
# 切换到课程页面
time.sleep(1)
# 切换页面iframe
class_ = driver.find_element_by_css_selector('#frame_content')
driver.switch_to.frame(class_)
try:driver.find_element_by_css_selector('body > div > div > div > div.course-tab > div:nth-child(2)').click()time.sleep(0.5)driver.find_element_by_link_text(class_name).click()
except:driver.find_element_by_css_selector('body > div > div > div > div.course-tab > div:nth-child(1)').click()time.sleep(0.5)driver.find_element_by_link_text(class_name).click()
time.sleep(0.5)
# 切换回课程页面索引从0开始
driver.switch_to.window(driver.window_handles[1])
driver.switch_to.default_content()
# 点击“章节”
time.sleep(1)
driver.find_element_by_css_selector('#boxscrollleft > div > ul:nth-child(19) > li:nth-child(2) > a').click()
# 切换章节iframe
page_iframe = driver.find_element_by_css_selector('#frame_content-zj')
driver.switch_to.frame(page_iframe)
driver.find_element_by_css_selector('#fanyaChapter > div > div.chapter_body.xs_table > div.chapter_td > div:nth-child(2) > div.catalog_level > ul > li:nth-child(1) > div > div > div.catalog_name').click()
driver.switch_to.window(driver.window_handles[0])
driver.switch_to.default_content()
# 关闭多余页面并切换回视频页面
driver.close()
driver.switch_to.window(driver.window_handles[0])
driver.switch_to.default_content()# ==================================以上部分为登录并跳转视频页面操作================================== #
# ==============================以下部分为视频播放操作,包含未完成任务点计算============================== ## 播放视频部分
def play_video(num):# global total# 记录课程数total = 0time.sleep(1)one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签数量p_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p > div'))# print('p标签数量:', str(p_num))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()# 统计课程数量for p in range(p_num):one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签节点数量s_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(p + 1) + ')> div'))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()total += s_numprint('总任务点:', total)for x in range(0, p_num):one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)# p标签节点数量s_num = len(driver.find_elements_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(x + 1) + ')> div'))driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()for node in range(1, s_num + 1):print('第' + str(node) + '个视频')one = driver.find_element_by_xpath('//*[@id="iframe"]')driver.switch_to.frame(one)flag = driver.find_element_by_css_selector('#ext-gen1045 > div > div > p:nth-child({})> div:nth-child({})'.format(x + 1, node)).get_attribute('class')# 通过属性判断视频是否完成if flag == 'ans-attach-ct ans-job-finished':print('已完成,即将跳转下一个视频')driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()continue# 未完成则继续执行start = driver.find_element_by_css_selector('#ext-gen1045 > div > div > p:nth-child(' + str(x + 1) + ') > div:nth-child(' + str(node) + ')> iframe')driver.switch_to.frame(start)# 播放视频driver.find_element_by_css_selector('#video > button').click()# 最小化页面# driver.minimize_window()time.sleep(2.5)# 当前进度start_time = driver.find_element_by_css_selector('#video > div.vjs-control-bar > div.vjs-progress-control.vjs-control > div').get_attribute('aria-valuetext')start_time = start_time.split(' ')print('本章开始时间为:', start_time[0])start_time_split = start_time[0].split(':')try:if len(start_time_split) == 2:start_time_ = int(start_time_split[0]) * 60 + int(start_time_split[1])elif len(start_time_split) == 3:start_time_ = int(start_time_split[0]) * 60 + int(start_time_split[1]) * 60 + int(start_time_split[2])else:start_time = 0except:start_time = 0time.sleep(2.5)# all_time = driver.find_element_by_css_selector(#    '#video > div.vjs-control-bar > div.vjs-duration.vjs-time-control.vjs-control > span.vjs-duration-display').textall_time = start_time[-1]print('本章总时间为:', all_time)driver.switch_to.window(driver.window_handles[0])driver.switch_to.default_content()time_split = all_time.split(':')# print(time_split)time_ = int(time_split[0]) * 60 + int(time_split[-1])# 分钟部分用0补至2位print('本章需要花费时间为:{}:{:02d}'.format((time_ - start_time_) // 60, (time_ - start_time_) % 60))print('当前时间为:', time.strftime('%H:%M:%S', time.localtime()))print('正在播放视频......')wait_time = time_ - start_time_ + 5for w in range(1, 101):print('\r' + '-' * int(w) + '>' + str(w) + '%', end='')time.sleep(wait_time / 100)  # time_ - start_time_ + 5print('\n本节视频播放结束')for section in range(section_, section_end + 1):class_end = len(driver.find_elements_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li'.format(section)))print('第' + str(section) + '章')print('章节数:', str(class_end))for page in range(class_num, 1 + class_end):print('第' + str(page) + '节')time.sleep(2)# 判断有无三级标题# ==============================三级标题处理部分(首)============================= #try:# 三级标题数ul_num = len(driver.find_elements_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li'.format(section,page)))print('三级标题数:{}'.format(ul_num))if ul_num == 0:target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section,page))driver.execute_script("arguments[0].scrollIntoView();", target)target.click()else:for next_page in range(1, ul_num + 1):target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({}) > div'.format(section, page, next_page))# time.sleep(1)driver.execute_script("arguments[0].scrollIntoView();", target)time.sleep(0.5)driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({}) > div'.format(section, page, next_page)).click()num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > ul > li:nth-child({})'.format(section, page, next_page)).text.split(' ')[-1]print(num)# 判断当前章节是否看完try:num = re.findall(r'[0-9]+', num)[0]except:print('本节已完成')continue# 通过是否为数字判断是否已完成if num.isdigit():print('未播放数:', num)else:continueplay_video(num)target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section, page))driver.execute_script("arguments[0].scrollIntoView();", target)target.click()# ==============================三级标题处理部分(尾)============================== #except ConnectionError as e:print(e)print('无三级标题')target = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section, page))# time.sleep(1)# 拖动到可见区域# driver.execute_script("arguments[0].scrollIntoView();", target)# target.click()time.sleep(4)try:num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({})'.format(section, page)).text.split(' ')[-1]except:num = driver.find_element_by_css_selector('#coursetree > ul > li:nth-child({}) > div.posCatalog_level > ul > li:nth-child({}) > div'.format(section,page)).text.split(' ')[-1]print(num)# 判断当前章节是否看完try:num = re.findall(r'[0-9]+', num)[0]except:print('本节已完成')continue# 通过是否为数字判断是否为空章节if num.isdigit():print('未播放数:', num)else:continue# 播放视频play_video(num)# 起始节不为1时,避免影响后续,改为第一节开始if class_num != 1:class_num = 1

selenium网课自动化相关推荐

  1. [自动化] 如果电脑不会自己看网课,就应该用Python教会它

    很多时候想刷网课,但像超星学习通这样的平台在播完一条视频后并不会自动切播到下一条.所以这里简单用python写了一个小脚本,利用PyAutoGui库自动完成一些如鼠标移动点击来刷网课的操作. 环境准备 ...

  2. 专升本c语言程序设计网课_2020年宜春学院专升本招生信息

    各位考生: 现将我校2020年普通专升本考试招生专业.专业科目及考试大纲进行公布,招生计划在省教育厅确定后另行通知. 欢迎广大考生报考宜春学院! 序号 招生专业 考试科目 公共课 专业课1 专业课2 ...

  3. 零基础学python比较好的网课-请问自学 Python 有必要买课程吗?

    关于学习python,本仙女有话要说 勤奋自律+觉悟5星,建议自学,如果有一个上进心但缺少自律性,对自己信心不足或觉得自己不够聪明,可以选择培训班: 题主说的是自学,那我就聊一下自学python,众所 ...

  4. 2018年要过去了,年初说好要上完的网课呢?

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 前不久,网上疯传了一篇名为<这块屏幕可能改变命运>的文章,随后又疯传了一篇辟谣文. 于是,大众开始热议"一块屏幕" ...

  5. 网课脚本教程 【基础】(3) 使用 jq 制作简单脚本

    欢迎来到系列教程 :网课脚本编写教程 目录 为什么使用jq? 制作简单脚本 找到任意一个登陆界面 使用 键盘的 F12 审查元素 点击审查箭头 鼠标移动到 手机号和密码的输入框 编写自动化脚本 为什么 ...

  6. MOOC网课爬虫逆向(二)

    MOOC网课爬虫逆向(二) 补充一下关于开小号的问题,事实上对于我的mooc线代课,你开小号只能通过分数知道错了几个,但是不能知道哪个错了以及正确答案是多少--我将它理解为防止别人开小号 那你暴力开小 ...

  7. 【饭谈】在学习测开网课之前,你的心脏需要武装一下

    学习各种测开网课之前,你要做好心理建设,下面说的这些方面,有些也许你会感觉很难受,但是这也是真相. 一:[操作系统] 学习测试工具/平台,最好用mac,这是不争的.不是说windows一定不行,但是大 ...

  8. 算法工程师面试问题及资料超详细合集(多家公司算法岗面经/代码实战/网课/竞赛等)

    这里是算法江湖,传授AI武林秘籍. 资源目录: 一.算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 二.机器学习 面试问题.资料.代码实战 三.深度学习 面试.资料.代码实战Pyt ...

  9. 网课谁的最好_报补习班,还是“上网课”?利用课余时间提高成绩,网课更加适合...

    报补习班,还是"上网课"? 孩子白天到学校.晚上写作业,如何利用好课余时间,是提高成绩的关键. 许多家长觉得,每天既要上班,又要陪孩子写作业,不管是身体.心理还是情绪,早就已经不堪 ...

最新文章

  1. zabbix 监控项自动发现过滤_Zabbix监控之配置Linux自动发现与自动注册报警
  2. [js高手之路]打造通用的匀速运动框架
  3. Android之从网络上获取图片的两种方式讲解:thread+handle和AsyncTask方式
  4. Java中文与ASCII码的转换
  5. 正则表达式【第二卷】
  6. 比茅台还暴利!靠卖牌子年赚40个亿,如今被质疑造假
  7. for i in range什么意思_python迭代和解析——range、map函数
  8. android平台Camera采集数据ffmpeg进行编码探究
  9. Tomcat详解(二)——tomcat安装与配置
  10. 我有一个网站,想提高点权重
  11. S20_DAY20--课堂笔记
  12. isis软件添加源代码c语言,ProteusISIS和Keil软件入门学习..doc
  13. 汉王考勤 连接mysql_汉王考勤管理软件打开时出现:连接数据错误,请确认数据库服务器信息是否有误。这样该怎样解决?...
  14. 【解决方案 六】---在VS2015里使用ILDasm
  15. c语言dsp编程论坛,针对Ti的DSP C语言编程
  16. 2018年深圳,武汉房价走势分析
  17. 随手写的QT程序:文件大小转化可读字符串,整数转 B,KB,MB......
  18. MATLAB的画家之旅
  19. 分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)一
  20. Unirech:阿里云国际版账户无法登陆,为什么账户会被风控?

热门文章

  1. termux安装java_把安卓手机性能发挥到极致之-Termux运行Java及性能测试
  2. PHP之AOP面向切面编程原理(2)
  3. 决战燕京城-06 攻克袁斩高(二)
  4. 抖音品质建设 - iOS启动优化之原理篇
  5. 解决在cmd中输入powercfg /h off 出现的报错“无法执行操作,出现意外错误(0x65b)”
  6. vue实现点击箭头的旋转动画(收起展开)效果
  7. vscode 编辑器中间一条竖线去除方法
  8. ionic2 小米手机拍照选相册 闪退的问题
  9. ClsName2id.txt
  10. JAVA方法调用过程(最详细的解释)