引言
1.1课题背景
作为搜索引擎技术核心元素之一,自1993年初 Matthew Gray’s Wandered 在麻省理工学院开发出有史记载的第一个网络爬虫以来,爬虫技术历经20多年的发展,技术已日趋多样。为满足不同用户多种多样的需求,创建开发了类型众多的爬虫系统。按照实现技术和其系统构成,爬虫系统主要可以分为以下几种:
1.通用网络爬虫
通用网络爬虫(General Purpose Web Crawler) 也可称之为全站爬虫(Scalable Web Crawler),它通过一系列预设的初始链接开始,获取页面上所有链接,根据预设规则,提取链接,进入待爬取队列,进而不断访问网页下载网页或取链接。然后通过HTML解析技术,获取页面数据,提取所需信息并保存,与此同时将新获取的链接放入待爬取队列,直到达到系统预设指定条件为止。通用网络爬虫有两种常用的爬取策略:
(1)深度优先策略(Depth first strategy):
这个是在爬虫发展早期使用比较多的方法。这种策略最终要达到的效果是一直搜索到由站点分布抽象出来的树的叶子节点(即网页站点的最底层不包含任何其他不重复的网页链接的网页) 。在一个网页文件中,当爬虫获得当前网页中的第一个链接后,就对该链接所指向的网页文件执行深度优先搜索策略,也就是说在搜索当前页面的其他的链结结果之前,必须先搜索出一条路径使其形成一条独立的完整的链。形象点说深度优先搜索策略就是沿着该网页解析出的HTML文件的一个链接转接到另一个链接从而由链接组成的链接网络一直走到不能更加深入为止,然后返回到之前所在的某一个网页文件中,再继续选择该网页文件中的下一个不重复的链接,重复上述动作。当初始网页中不再存在其他链接可供选择时,说明此次搜索已经结束。但如果所需爬取网页节点结构比较深时的时候,该策略会引起较大的资源浪费,爬取效率也不太高。

(2)广度优先策略(Breadth first strategy):
简称BFS,又称之为宽度优先搜索策略,或横向优先搜索策略,作为一种图形搜索算法提出来,其思想亦可用于网络爬虫的设计。简单的说,广度优先搜索策略是从树根节点开始,沿着树的宽度遍历树在同一层的节点。如果该树的所有节点均被访问,则算法结束。广度优先搜索策略的实现一般采用open-closed表。广度优先搜索策略先将所需爬取网页的站点按照页面结构划分成不同的层次,然后沿着划分好的层次一层一层的由上到下进行爬取。先爬取浅层次的链接,将处于同一层次的所有网页处理完成之后再向下一个层次继续爬取。广度优先策略可以以并发的方式进行爬取,由于程序并发会提高程序的工作效率,所以这种特性在一定程度上可以提高爬虫的爬取效率,而且同时也可以任意控制爬虫爬取网站站点的深度,从而避免了使用深度优先策略是爬虫陷入无穷深度从而导致爬虫不能正常结束的状态。
利用通用爬虫策略实现爬虫算法的Google crawl爬取目前存在于互联网上所有网站网页,谷歌公司通过建立分布式系统网络加上异步输入输出的技术来用以提高整个爬虫系统的并发度,期间还使用了包括PageRank算法在内的众多提升系统运行效率的算法来优化Google crawl爬虫的爬取性能。

1.2目的和意义
使用Python–网络爬虫技术实现“音乐下载器”功能,该功能为用户搜集了大多数音乐网站的音乐歌曲信息,这样使得用户无需到各个音乐网站去搜索所需下载的音乐歌曲信息,不仅为用户节省了时间,同时提升的搜索结果效率。
使用Python–网络爬虫技术实现“图片下载器”功能,该功能为用户提供了三大搜索网站的图片批量下载功能,当用户想要在某网站下载批量图片时,无需一张张的点击保存,这样使得用户无需到某网站去搜索想要下载“关键字”所需下载的音乐歌曲信息,不仅为用户节省了时间,同时提升的搜索结果效率。
所以说使用Python–网络爬虫实现“音乐下载器”和“图片批量下载”功能是很有帮助的,由此,在本文中将详细讲解使用Python–网络爬虫技术实现“音乐下载器”和“图片批量下载”功能时所涉及到相关问题和解决相关问题的方法。

