网络爬虫之Selenium(可视化)爬虫
前言:今天跟大家分享网络(selenium)爬虫,网络爬虫技术的用处范围非常广泛以及非常强大的一门技术。介绍爬虫之后,跟大家延伸Python这一门技术,因为讲到爬虫,就会联想到Python,自己也会讲一些关于Python的知识。
目录
一、网络爬虫介绍
二、爬虫(selenium可视化爬虫)具体案例:
三、关于Python的简介:
一、网络爬虫介绍
1、什么是爬虫:
网络爬虫(web crawler)也叫网页蜘蛛,网络机器人,是一种用来自动浏览万维网的程序或者脚本。爬虫可以验证超链接和HTML代码,用于网络抓取(Web scraping)。网络搜索引擎等站点通过爬虫软件更新自身的网站内容(Web content)或其对其他网站的索引。
2、爬虫的由来(为什么会有爬虫):
随着时代的发展,信息时代引领时代潮流,但我们到网上去搜集信息时,查找网上的海量信息就像大海捞针,森罗万象,要提取到对我们有用的信息,我们需要一种能自动获取网页内容并可以按照指定规则提取相应内容的程序,就这样爬虫就诞生了。
3、爬虫的原理:
爬虫首先从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
用eclipce来实现爬虫技术:
1、将浏览器加载到jvm
2、创建浏览器对象
3、打开对应网址对应的网站
4、爬虫的爬取对象:包括互联网所有可以爬回的数据、文字、视频、图片,以及非结构化数据。
二、爬虫(selenium可视化爬虫)具体案例:
1、关于python爬虫的说法,这里有一个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多,例如:
PHP,JAVA,C++,Python等等,到多数程序员选择Python做爬虫,是因为Python相对来说简单,而且功能比较齐全。今天我跟大家分享爬虫在JAVA语言导入selenium做的
2、实操:
一、爬虫的准备工作:(用JAVA语言来做爬虫,并且用的是Maven项目,也可以用web项目,)
步骤:
1、在Eclipse中创建一个Maven项目,创建之后要将Maven依赖,以及web版本,还有pom.xml、project.Facets配置好。
2、导入selenium相关依赖
<dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
</dependencies>
要是用web项目去爬虫,就要导入相关的jar包:
3、下载与浏览器版本相同的压缩包,我用的是谷歌浏览器,在网页主界面点击帮助关于即可查看自己所用浏览的版本:
如果没有相同版本的压缩包,就选版本最近的压缩包:我的浏览器版本是95.0.4638.69,没有这个版本就下载相近的版本:
点进去之后,无论是什么浏览器,都选择chromedriver_win32.zip,这个文件夹:
4、将下载的驱动包放置到一个英文文件夹中:
就这样爬虫的准备工作就已经完成了。
二、案例来讲解爬虫
案例一:获取到百度网页:
1、用JAVA语言做爬虫的思路:
用JAVA来实现爬虫技术:
1、将浏览器加载到jvm
2、创建浏览器对象
3、打开对应网址对应的网站
2、具体代码:(每行代码的注释我已经备注好了)
package com.zking.selenium;import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class demo1 {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "D:\\initpath\\chromedriver.exe");//以键值对的形式设置,
// webdriver.chrome.driver是那个驱动包,
// D:\\initpath\\chromedriver.exe是指那个解压文件的路径WebDriver driver=new ChromeDriver();//得到一个谷歌浏览器,driver.get("http://www.baidu.com");//得到百度页面}
}
3、运行效果:
案例二:获取博客:爬取博客内容分为爬取博客的标题,博客的摘要以及博客的发布时间:
先跟大家讲一讲思路:(注意:要用到找规律的思想)
1、首先获取到跳转到我的博客网页的网站
2、获取到最近全部的博客元素,注意只有三十篇。
3、获取每篇文章的标题、摘要以及发布时间的Xpath。
4、遍历最近博客数组,之后将以上三个元素内容全部打印出来。
先从网上抓一篇博客,就拿自己的博客做案例:
1、首先获取到跳转到我的博客网页的网站:
我的博客的网站为:"https://blog.csdn.net/m0_53151031?t=1"
相关代码:
System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");WebDriver driver = new ChromeDriver();driver.get("https://blog.csdn.net/m0_53151031?t=1");
2、获取到最近全部的博客元素,注意只有三十篇:
根据节点找到对应的元素数组方法:(列一行代码)
List<WebElement> elements = driver.findElements(By.className("blog-list-box"));
获取到该节点里全部的博客:
List<WebElement> elements = driver.findElements(By.className("blog-list-box"));
//获取到该节点里面全部元素,返回的是一个元素数组。
System.out.println(elements.size());//元素数组长度
运行结果:
跳转过程中:
最近博客篇数为30:
3、获取每篇文章的标题、摘要以及发布时间的Xpath。
首先讲解一下怎么获取到对应元素的Xpath:(以获取摘要内容为例:)
3.1获取关于标题的Xpath:
获取单个节点的方法:
driver.findElement(By.xpath());
第一篇博客标题的Xpath:
[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4
获取一篇标题还不够,我将要获取到全部标题的Xpath,这就要使用到了找规律的思想,找三篇博客的Xpath进行对比:
第一篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4
第二篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[1]/h4
第三篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[1]/h4
可以得出规律,在每一篇博客标题的Xpath中,发现在atricle前的数字是依次增加的。
所以可以写出得到最近全部博客标题的Xpath,在遍历的时候将数字替换成i;
博客标题的遍历:WebElement titleEle = driver.findElement(
By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
+ "]/article/a/div[1]/h4"));
3.2获取关于摘要、发布时间Xpath:
摘要Xpath:
第一个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[2]
第二个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[2]
第三个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[2]
可以写出得到最近全部摘要的Xpath,在遍历的时候将数字替换成i;
博客摘要的遍历:WebElement summaryEle = driver.findElement(
By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
+ "]/article/a/div[2]"));
发布时间Xpath:
第一个发布时间Xpath: [@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[3]/div[2]/span[3]
第二个发布时间Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[3]/div[2]/span[3]
第三个发布时间Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[3]/div[2]/span[3]
所以可以写出得到最近全部博客发布时间的Xpath,在遍历的时候将数字替换成i;
博客发布时间的遍历:WebElement timeEle = driver.findElement(
By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
+ "]/article/a/div[3]/div[2]/span[3]"));
4、遍历最近博客数组:
代码:
package com.zking.selenium;import java.util.List;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class demo2 {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");WebDriver driver = new ChromeDriver();driver.get("https://blog.csdn.net/m0_53151031?t=1");List<WebElement> elements = driver.findElements(By.className("blog-list-box"));System.out.println(elements.size());for (int i = 1; i < elements.size(); i++) {WebElement titleEle = driver.findElement(By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i+ "]/article/a/div[1]/h4"));//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[1]/h4//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[1]/h4System.out.println(titleEle.getText());//输出总共有多少博客// 播客摘要//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[2]//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[2]//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[2]WebElement summaryEle = driver.findElement(By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i+ "]/article/a/div[2]"));System.out.println(summaryEle.getText());//注意这里必须打印该元素的文本内容// 发布时间//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[3]/div[2]/span[3]//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[3]/div[2]/span[3]//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[3]/div[2]/span[3]WebElement timeEle = driver.findElement(By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i+ "]/article/a/div[3]/div[2]/span[3]"));System.out.println(timeEle.getText());}}
}
注意事项:注意遍历数组时,数字是从1开始:
运行结果:
案例三:获取二进制文件:比如图片、音乐、视频。
这个案例是讲解如何获取网站图片:
1、注意:接下来的代码可以抓取没有对应网站限制的资源
网站限制的方式有以下三种:
1、在某一时间段/min访问60次,会被拉入黑名单--->IP黑名单
2、对应网站会甄别,是人工访问,还是程序访问,是程序访问,就会被访问
3、携带请求的session
2、二进制文件资源抓取的思路:
1、按照文字抓取的方式,获取资源的具体地址
2、根据具体地址,通过IO流下载到本地
2.1将具体地址的资源转换成输入流
2.2将对应资源写到本地,需要构建输出流
3.代码:
3.1、按照文字抓取的方式,获取资源的具体地址:
System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");WebDriver driver = new ChromeDriver();driver.get("https://m.ivsky.com/");
3.2、根据具体地址,通过IO流下载到本地
3.2.1:将具体地址的资源转换成输入流:
// 通过统一资源定位符,获取资源对象URL url = new URL(src);// 将资源对象转换成输入流InputStream in = url.openStream();
3.2.1:将对应资源写到本地,需要构建输出流:
// 获取图片格式src = src.substring(src.lastIndexOf("."));// 下载图片格式FileOutputStream fout = new FileOutputStream("D:/novel/" + UUID.randomUUID().toString() + src);//构建输入流BufferedOutputStream bout = new BufferedOutputStream(fout);//buffer增加效益byte[] b = new byte[1024];while (true) {int len = in.read();//.read()方法返回的是0到255范围的内的int字节值System.out.println(len);if (len == -1)//到达流末尾而没有可用的字节,就会停止下载break;bout.write(b, 0, len);三个参数分别是:b:读取文件字节值最大值为1024,0:读取文件从0开始,len:每次读取文件时,写入的字节长度。}
.write() 这个方法的意思是:读取一个文件从0开始,最大值只有1024,但是一个文件字节值只有10,那么就只读取到10就把该文件给读取完了,如果该文件字节值比1024还要大,分两种情况:1、读到1024就停止对该文件的读取2如果想要继续读,就要定义b的大小。根据文件的最大值来定,可以是2048
4.运行效果:
nove文件夹为空:
运行之后结果:
4.1、对应资源网站:
4.2、运行过程中的控制台:
运行结果之后:novel文件夹就下好了图片。
案例四:爬取音乐,和爬取图片是一样的原理。
1、二进制文件资源抓取的思路:
1、按照文字抓取的方式,获取资源的具体地址
2、根据具体地址,通过IO流下载到本地
2.1将具体地址的资源转换成输入流
2.2将对应资源写到本地,需要构建输出流
2、代码:
package com.zking.selenium;import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.UUID;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class demo4 {public static void main(String[] args) throws Exception {System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");WebDriver driver = new ChromeDriver();driver.get("https://houzi8.com/peiyue/qingyinyue-0-0-0-0-0?usid=22876&bd_vid=10917515020733932303");/** 二进制文件资源抓取 1.按照文字爬取的方式,获取到资源的具体地址 ①、将具体地址的资源转换成输入流 ②、将对应资源写到本地,需要构建输出流* selenium jsoup*/List<WebElement> audioEles = driver.findElements(By.className("play-button-wrapper"));//获取整个音乐---->数组for (WebElement audioEle : audioEles) {audioEle.click();WebElement playEle = driver.findElement(By.xpath("//*[@id=\\\"wavesurferPlayer\\\"]/audio"));//找到对应的XpathSystem.out.println(playEle.getAttribute("src"));//获取资源路径downloadImg(playEle.getAttribute("src"));}}private static void downloadImg(String src) throws Exception {// 通过统一资源定位符,获取资源对象URL url = new URL(src);// 将资源对象转换成输入流InputStream in = url.openStream();src = src.substring(src.lastIndexOf("."));FileOutputStream fout = new FileOutputStream("D:/novel1/" + UUID.randomUUID().toString() + src);//下载到本地路径BufferedOutputStream bout = new BufferedOutputStream(fout);byte[] b = new byte[1024];while (true) {int len = in.read(b);if (len == -1)break;bout.write(b, 0, len);}}}
三、关于Python的简介:
1、Python的起源:
python这么强大的语言是由荷兰数学和计算机科学研究学会的Guido va Rossum于1990年代初设计。其中Guido发明的pathon语言的历程
1989年,Guido创立了Python语言
2005年12月 ,Guido在google公司任职,
2012年12月7日,Dropbox宣布吉多·范罗苏姆加入Dropbox公司。
Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。
像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。
现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
Python 2.7 被确定为最后一个 Python 2.x 版本,它除了支持 Python 2.x 语法外,还支持部分 Python 3.1 语法。
Python 3.0 于 2008 年 12 月 3 日发布,此版不完全兼容之前的 Python 源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。
Python 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。
那么彻底的起源是什么呢,也就是说,有Guido参与设计的一个语言ABC 是一个非常强大而且的优美的语言,可惜的是ABC是属于那种非开发性的,后来Guido就发明了Pathoy这门强大的语言。
2、Python是什么:度娘上是这样说道:
Python是一种计算机程序设计语言,作为一门叫做ABC语言的替代品,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。以及python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python这个单词原意是蟒蛇,可以想象为一条蟒蛇爬到对应网页上进行爬取数据。
也可以进行细讲:
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>>
后直接执行代码。
Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
3、Python的十大特点:
3.1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
3.2.易于阅读:Python语言简洁
3.3.易于维护:Python的成功在于它的源代码是相当容易维护的。
3.4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
3.5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
3.6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
3.7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
3.8.数据库:Python提供所有主要的商业数据库的接口。
3.9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。
3.10.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。
4、Python主要用途:
1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。
5、Python作用:
1、系统编程
2、图形处理
3、数学处理
4、文本处理
5、数据库编程
6、网络编程
总结:爬虫这一门技术,涉及到各行语言,但是我们说到爬虫,第一个就会联想到Python爬虫,其他语言也可以做爬虫,PHP,JAVA,C++,Python等等。我今天跟大家分享的是使用在JAVA导入selenium做的爬虫,做爬虫技术的时候,个人觉得找到对应的节点,还有根据找到节点之间的规律,那么爬虫技术就不难了。当然在做爬虫之前的准备工作也很重要!
爬虫知识就分享到这里了,希望对你有所帮助,有纰漏之处请大神多加指点。
网络爬虫之Selenium(可视化)爬虫相关推荐
- python selenium 进入新标签页_python 爬虫之selenium可视化爬虫
文章目录 前文回顾 快速入门 元素定位 页面操作 等待方式 扩展程序加载 点击此处,获取海量Python学习资料! 之所以把selenium爬虫称之为可视化爬虫 主要是相较于前面所提到的几种网页解析的 ...
- Python爬虫编程思想(162): 综合爬虫项目:可视化爬虫
到现在为止,我们已经学习了相当多的爬虫知识,包括各种网络库.分析库.多线程爬虫.基于Selenium和Appium的爬虫,以及Scrapy爬虫框架.在前面的章节中也提供了大量的爬虫项目,不过这些爬虫应 ...
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- python爬取淘宝商品做数据挖掘_Python 3爬虫 数据清洗与可视化实战 Python数据抓取技术 python3网络爬虫教程书籍 运用Python工具获取电商平台页面数据挖掘书籍...
A8 书 名:Python 3爬虫 数据清洗与可视化实战 作 译 者:零一,韩要宾,黄园园 出版时间:2018-03 千 字 数:200 版 次:01-01 页 数:212 开 ...
- 网络爬虫笔记—Selenium
网络爬虫笔记-Selenium 1.简介及环境安装 Selenium是一种自动化测试工具,利用它可以操作浏览器执行固定动作,例如点击.下拉等操作.在日常工作中,如果你需要用浏览器并且重复某项操作,那S ...
- Python 网络爬虫:Selenium 好买基金网
更多商业数据分析案例(原理,完整代码,数据集).统计学.SQL.网络爬虫详见公众号 " 数据分析与商业实践 " 引言 网络爬虫应用十分广泛,本篇针对金融领域,目的为根据用户输入 ...
- python网络爬虫——使用selenium抓取东方财富网上市公司公告
每日公告数量@TOC 一.数据获取与预处理 本文从东方财富网上市公司公告页面获取沪深A股1991-2019年公告数据,按照数据获取的先后顺序,将数据分为以下两个部分一是上市公司公告信息,包括:序号(i ...
- Python实验1——网络爬虫及数据可视化
Python实验1--网络爬虫及数据可视化 一.实验目标与基本要求 实验目标 基本要求 二.主要知识点.重点与难点 主要知识点 重点 难点 三.实验过程设计 获取网页 获取数据 保存到数据库 数据预处 ...
- 虎扑论坛爬虫采集数据可视化分析
原文链接:http://tecdat.cn/?p=2018 论坛为用户提供了相同的业余爱好,互动和交流的广阔平台,以及由此产生的庞大数据和复杂的用户交互场景也包含有价值的信息,本文关于虎扑论坛的帖子, ...
最新文章
- 再谈PowerPoint 2010导出幻灯片为图片
- JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
- python【力扣LeetCode算法题库】22- 括号生成(DFS)
- ABAP DOI详解(3)
- Python 内置方法和属性应用:反射和单例
- Java技巧:用一个循环语句输出九九乘法表!
- Python函数之 ceil, floor,round
- volatile的适用场合
- centos安装python3.8
- leetcode题库5-- 最长回文子串
- 力压今日头条成 App Store 榜第一,个税 App 惊爆 62 例木马病毒!
- Ubuntu 安装 OpenRefine 并配置启动图标
- CAD.NET 选择集操作
- matlab元胞数组
- 关于复数i本质的探讨
- shell命令之nm
- java中ajax是什么意思,java中使用Ajax技术
- 【利用Altium Designer2018设计元器件原理图库】
- Html按钮调用手机静音,静音/取消静音没有按钮HTML5
- python编写程序、实现一个数字金字塔_python实现输入任意一个大写字母生成金字塔的示例...
热门文章
- Facebook被巴西扣押近7700万元:只因WhatsApp不听话
- 反垃圾邮件网关的选型标准考量录
- 看了潘爱民老师的关于smartcache for webkit的paper
- 图文详述:下载安装JDK,搭建Java开发环境,并运行第一个Java程序
- AWC / Advanced SystemCare Pro(专业版)V3.7.0+有效注册码
- 6个月的开发到软件测试,聊聊我的职业生涯
- W中的Event 1A到Event 1J以及Event 2A到2F的含义?
- JS获取日期(年/月/日/时/分/秒)格式转化
- 城市公交线路查询系统
- SQLyog下载安装