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

引言
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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一行代码两块钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值