Excel文件的内容:
以下源码会先读取excel文件的内容,
然后根据“书名”和“作者”来匹配对应的封面图,
再把图片url写入到“封面图文件名”这列,
最后再把图片保存到本地
import requests
import json
import xlrd # Excel表格
from xlutils.copy import copy
import os
import urllib.request
file = 'D:/Chrome默认下载存放位置/分级书单.xlsx' # 读取的文件路径
new_file = 'D:/Chrome默认下载存放位置/分级书单.xls' # 保存的文件路径
# 根据url地址 把图片保存到本地
def save_img_local():
print('图片下载中...')
wb = xlrd.open_workbook(filename=new_file) # 打开文件
sheet = wb.sheet_by_name('书目') # 通过名字获取表格
cols = sheet.col_values(6) # 获取 封面图文件名 列内容
# 打开想要更改的excel文件
old_excel = xlrd.open_workbook(new_file)
new_excel = copy(old_excel)
ws = new_excel.get_sheet(1)
for i in range(len(cols)):
if cols[i] != '' and i != 0:
file_path = 'D:/Chrome默认下载存放位置/image/'
try:
if not os.path.exists(file_path):
os.makedirs(file_path) # 如果没有这个path则直接创建
file_suffix = os.path.splitext(cols[i])[1] # 获取当前图片url地址的后缀名 -- .jpg
filename = '{}{}'.format(file_path, str(i+1) + file_suffix) # 拼接文件名
urllib.request.urlretrieve(cols[i], filename=filename) # 利用urllib.request.urltrieve方法下载图片
ws.write(i, 6, str(i+1) + file_suffix)
new_excel.save(new_file)
except IOError as e:
print('没有找到文件:', e)
except Exception as e:
print('异常错误', e)
print('下载完成')
# 根据书名、作者 爬取 微信小程序小花生阅读书单 图书封面
def read_excel2():
print('爬取小花生图片中...')
wb = xlrd.open_workbook(filename=new_file) # 打开文件
sheet = wb.sheet_by_name('书目') # 通过名字获取表格
cols1 = sheet.col_values(2) # 获取 书名 列内容
cols2 = sheet.col_values(3) # 获取 作者 列内容
cols3 = sheet.col_values(6) # 获取 封面图文件名 列内容
# 打开想要更改的excel文件
old_excel = xlrd.open_workbook(new_file)
new_excel = copy(old_excel)
ws = new_excel.get_sheet(1)
for i in range(len(cols1)):
if cols1[i] != "" and i != 0:
if cols3[i] == '': # 之前没有找到匹配的图片 再重新匹配一遍把空位填上
name = cols1[i].strip()
author = cols2[i].strip()
url = 'http://www.xiaohuasheng.cn/WeChatMiniProgram.svc/searchBook' # 小花生的搜索地址
headers = {
"content-type": "application/json",
"Authorization": "NSTp9~)NwSfrXp@\\"
}
if name.find('"') != -1:
name = name.replace('"', "'")
elif name.find(':') != -1:
name = name.replace(':', ": ")
data = {
"C": 0,
"J": '{"userId":1230418,"searchMyBook":0,"search":"' + name + '","offset":0,"limit":20}'
}
# 一定要把data进行json编码,再发送, 不然服务端无法解码
r = requests.post(url, data=json.dumps(data), headers=headers)
j = r.json()
arr = json.loads(j['J'])
img_src = 'https://img.xiaohuasheng.cn/' # 小花生的图片域名
for item in arr:
if item['name'].find(name) != -1 or item['name'] == name: # 匹配书名
if item['author'] == author or item['author'].find(author) != -1: # 匹配作者
ws.write(i, 6, img_src + item['frontCover']) # 写入文件
break
new_excel.save(new_file) # 另存为excel文件,并将文件命名 -- 文件后缀名为.xlsx会打不开
save_img_local()
print('完成')
# 根据书名、作者 爬取 豆瓣 图书封面
def read_excel():
print('爬取豆瓣图片中...')
wb = xlrd.open_workbook(filename=file) # 打开文件
sheet1 = wb.sheet_by_name('书目') # 通过名字获取表格
# print(sheet1.name, sheet1.nrows, sheet1.ncols) # name 表格名 nrows 所有行数 ncols 所有列数
# rows = sheet1.row_values(2) # 获取行内容
cols1 = sheet1.col_values(2) # 获取 书名 列内容
cols2 = sheet1.col_values(3) # 获取 作者 列内容
# 打开想要更改的excel文件
old_excel = xlrd.open_workbook(file)
new_excel = copy(old_excel) # 将操作文件对象拷贝,变成可写的workbook对象
ws = new_excel.get_sheet(1) # 获得第一个sheet的对象 名字为‘书目’的表格
for i in range(len(cols1)):
if cols1[i] != "" and i != 0:
title = cols1[i].strip() # strip()函数 去除字符串前后多余空格
author = cols2[i].strip()
url = 'https://book.douban.com/j/subject_suggest?q=' + title
str_html = requests.get(url)
# 豆瓣异常处理
try:
js = json.loads(str_html.text) # 转为json格式
except:
print('检测到有异常请求从你的 IP 发出,请 登录 使用豆瓣')
return
else:
for items in range(len(js)):
if 'author_name' in js[items]: # 必须有这个字段
if js[items]['title'] == title or js[items]['title'].find(title) != -1: # 匹配书名
if js[items].get("author_name") == author or js[items].get("author_name").find(author) != -1: # 匹配作者
ws.write(i, 6, js[items]['pic']) # 写入文件
break
new_excel.save(new_file) # 另存为excel文件,并将文件命名 -- 文件后缀名为.xlsx会打不开
read_excel2()
print('完成')
read_excel()