ghpython语法去年看了一些,一直没有应用到实践中。

手头有些数据,都在行业内部网站上查询,网站使用吧safeKey加密狗,只能使用ie来认证加密。过去我认为这种网站是没用办法爬取数据的。研究了selenium后才明白,原来,selenium是模拟浏览器,只要是人工可以登录的,它都可以爬取。

这里只是折腾的记录和注意事项,不是教程。

selenium的使用

selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试

PhantomJS是无界面浏览器,但他是基于WebKit的,我的网站不能使用。

新的selenium已经不支持PhantomJS这款浏览器了,因此可以通过配置chrome的options进行替代

安装

在cmd里pip install  selenium,如果特别慢,可以使用国内服务加速。或是换个时段,基本就可以了。

驱动

要根据你需要使用的浏览器来下载驱动。比如我要使用ie,就要下载对应的驱动。

chromedriver驱动下载地址:

http://chromedriver.storage.googleapis.com/index.html

iedriverserver:

http://selenium-release.storage.googleapis.com/index.html

注意:

  • IEDriverServer的版本号和Selenium的版本号一定要一致,
  • 我因为使用错了版本(也有说是32位和64位的关系)最终我换成了3.0版本的32位,解决了send_keys很慢的问题.
  • 驱动文件要放在设置有环境变量的文件夹里,比较ie的所在路径根目录,python的所在路径根目录都可以。
  • 我试了下,把驱动文件直接和py文件放在同一文件夹下使用也是可以的。

基本用法

打开网页

from selenium import webdriverie = webdriver.Ie()#声明浏览器
url ='https://www.baidu.com'
ie.get(url)#打开浏览器预设网址
ie.implicitly_wait(10)#隐式等待
print(ie.page_source)#打印网页源代码
ie.refresh()  #刷新
ie.close()#关闭浏览器

定位元素并把字符发送上去

name_label = ie.find_element_by_id("usercode") #定位用户id录入框
name_label.clear()
name_label.send_keys('user') #录入自己的id

ul,ui节点,必须要先把父节点点击展开后,再点击子节点

ie.find_element_by_xpath("//*[@id='aa208020']").click()  ##点击展开父节点ie.find_element_by_xpath("//*[@id='bb108005']").click()    #再点击子节点

上面的代码使用了xpath,这比by_id看起来复杂一点,实际可以使用IEXPath,直接查看元素的xpath,复制到代码即可,很方便。据说xpath比较慢,没有CSS定位的方法快。

如果遇到frame页面,就用switch_to_frame

 ie.switch_to.frame(ie.find_element_by_name("mainFrame"))  ie.find_element_by_link_text("进入数据管理系统").click()

打开新页面时,跳转到新页面

##切换到跳转后的主页面
current_window = ie.current_window_handle  # 获取当前窗口handle name
all_window=ie.window_handles    # 返回当前会话中所有窗口的句柄。
for window in all_window:           #通过遍历判断要切换的窗口if window != current_window:ie.switch_to.window(window) # 将定位焦点切换到指定的窗口,包含所有可切换焦点的选项current_window = ie.current_window_handle   # 获取当前窗口handle nam

查找页面中的图片

    AA = "//img[contains(@id,'img')]"   img_urls = ie.find_elements_by_xpath(AA)  #读取图片链接对象listulist=[]for imgx in img_urls:  ulist.append(imgx.get_attribute('src'))    #将图片链接对象转换成链接listprint('该生共有图片张数'+str(len(ulist)))

上面代码为查找id包含img的元素,返一个列表,这个列表是元素的列表,我最早时的用法是,在后面的截图方法中,直接遍历这个img_urls列表,再imgx.get_attribute('src')取得url,但总是报错,原因不明,怀疑这个img_urls后面会变动,于是在取得img_urls后,直接遍历它,转换成url列表--ulist后面备用。

关于xpath语法里为什么用contains,我一开始是用通配符的,后来发现不行,看到下面的语法,才改用了contains:

