爬取抖音的热门 音乐
详细代码在下面
响应体内容工作流
默认情况下,当你进行网络请求后,响应体会立即被下载。你可以通过 stream
参数覆盖这个行为,推迟下载响应体直到访问 Response.content
属性:
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
此时仅有响应头被下载下来了,连接保持打开状态,因此允许我们根据条件获取内容:
if int(r.headers['content-length']) < TOO_LONG:
content = r.content
...
你可以进一步使用 Response.iter_content 和 Response.iter_lines 方法来控制工作流,或者以 Response.raw 从底层 urllib3 的 urllib3.HTTPResponse <urllib3.response.HTTPResponse
读取。
如果你在请求中把 stream
设为 True
,Requests 无法将连接释放回连接池,除非你 消耗了所有的数据,或者调用了 Response.close。 这样会带来连接效率低下的问题。如果你发现你在使用stream=True
的同时还在部分读取请求的 body(或者完全没有读取 body),那么你就应该考虑使用 contextlib.closing
(文档), 如下所示:
from contextlib import closing
with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
# 在此处理响应。
好消息——归功于 urllib3,同一会话内的持久连接是完全自动处理的!同一会话内你发出的任何请求都会自动复用恰当的连接!
注意:只有所有的响应体数据被读取完毕连接才会被释放为连接池;所以确保将 stream
设置为False
或读取 Response
对象的 content
属性。
Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可:
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
警告
我们强烈建议你用二进制模式(binary mode)打开文件。这是因为 requests 可能会为你提供 header 中的 Content-Length
,在这种情况下该值会被设为文件的字节数。如果你用文本模式打开文件,就可能碰到错误。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/9 9:07
# @Author : jia.zhao
# @Desc :
# @File : douyintest.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import time
"""
下载文件参数url和文件的全路径
"""
def download_file(src, file_path):
# 响应体工作流
r = requests.get(src, stream=True)
# 打开文件
f = open(file_path, "wb")
# for chunk in r.iter_content(chunk_size=512):
# if chunk:
# f.write(chunk)
for data in tqdm(r.iter_content(chunk_size=512)):
#tqdm进度条的使用,for data in tqdm(iterable)
f.write(data)
return file_path
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
# 保存路径
save_path = "G:\\Music\\douyin\\"
url = "https://kuaiyinshi.com/hot/music/?source=dou-yin&page=1"
# 获取响应
res = requests.get(url, headers=headers)
# 使用beautifulsoup解析
soup = BeautifulSoup(res.text, 'lxml')
# 选择标签获取最大页数
max_page = soup.select('li.page-item > a')[-2].text
# 循环请求
for page in range(int(max_page)):
page_url = "https://kuaiyinshi.com/hot/music/?source=dou-yin&page={}".format(page + 1)
page_res = requests.get(page_url, headers=headers)
soup = BeautifulSoup(page_res.text, 'lxml')
lis = soup.select('li.rankbox-item')
singers = soup.select('div.meta')
music_names = soup.select('h2.tit > a')
for i in range(len(lis)):
music_url = "http:" + lis[i].get('data-audio')
print("歌名:" + music_names[i].text, singers[i].text, "链接:" + music_url)
try:
download_file(music_url,
save_path + music_names[i].text + ' - ' + singers[i].text.replace('/', ' ') + ".mp3")
except:
pass
print("第{}页完成~~~".format(page + 1))
time.sleep(1)