python 根据书名、作者爬取《豆瓣读书》和《小程序-小花生书友会》的封面图,并把图片保存到本地

 Excel文件的内容:

python 根据书名、作者爬取《豆瓣读书》和《小程序-小花生书友会》的封面图,并把图片保存到本地_第1张图片

 以下源码会先读取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()

 

 

你可能感兴趣的:(python)