部分属性值匹配
WebElement ele = driver.findElement(By.xpath("//input[start-with(@id,'fuck')]"));//匹配id以fuck开头的元素,id='fuckyou'
WebElement ele = driver.findElement(By.xpath("//input[ends-with(@id,'fuck')]"));//匹配id以fuck结尾的元素,id='youfuck'
WebElement ele = driver.findElement(By.xpath("//input[contains(@id,'fuck')]"));//匹配id中含有fuck的元素,id='youfuckyou'

上面取得图片url后,开始遍历下载这个页面所有的图片:

    m = 1for img_url in ulist:           #遍历图片链接listie.get(img_url)ie.find_element_by_xpath('/HTML/BODY/IMG').click() ##由于原图的url链接是js的,要点击一下才出大图。im=get_image(ie,'/HTML/BODY/IMG')    ##这里调用get_image方法,获取元素的截图    if not os.path.exists(datatitle+'/'+xm):os.makedirs(datatitle+'/'+xm)        ##创建文件夹im.convert('RGB').save(datatitle+'/'+xm+'/'+xm+str(m)+'.jpg')## convert('RGB')是png转成jpg的前提,RGBA意思是红色,绿色,蓝色,Alpha的色彩空间, Alpha指透明度。而JPG不支持透明度,所以要么丢弃Alpha,要么保存为.png文件# print('下载该生第'+str(m)+'张图片')print("\r", end="")print('\r下载该人图片:{0}   {1}/{2}'.format('▉'*m,m,len(ulist)), end='')m=m+1print("完成")

上图先打开url,再点击一次出大图,然后调用get_image方法来取得img对象,并创建文件夹,先把img转成RGB格式,再保存为jpg。如果直接保存png,图像较大,如果直接保存jpg,会报错。因为png包含有透明通道,必须转RGB。