1.3要实现的功能
音乐下载器功能:
1)、用户输入想要下载的歌曲名称;
2)、程序获取用户所输入的歌曲名称关键字,根据该“关键字”向QQ 音乐、酷狗音乐、网易音乐等网站发起数据请求;
3)、程序根据返回的数据信息,进行分析后,呈现表格的形式给用户
4)、用户输入表格所显示的id号,便可下载该歌曲;

图片的批量下载功能:
1)、用户输入想要下载的图片名称、再选择该图片的名称要在哪个网站搜索(所支持的网站有:百度、必应、Google)、接着再输入要下载图片的数量(最大支持下载1000张);
2)、程序获取用户所输入的图片名称关键字,根据该“关键字”向用户 所选择的网站发起数据请求,并下载指定数量的图片;

1.4本章小结
本章节主要介绍了Python网络爬虫的课题背景、目的和意义以及要实现的的功能要求。
 系统结构
2.1音乐下载器功能
2.1.1流程图

2.1.2测试环境
操作系统:Window10
开发工具:PyCharm
Python版本:3.7.3
2.1.3所需依赖包
pycryptodome、requests、click、prettytable
2.1.4所支持下载歌曲的网站

2.1.5各个模块的介绍
requests模块:requests是使用Apache2 licensed 许可证的HTTP库,比urllib2模块更简洁。Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
pycryptodome模块:PyCryptodome是python一个强大的加密算法库,可以实现常见的单向加密、对称加密、非对称加密和流加密算法。
prettytable模块:Python通过prettytable模块将输出内容如表格方式整齐输出,python本身并不内置,需要独立安装该第三方库。
2.1.6相关模块的使用描述
requests模块的使用描述:
1.安装
pip install requests
2.导入模块
import requests
3.为url传递参数
url_params = {‘key’:‘value’} #字典传递参数,如果值为None的键不 会被添加到url中
r = requests.get(‘your url’,params = url_params)
4.设置头信息和Cookie信息
header = {‘user-agent’: ‘my-app/0.0.1’’}
cookie = {‘key’:‘value’}
r = requests.get/post(‘your url’,headers=header,cookies=cookie)
data = {‘some’: ‘data’}
headers = {‘content-type’: ‘application/json’,‘User-Agent’: ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22. 0’}
r = requests.post(‘https://www.baidu.com’, data=data, headers=heade rs)
5.发起Get请求
header = {‘user-agent’: ‘my-app/0.0.1’’}
cookie = {‘key’:‘value’}
r = requests.get/post(‘your url’,headers=header,cookies=cookie)
data = {‘some’: ‘data’}
headers = {‘content-type’: ‘application/json’,‘User-Agent’: ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22. 0’}
r = requests.post(‘https://api.github.com/some/endpoint’, data=data, h eaders=headers)
print(r.text)
6.发起Post请求

1、基本POST实例

import requests
payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
ret = requests.post(“http://httpbin.org/post”, data=payload)
print(ret.text)

2、发送请求头和数据实例

import requests
import json

url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
headers = {‘content-type’: ‘application/json’}
ret = requests.post(url, data=json.dumps(payload), headers=headers)
print(ret.text)
print(ret.cookies)

prettytable模块的使用描述:
1.安装
pip install PrettyTable
2.导入模块
from prettytable import PrettyTable
3.实例代码
from prettytable import PrettyTable
x = PrettyTable([“姓名”, “性别”, “年龄”, “存款”])
x.align[“姓名”] = “1” #以姓名字段左对齐
x.padding_width = 1 # 填充宽度
x.add_row([“赵一”,“男”, 20, 100000])
x.add_row([“钱二”,“男”, 21, 500])
x.add_row([“孙三”, “男”, 22, 400.7])
x.add_row([“李四”, “男”, 23, 619.5])
x.add_row([“周五”, “男”, 24, 1214.8])
x.add_row([“吴六”, “女”, 25, 646.9])
x.add_row([“郑七”, “女”, 26, 869.4])
x.add_row([“王七加一”, “男”, 21, 869.4])
print(x)
4.实现效果

2.2图片的批量下载功能
2.2.1流程图

2.2.2测试环境
操作系统:Window10
开发工具:PyCharm
Python版本:3.7.3
2.2.3所需依赖包
future、PySocks、requests、selenium、PyQt5
2.2.4所支持下载图片的网站
百度、必应、Google
2.2.5各个模块的介绍
requests模块:requests是使用Apache2 licensed 许可证的HTTP库,比urllib2模块更简洁。Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
selenium模块:selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
PySocks模块:PySocks是一个基于Python的SOCKS代理客户端,它是SocksiPy的一个分支,修改了一些bug和增加了一些额外功能。
PyQt5模块:PyQt5是一套来自Digia的Qt5应用框架和Python的粘合剂。支持Python2.x和Python3.x版本。PyQt5以一套Python模块的形式来实现功能。它包含了超过620个类,600个方法和函数。它是一个多平台的工具套件,它可以运行在所有的主流操作系统中,包含Unix,Windows和Mac OS。PyQt5采用双重许可模式。

2.2.6相关模块的使用描述
selenium模块的使用描述:
1.安装
pip install selenium
2.普通方式启动
启动Chrome浏览器:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(‘http://www.baidu.com/’)
启动Firefox浏览器:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get(‘http://www.baidu.com/’)
启动IE浏览器:
from selenium import webdriver
browser = webdriver.Ie()
browser.get(‘http://www.baidu.com/’)
3.元素定位
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
1)id定位:find_element_by_id()
2)name定位:find_element_by_name()
3)class定位:find_element_by_class_name()
4)link定位:find_element_by_link_text()
5)partial link定位:find_element_by_partial_link_text()
6)tag定位:find_element_by_tag_name()
7)xpath定位:find_element_by_xpath()
8)css定位:find_element_by_css_selector()
实例代码:
#coding=utf-8
from selenium import webdriver
browser=webdriver.Firefox()
browser.get(“http://www.baidu.com”)
#通过id方式定位
browser.find_element_by_id(“kw”).send_keys(“selenium”)
#通过name方式定位
browser.find_element_by_name(“wd”).send_keys(“selenium”)
#通过tag name方式定位
browser.find_element_by_tag_name(“input”).send_keys(“selenium”)
#通过class name方式定位
browser.find_element_by_class_name(“s_ipt”).send_keys(“selenium”)
#通过CSS方式定位
browser.find_element_by_css_selector("#kw").send_keys(“selenium”)
#通过xpath方式定位
browser.find_element_by_xpath("//input[@id=‘kw’]").send_keys(“seleni um”)
browser.find_element_by_id(“su”).click()
time.sleep(3)
browser.quit()
4.等待方式
等待方式主要有三种,分别是:强制等待、隐形等待、显示等待。
强制等待:需要引入“time”模块,这种叫强制等待,不管你浏览器是 否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作 为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种 等待方式,太死板,严重影响程序执行速度。
实例代码:
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get(‘http://baidu.com’)
time.sleep(3) # 强制等待3秒再执行下一步
print(driver.current_url)
driver.quit()
隐性等待:通过添加 implicitly_wait() 方法就可以方便的实现智能等 待;implicitly_wait(30) 的用法应该比 time.sleep() 更智能,后者只能选 择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
实例代码:
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # 隐性等待,最长等30秒
driver.get(‘http://baidu.com’)
print(driver.current_url)
driver.quit()
显性等待:配合该类的until()和until_not()方法,就能够根据判断条件 而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如 果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时 间,然后抛出TimeoutException。
5.键盘事件
要想调用键盘按键操作需要引入 keys 包:
from selenium.webdriver.common.keys import Keys通过 send_keys()调用 按键:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
实例代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os,time
driver = webdriver.Firefox()
driver.get(“http://passport.kuaibo.com/login/?referrer=http%3A%2F%2 Fwebcloud .kuaibo.com%2F”)
time.sleep(3)
driver.maximize_window() # 浏览器全屏显示
driver.find_element_by_id(“user_name”).clear()
driver.find_element_by_id(“user_name”).send_keys(“fnngj”)
driver.find_element_by_id(“user_name”).send_keys(Keys.TAB)
time.sleep(3)
driver.find_element_by_id(“user_pwd”).send_keys(“123456”)
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element_by_id(“user_pwd”).send_keys(Keys.ENTER)
#也可定位登陆按钮,通过 enter(回车)代替 click()
driver.find_element_by_id(“login”).send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()
6.鼠标事件
鼠标事件一般包括鼠标右键、双击、拖动、移动鼠标到某个元素上等等。
需要引入ActionChains类。
引入方法:from selenium.webdriver.common.action_chains import Actio nChains
ActionChains 常用方法:
perform() 执行所有ActionChains 中存储的行为;
context_click() 右击;
double_click() 双击;
drag_and_drop() 拖动;
move_to_element() 鼠标悬停。
鼠标双击示例:
#定位到要双击的元素
qqq =driver.find_element_by_xpath(“xxx”)
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(qqq).perform()

鼠标拖放示例:
#定位元素的原位置
element = driver.find_element_by_name(“source”)
#定位元素要移动到的目标位置
target = driver.find_element_by_name(“target”)
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()

PyQt5模块的使用描述:
1.安装
pip install pyqt5
2.实例代码:简单的窗口
import sys
from PyQt5.QtWidgets import QApplication, QWidget
def show_w():
# 所有的PyQt5应用必须创建一个应用(Application)对象

sys.argv参数是一个来自命令行的参数列表。

 app = QApplication(sys.argv)

Qwidget组件是PyQt5中所有用户界面类的基础类。我们给 QWidget提供了默认的构造方法

 w = QWidget()# resize()方法调整了widget组件的大小w.resize(500, 500)

w.move(500, 100) # move()方法移动widget组件到一个位置,这个位 置是屏幕上x=500,y=200的坐标。
w.setWindowTitle(‘Simple’) # 设置了窗口的标题。这个标题显示在标 题栏中
w.show() # show()方法在屏幕上显示出widget。一个widget对象在这 里第一次被在内存中创建,并且之后在屏幕上显示。
sys.exit(app.exec_()) # 应用进入主循环。在这个地方,事件处理开始 执行。主循环用于接收来自窗口触发的事件,
# 并且转发他们到widget应用上处理。如果我们调用exit()方法或主 widget组件被销毁,主循环将退出。
# sys.exit()方法确保一个不留垃圾的退出。系统环境将会被通知应用 是怎样被结束的。
if name == ‘main’:
show_w()

代码实现
3.1 音乐下载器功能代码实现
3.1.1定义类musicdl,并进行初始化


3.1.2用户输入想要下载的歌曲名称,程序获取用户所输入的信息

处理用户输入的信息

3.1.3根据该“关键字”向QQ音乐、网易音乐等网站发起数据请求
获取用户输入的关键字,并调用search方法

在search方法中,根据该关键字向QQ音乐网站、网易音乐等网站发起数据 请求

例如:根据该关键字向酷狗网站发起数据请求,
1、创建酷狗音乐下载类kugou,并进行初始化

2、创建search方法,根据获取到的关键字,向酷狗音乐网站发起数据请求

3、调用kugou.search方法,并将用户输入关键字的数值传递给该方法

3.1.4根据返回的数据信息,进行分析后,以表格的形式呈现给用户

3.1.5用户输入表格所显示的id号,便可下载该歌曲

根据用户输入的id号,执行下载

若输入的id号是酷狗网站的,则调用酷狗的download方法;同理其他网站 也一样。这里以酷狗音乐网站为例子

3.2 图片批量下载功能代码实现
3.2.1创建类DialogAbout(用于显示图片下载窗口),并进行初始化

3.2.2创建类MainWindow(用于显示图片批量下载的内容窗口),并进行初始化

3.2.3定义progress_log方法,用于执行过程的日志信息显示

3.2.4定义reset_ui方法,用于重新初始化图片下载窗口

3.2.5定义update_elapsed_time方法,用于显示下载过程中的时间

3.2.6定义start_download方法,用于实现图片的批量下载

3.2.7定义cancel_download方法,用于取消图片的下载

3.2.8最后,创建image_downloader_gui.py文件,在文件中并定义main方法,用于调用执行,已经创建好的类和方法

3.2.9数据爬取过程;这里以“百度”网站为例子
在图片批量下载的页面中,用户输入想要下载图片的关键字,选择从“百度”网站搜索

当用户点击“Start”后,便调用MainWindow类中的start_download()方法,
在该方法中,程序获取用户所输入的关键字、选择的是哪个网站以及所需 下载图片的数量等信息;

根据所选择的网站,执行crawler.py文件中相应的方法(这里选择的是“百度”网站,由此调用的是baidu_get_image_url_using _api)

实验结果
4.1 音乐下载器
输入想要下载的歌曲名称;例如这里输入歌曲名称:方圆几里

搜索结果,以表格的形式输出显示

在输出显示的信息中,输入编号id,即可下载该音乐;例如这里输入:0

成功下载

4.2图片批量下载器
图片批量下载器页面

输入要下载图片的关键字,并选择该关键字要在哪个网站下载,再设置要下载图片的数量以及线程的个数,最后,再点击Start开始进行图片下载;例如:这里关键字为“周杰伦”,从“百度”网站进行搜索,设置下载的图片数量为10张,开启的线程个数也为10个。

下载成功

实现代码链接:https://github.com/junkai-L/MusicAndPictureSpider

Python网络爬虫实现音乐下载器和图片下载器功能相关推荐

  1. 用python网络爬虫爬取英雄联盟英雄图片

    用python爬虫爬取lol皮肤. 这也用python网络爬虫爬取lol英雄皮肤,忘了是看哪个大神的博客(由于当时学了下就一直放在这儿,现在又才拿出来,再加上马上要考二级挺忙的.),代码基本上是没改, ...

  2. lofter 爬虫_Python网络爬虫1 - 爬取网易LOFTER图片

    LOFTER是网易出品的优质轻博客,灵感源于国外的tumblr,但比之更加文艺,更加本地化.本人非常喜欢LOFTER的UI设计,以及其中的优质用户和内容,似乎网易并不擅长推广,所以受众并不广泛.这都是 ...

  3. 一篇文章教会你使用Python网络爬虫下载酷狗音乐

    [一.项目背景] 现在的听歌软件动不动就是各种付费,要下载软件才能听,当你下载了之后,你会惊奇的发现这首歌还收费,这就让一向喜欢白嫖的小编感到很伤心了.于是,小编冥思苦想,终于让我发现了其中的奥秘,一 ...

  4. python网络爬虫网易云音乐下载_python网络爬虫爬取网易云音乐

    #爬取网易云音乐 url="https://music.163.com/discover/toplist" #歌单连接地址 url2 = 'http://music.163.com ...

  5. Python网络爬虫与信息提取(11)—— 爬虫批量搜索音乐并下载

    前言 上一篇博客使用requests库加selenium库加Xpath解析html的技术路线下载了单首歌曲,但是存在一个问题:webdriver打开网页十分慢.这一节解决这个问题并修改代码批量下载. ...

  6. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  7. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  8. 【Python网络爬虫实战篇】使用selenium+requests爬取下载高清源视频:关于爬取m3u8文件链接解析为ts视频合并成mp4视频的分析实战

    这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致.再加上之前博主有着七.八年的视频制作经验,深知视频素材获取的不易.因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获 ...

  9. Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单

    Python网络爬虫实践(1) 一.需求分析 爬取网易云音乐播放量大于1000万的歌单. 二.实施步骤 1.安装selenium selenium是一个用于Web应用自动化程序测试的工具,测试直接运行 ...

  10. 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接

    [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...

最新文章

  1. 信号内插matlab,声音信号的抽取和内插,MATLAB代码
  2. Java机器学习库ML之二Feature Selection(特征选择)
  3. tensorflow中学习率、过拟合、滑动平均的学习
  4. 计算机与现代化投稿流程,计算机与现代化投稿须知
  5. 老司机做VR视频,需要什么样的全景相机?
  6. 手机单选按钮 html5,@html剃刀单选按钮mvc5(@html razor radio buttons mvc5)
  7. Herev Falciani推出新的加密货币和区块链项目
  8. linux的swap相关
  9. python list的+=操作
  10. String的replaceAll方法中的正则表达式用法
  11. MLOps- 吴恩达Andrew Ng Overview of the ML Lifecycle and Deployment Week1 部署深度学习模型model 实现作业
  12. 单片机原理及应用姜志海pdf_单片机原理及应用.pdf
  13. 一个app项目如何从想法一步一步落地?有哪些必要的流程?
  14. android远程控制电视,手机怎么远程控制电视
  15. 基于Android的减肥塑身平台
  16. 如何禁止搜索引擎收录WordPress站点某个分类的文章?
  17. Syntactic sugar Syntactic salt
  18. STM32 JTAG SWD (PB3 PB4用作普通IO)及启动模式
  19. 科大讯飞语音离线命令识别
  20. 用python来编写TSP问题

热门文章

  1. 在Microsoft Windows XP中使用NetMeeting
  2. ACTIVEX控件debug版本在Win7下注册失败的处理方法
  3. hadoop2.6.0 - eclipse插件下载、编译、安装、配置
  4. 96微信编辑器服务器老是连不上,96微信编辑器出现文章排版混乱的详细原因介绍...
  5. SLF4J user manual
  6. 同步捕获matlab,基于多匹配滤波器的跳码直扩同步捕获方法与流程
  7. (转载)软件测试全套教程,软件测试自学线路图
  8. 【软件测试】软件测试的环境部署和安装教程[全]
  9. 如何设计一种简单的恒流/恒压降压转换器
  10. ad域管理与维护_windows server2012创建AD域服务器