13-爬取图片、打包发送
例子:从image.so通过接口获取图片并下载
本次的例子用这个接口拿图片:https://image.so.com/zjl?sn=30&ch=beauty
import os
import requests
def download_pic(path, url):
"""
下载图片
:param path: 保存路径
:param url: 图片的url
:return: 无返回值
"""
filename = url[url.rfind("/") + 1:]
resp = requests.get(url)
print(resp.status_code)
with open(f"{path}{filename}", "wb") as file:
file.write(resp.content)
def main():
# 判断文件夹是否存在,如果不存在,创建
if not os.path.exists("resources/images"):
os.mkdir("resources/images")
# 从接口请求拿到json数据
resp = requests.get("https://image.so.com/zjl?sn=30&ch=beauty")
beauty_list = resp.json()["list"]
# 下载图片
for beauty_dict in beauty_list:
picture_url = beauty_dict["qhimg_url"]
download_pic("resources/images/", picture_url)
if __name__ == '__main__':
main()
文件打包
用到shutil这个库,这个库可以用来做一些复杂的文件操作
import shutil
# 获取命令路径
print(shutil.which("python"))
# 移动文件
shutil.move("resources/sports_scores.csv", "sports.csv")
给上面的图片打包:
shutil.make_archive("resources/mm", "zip", "resources/images")
# 压缩的路径和文件名, 压缩文件格式, 压缩对象路径
封装一个send_email()的方法,放在mytools.py里
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
import os
HOST = "smtp.qq.com"
PORT = 465
PASS = "xxx"
USER = "hanayo@kayotin.cn"
def send_email(sender, receivers, to_cc, subject="邮件主题", content="", filenames=[]):
"""
发送邮件
:param sender: 发件人
:param receivers: 收件人列表
:param to_cc: 抄送列表
:param subject: 主题
:param content: 正文
:param filenames: 包含路径的文件列表
:return: 无返回值
"""
email = MIMEMultipart()
email["From"] = sender
email["To"] = ";".join(receivers)
email["Cc"] = ";".join(to_cc)
email["Subject"] = subject
message = MIMEText(content, "html", "utf-8")
email.attach(message)
for filename in filenames:
with open(filename, "rb") as file:
attachment = MIMEText(file.read(), "base64", "utf-8")
attachment["content-type"] = "application/octet-stream"
file_name = os.path.split(filename)[1]
file_name = quote(file_name)
attachment["content-disposition"] = f"attachment;filename={file_name}"
email.attach(attachment)
smtp = smtplib.SMTP_SSL(HOST, PORT)
smtp.login(USER, PASS)
smtp.sendmail(sender, receivers, email.as_string())
获取文件路径
由于附件给的列表是一个带路径的列表,所以要处理一下。用os.path.split方法可以很方便的处理。
url = "resources/temp_res.csv"
path, filename = os.path.split(url)
print(path) # 文件路径
print(filename) # 文件名,带扩展名
最后的代码如下:
import os
import shutil
import requests
from my_tools import send_email
import time
import datetime
def download_pic(path, url):
"""
下载图片
:param path: 保存路径
:param url: 图片的url
:return: 无返回值
"""
filename = url[url.rfind("/") + 1:]
resp = requests.get(url)
# print(resp.status_code)
with open(f"{path}{filename}", "wb") as file:
file.write(resp.content)
def main():
# 判断文件夹是否存在,如果不存在,创建
if not os.path.exists("resources/images"):
os.mkdir("resources/images")
# 从接口请求拿到json数据
resp = requests.get("https://image.so.com/zjl?sn=30&ch=beauty")
beauty_list = resp.json()["list"]
# 下载图片
for beauty_dict in beauty_list:
picture_url = beauty_dict["qhimg_url"]
download_pic("resources/images/", picture_url)
shutil.make_archive("resources/mm", "zip", "resources/images")
send_email("hanayo@kayotin.cn", ["ahjiang@capvision.com"],
["18237763193@163.com"], "发送图片", body, ["resources/mm.zip"])
body = f"""
测试发送图片【正文】
<H1>今天是 {datetime.datetime.today().strftime("%Y年%m月%d日")}</H1>
<H2>现在的时间是 {time.strftime('%H:%M:%S', time.localtime())}</H2>
<p style="color: green;">发送图片完毕~~~~</p>
"""
if __name__ == '__main__':
main()