print('\r   是个小技巧,这里的作用是打印下载图片的进度条而不换行:

\r 表示将光标的位置回退到本行的开头位置
\b 表示将光标的位置回退一位

python 语言中, 使用 print 打印输出时,默认是会进行换行的。如何让其不换行呢?

python 3.x 中,print有一个 end 参数,可以指定输出的结束符,默认是 \n

上面代码中的get_image方法,先截全屏,再定准元素的大小和坐标,把元素截取出来并返回img对象:

def get_snap(driver):  # 对目标网页进行截屏。这里截的是全屏driver.save_screenshot('full_snap.png')page_snap_obj=Image.open('full_snap.png')return page_snap_objdef get_image(driver,xpathstr): # 对验证码所在位置进行定位,然后截取验证码图片img = driver.find_element_by_xpath(xpathstr)time.sleep(1)location = img.locationsize = img.sizeleft = location['x']top = location['y']right = left + size['width']bottom = top + size['height'] page_snap_obj = get_snap(driver)    image_obj = page_snap_obj.crop((left, top, right, bottom)) return image_obj

上面这个函数,在校验码识别中也有应用。

关于校验码识别,下面具体说说:

我们需要 pillow 和 pytesseract 这两个库,pip install 安装就好。
还需要安装 Tesseract-OCR.exe ,找到环境变量--系统变量的 Path ,将 Tesseract-OCR 的安装目录添加进去

新建系统变量 : TESSDATA_PREFIX
变量值为 tessdata 文件夹的路径(在Tesseract-OCR的安装目录下)

进入cmd 输入下面的命令查看版本,正常运行则安装成功:tesseract --version

然后就可以在python中调用了

yzmimg=get_image(ie,'//*[@id="captcha-img"]/IMG')   #截取验证码图像
jym=pytesseract.image_to_string(yzmimg,lang='num',config='--psm 7 szt')[0:4]  #取得校验码str
## 图像识别时,参数lang=num,num为我下载的200个tif验证码训练的结果,--psm 7的意思是单行字符串,szt是我自定义的数字和字母白名单
## 训练结果和白名单文件都在tesseract文件夹内,环境变量不配置的话,使用要加上地址。

代码中我用到了自己训练的语言文件,方法参看:

https://blog.csdn.net/sylsjane/article/details/83751297

这篇比较具体,我就是按照这个训练了200张验证码图片。

Tesseract-OCR-3.0.5 数字识别训练与合并多次训练数据

下载:jTessBoxEditor安装包

效果还是不理想,于是我想到的白名单

打开
tessdata/configs/digits,复制一份,改名为szt(自定义)
改成
tessedit_char_whitelist ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ckmnosuvwxz
这个就是白名单,想识别谁就写进去,我要识别的代码里实际上只有大写字母和数字,后面的小写字母是因为它会把大写字母和小写字母接近的,识别成小写,如果白名单不加上这几个小写的话,就会出错。
另外命令里需要用digits,不然上边的设置没用,例如上面代码里config='--psm 7 szt'

这样,识别率大大提高,但总有识别错的时候,怎么办呢?

我做了个循环,最大尝试10次,每次输入完验证码后,就尝试点击跳转页的点击跳转的元素,如成功,就退出循环,不成功就继续下一循环,再次尝试识别新的验证码、登录。

为了更方便的登录下载,我单独做了个登录验证模块,登录成功后,返回一个浏览器对象,给要下载数据的模块使用。这次以后再要下载这个系统别的数据,只要简单调用这个模块就好了。

以下是登录模块全部代码(由于最早是按chrome写的,所有浏览器对象就命名为chrome了,实际调用的ie)

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from PIL import Image  #图像处理
# from selenium.webdriver.common.action_chains import ActionChains
import pytesseract
# 用于图片转文字,本模块PIP后,还要安装tesseract并配置环境变量,为了提高提别率,我还训练了识别模型,设置了只包括数字和字母大小写的白名单。def automatic_login(name,pwd,url):print('正在启动浏览器')chrome = webdriver.Ie()chrome.get(url)print('打开网页')chrome.implicitly_wait(10)chrome.maximize_window()##登录 循环10次,如果成功就返回浏览器对象,如果失败就循环尝试登录。err_jym=[]  #错误校验码记录列表sub = 1while  sub < 10:#发送id,密码,验证码后,点击登录name_label = chrome.find_element_by_id("usercode")name_label.clear()name_label.send_keys(name)pwd_label = chrome.find_element_by_name("password")    pwd_label.clear()pwd_label.send_keys(pwd)               yzmimg=get_image(chrome,'//*[@id="captcha-img"]/IMG')   #截取验证码图像 jym=pytesseract.image_to_string(yzmimg,lang='num',config='--psm 7 szt')[0:4]  #取得校验码str print('.....发送....')## 图像识别时,参数lang=num,num为我下载的200个tif验证码训练的结果,--psm 7的意思是单行字符串,szt是我自定义的数字和字母白名单## 训练结果和白名单文件都在tesseract文件夹内,环境变量不配置的话,使用要加上地址。jym_label = chrome.find_element_by_name("verifycode")    jym_label.clear()jym_label.send_keys(jym)login_label = chrome.find_element_by_name("Submit")  login_label.click()""" ***以下一堆代码是第一次使用的IE驱动为2.53版本的64位,输入字符很慢,且点击无效,现在改用3.0版本32驱动,上面的代码正常使用,下面的JS方式备用***js = 'document.getElementById("usercode").value="'+ name +'"' # 采用js的方法来输入/备用,如果上面速度慢,可用这个chrome.execute_script(js)pwjs = 'document.getElementsByName("password")[0].value="'+ pwd +'"'chrome.execute_script(pwjs)jyjs =r'document.getElementsByName("verifycode")[0].value="' + jym + '"'chrome.execute_script(jyjs)   chrome.find_element_by_name("Submit").send_keys(Keys.ENTER) ##由于点击无效,这里改成模拟回车   """      try: time.sleep(1)##登录后跳转页chrome.switch_to.frame(chrome.find_element_by_name("mainFrame"))  chrome.find_element_by_link_text("xxxx系统").click()##切换到跳转后的主页面current_window = chrome.current_window_handle  # 获取当前窗口handle nameall_window=chrome.window_handles    # 返回当前会话中所有窗口的句柄。for window in all_window:           #通过遍历判断要切换的窗口if window != current_window:chrome.switch_to.window(window)     # 将定位焦点切换到指定的窗口,包含所有可切换焦点的选项current_window = chrome.current_window_handle   # 获取当前窗口handle namprint("登录模块已成功登录:",chrome.title)return chromeexcept:time.sleep(1)print("authCode Error:", jym , "正在重新尝试登录,请稍候")if jym in err_jym:chrome.refresh()    ##如果列表中已经存在这个错误校验码,说明上次识别错误后,页面没有刷新,这里强制刷新一下。time.sleep(1)err_jym.append(jym)  #把错误的校验码写入记录备用                           sub=sub+1return False def get_snap(driver):  # 对目标网页进行截屏。这里截的是全屏print('....',end='')driver.save_screenshot('full_snap.png')print('......',end='')page_snap_obj=Image.open('full_snap.png')return page_snap_objdef get_image(driver,xpathstr): # 对验证码所在位置进行定位,然后截取验证码图片print('正在识别验证码',end='')img = driver.find_element_by_xpath(xpathstr)time.sleep(1)print('....',end='')location = img.location   size = img.size    left = location['x']top = location['y']right = left + size['width']bottom = top + size['height'] print('....',end='')page_snap_obj = get_snap(driver)   image_obj = page_snap_obj.crop((left, top, right, bottom)) return image_objif __name__  == "__main__":name = "xxxxxx"pwd = "xxxxxxx"url = "http://xxxxxxxxxx/"automatic_login(name,pwd,url)

某数据下载模块,其中的登录部分直接调用上面的模块,上面的py文件放在module文件夹下,同时该文件夹下要放一个__init__.py文件。

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from PIL import Image
# from selenium.webdriver.common.action_chains import ActionChains
import os
from openpyxl import Workbook
from module.load_ahzs import automatic_login    #加载登录模块#定义常量
name = "xxxxxx"
pwd = "xxxxxxxx"
url = "http://xxxxxxxxxx/"
data_select = 1   # 1:某数据下载  2:另一项数据下载##读取列表,抓取数据
savepath=""
datatitle=""
if data_select==1:     #根据不同项目来确认图版保存地点/选择点击节点dataxpath="//*[@id='ZY108500']"   datatitle='某数据下载'
else:dataxpath="//*[@id='ZY108300']"datatitle='另一数据下载'def get_snap(driver):  # 对目标网页进行截屏。这里截的是全屏driver.save_screenshot('full_snap.png')page_snap_obj=Image.open('full_snap.png')return page_snap_objdef get_image(driver,xpathstr): # 对验证码所在位置进行定位,然后截取验证码图片img = driver.find_element_by_xpath(xpathstr)time.sleep(1)location = img.location   size = img.size  left = location['x']top = location['y']right = left + size['width']bottom = top + size['height'] page_snap_obj = get_snap(driver)    image_obj = page_snap_obj.crop((left, top, right, bottom)) return image_objwb=Workbook()  #创建xlsx
ws = wb.activechrome = automatic_login(name,pwd,url)
chrome.implicitly_wait(10)
##两步点击进入某数据页面
chrome.find_element_by_xpath("//*[@id='paZY108000']").click()  ##进入点击父节点
# time.sleep(1)
chrome.find_element_by_xpath(dataxpath).click()    #进入子节点
# time.sleep(1)
chrome.find_element_by_id("btn-cx").click()print('开始下载'+datatitle)
##取得列表链接  //*[@id="main"]/DIV/TABLE/TBODY/TR[2]/TD[1]/DIV/A
list1=[]A="//*[@id='main']/DIV/TABLE/TBODY/TR["
B="]/TD[1]/DIV/A"
C=A+"*"+Bnum = 1
while num < 21:link_url = chrome.find_elements_by_xpath(C)    for link in link_url:        list1.append(link.get_attribute('href')) print('正在下载列表第',num,'页,本次最多下载20页')# 找到对应下一页的网页元素。执行点击操作try:chrome.find_element_by_link_text('下一页').click()   except:breaknum = num + 1print('总数为:',len(list1))
xuhao=1
for ksurl in list1:chrome.get(ksurl)
##     以下是内页测试     if data_select==1:  #某数据拉取数据sfz    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[2]/TD[2]').textxm     = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[3]/TD[2]').textsfzdz  = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[6]/TD[2]').texthjd    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[7]/TD[2]').textxj1    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[9]/TD[2]').textxj2    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[10]/TD[2]').textxj3    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[11]/TD[2]').textksh    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[2]/TD[4]').textmz     = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[3]/TD[4]').textbmd    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[4]/TD[4]').textbylb   = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[5]/TD[4]').textks=[sfz,xm,sfzdz,hjd,ksh,mz,bmd,bylb,xj1,xj2,xj3]else:    #另一数据拉取数据sfz    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[2]/TD[2]').textxm     = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[3]/TD[2]').textsfzdz  = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[6]/TD[2]').textksh    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[2]/TD[4]').textmz     = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[3]/TD[4]').textbmd    = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[4]/TD[4]').textbylb   = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[1]/TBODY/TR[5]/TD[4]').textif chrome.find_elements_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[2]/TBODY/TR[2]/TD[3]'):jfxm   = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[2]/TBODY/TR[2]/TD[2]').textshyj   = chrome.find_element_by_xpath('//*[@id="main"]/DIV/FORM/TABLE[2]/TBODY/TR[2]/TD[3]').textelse:jfxm=shyj="未审核通过"ks=[sfz,xm,sfzdz,ksh,mz,bmd,bylb,jfxm,shyj]print('下载第'+str(xuhao)+'名数据:'+xm+'  总数:'+str(len(list1)))xuhao=xuhao+1ws.append(ks)  #数据写入xlsx行AA = "//img[contains(@id,'img')]"   img_urls = chrome.find_elements_by_xpath(AA)  #读取图片链接对象listulist=[]for imgx in img_urls:  ulist.append(imgx.get_attribute('src'))    #将图片链接对象转换成链接listprint('该人共有图片张数'+str(len(ulist)))m = 1for img_url in ulist:           #遍历图片链接listchrome.get(img_url) chrome.find_element_by_xpath('/HTML/BODY/IMG').click()im=get_image(chrome,'/HTML/BODY/IMG')  if not os.path.exists(datatitle+'/'+xm):os.makedirs(datatitle+'/'+xm)        ##创建文件夹im.convert('RGB').save(datatitle+'/'+xm+'/'+xm+str(m)+'.jpg')## convert('RGB')是png转成jpg的前提,RGBA意思是红色,绿色,蓝色,Alpha的色彩空间,Alpha指透明度。而JPG不支持透明度,所以要么丢弃Alpha,要么保存为.png文件print("\r", end="")print('\r下载该人图片:{0}   {1}/{2}'.format('▉'*m,m,len(ulist)), end='')m=m+1print("完成")wb.save(datatitle+'/'+datatitle+str(len(list1))+'人.xlsx')  ##写入xls
print('下载完成')#关闭和退出浏览器
chrome.close()
chrome.quit()

Python+selenium下载数据初探相关推荐

  1. python selenium 下载文件_Python Selenium —— 文件上传、下载,其实很简单

    很多selenium学习者被浏览器弹出的文件上传.下载框折磨的痛不欲生,今天博主就带你们轻松搞定上传和下载问题. 上传 上传弹框 文件上传是所有UI自动化测试都要面对的一个头疼问题,要处理这个问题,我 ...

  2. 爬虫攻守道 - 2023最新 - Python Selenium 实现 - 数据去伪存真,正则表达式谁与争锋 - 爬取某天气网站历史数据

    前言 前面写过3篇文章,分别介绍了反爬措施,JS逆向+ajax获取数据,以及正则表达式匹配开头.结尾.中间的用法.第3篇算是本文 Python Selenium 爬虫实现方案的子集,大家可以参照阅读. ...

  3. python+selenium提取数据

    当通过python+selenium在抓取数据的时候,获取不到相应数据时,可以尝试先检查抓出数据的分析界面 html = browser.page_sourcedoc = pq(html)d = do ...

  4. python批量下载数据|工具箱

    现在很多数据提供HTTPServer下载服务,在这里介绍一种普遍适用的利用URL批量下载数据的python方法 前言 很多数据支持FTP下载,也提供OPeNDAP方式下载.两者的差异是显而易见的: ( ...

  5. python selenium下载_Python Selenium安装下载

    本篇讲解Python Selenium如何安装,下载.本篇已假定你已经熟悉Python,并且已安装好Python和pip. 本篇及以后篇幅所讲代码都调试运行在Python3.6版本上通过. Pytho ...

  6. 如何用python批量下载数据_Python批量下载地理空间数据云数据!Python无所不能!...

    模拟登录 这里要用到两个包:requests和json.requests使用前得先安装:pip install requests. In [3]: 进群:548377875 即可获取数十套PDF哦! ...

  7. python selenium下载电子书

    转载至:TTyb    http://www.cnblogs.com/TTyb/p/5989152.html 妹纸推荐书籍<御伽草纸>,网上找了很久都找不到下载,估计是被Amazon版权了 ...

  8. [049量化交易]python同花顺下载数据写入MongoDB数据库

    import requests # 导入requests包 from bs4 import BeautifulSoup from urllib import request import re imp ...

  9. 如何用python批量下载数据_使用Python批量下载数据

    这次依旧是,不过下载的是Australian Bureau of Statistics的数据,都是xls的表格,网址为:http://www.abs.gov.au.网页打开左边有棵树目录,里面记录的澳 ...

最新文章

  1. 南华大学java补考_关于2017年秋季学期学生补考报名及成绩复核的通知
  2. 获取系统特殊文件夹的路径
  3. swift学习笔记之一——初见swift
  4. 在线闹钟html代码复制,html5时钟实现代码
  5. wh计算公式_“笔记本”电池里的mAh和Wh有啥区别
  6. 吴恩达机器学习作业4(python实现)
  7. 几个公共FTP服务器
  8. 全球最大的第一视角视频数据集开源,取自真实生活,还能提升厨艺
  9. PHP函数中true表示什么,使用返回true或false的函数的PHP最佳实践是什么?
  10. topcoder srm 540 div1
  11. 计算机黑屏但是有鼠标,电脑桌面黑屏怎么解决 电脑黑屏怎么办 - 云骑士一键重装系统...
  12. MySQL数据库基本操作指令
  13. 【有问不答】一维信号临界采样/过采样/欠采样,并利用插值公式恢复信号(MATLAB)
  14. Gitee上传代码 提示remote Incorrect username or password ( access token )错误原因
  15. mybatis的selectOne分享
  16. scp 自定义端口号
  17. 厦门大学研究生计算机复试分数线,关于2018厦门大学研究生考试复试分数线的一些公告...
  18. 指标体系:指标的设计方法
  19. 当 GUC 参数 enable_dynamic_workload 设置为 on
  20. 《深入剖析Kubernetes》-张磊——白话容器基础(三):深入理解容器镜像

热门文章

  1. access课程均不及格_2014年全国计算机二级access上机考点 7
  2. idea驼峰插件——非常好用简单的驼峰插件:EasyCamelQSM
  3. 征途手游服务器又维护,征途手机版12月5日全区停服更新公告
  4. 基于EasyX的拼图游戏
  5. ffmpeg自学路(一)用ubantu编译支持android的ffmpeg支持库,感谢韩曙亮
  6. 打开方式对话框 及 RUNDLL32(RUNDLL)的使用
  7. 别说你只看到庞大的中国来客,CES仍在预言2018年AI加持下的科技圈走势
  8. cesium绘制中国边界,设置边界样式
  9. java后台姓名与手机号中间用*号代替
  10. linux 6.6用户名密码,CentOS6.6设置grub密码