SFACG Spider

发布于 2020-08-12  199 次阅读


import requests,json,lxml,time,os
from bs4 import BeautifulSoup

Web_Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 Edg/84.0.522.40'}

# TODO : 分安卓与苹果来输入Cookies

class API():
    def __init__(self):
        self.book = ''
        self.Volume = []
        self.Novel_Name = ''
        self.Division_Volume = {}
        self.Cookie = ''
        self.SFSecurity = ''
        self.headers = {'Host': 'api.sfacg.com',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Accept': 'application/vnd.sfacg.api+json;version=1',
'User-Agent': 'boluobao/4.5.52(iOS;14.0)/appStore',
'Accept-Language': 'zh-Hans-US;q=1',
'Authorization': 'Basic YXBpdXNlcjozcyMxLXl0NmUqQWN2QHFlcg=='}

    def get_cookie_security(self):
        if not os.path.exists('./config'):
            os.mkdir('./config')
            self.Cookie = input("请输入SFACG的字符串cookie[注:非字典类cookie]:")
            self.SFSecurity = input("请输入SFSecurity:")
            with open('./config/cookie.conf','w+') as fb:
                fb.write(self.Cookie)
            with open('./config/SFSecurity.conf','w+') as fb:
                fb.write(self.SFSecurity)

            self.headers['Cookie'] = self.Cookie
            self.headers['SFSecurity'] = self.SFSecurity
        else:

            if input('是否刷新cookie 与 security:[y/n(default)]') == 'y':
                self.Cookie = input("请输入SFACG的字符串cookie[注:非字典类cookie]:")
                self.SFSecurity = input("请输入SFSecurity:")
                with open('./config/cookie.conf','w+') as fb:
                    fb.write(self.Cookie)
                with open('./config/SFSecurity.conf','w+') as fb:
                    fb.write(self.SFSecurity)
                self.headers['Cookie'] = self.Cookie
                self.headers['SFSecurity'] = self.SFSecurity            
                return

            with open('./config/cookie.conf') as fb:
                self.Cookie = fb.read()
            with open('./config/SFSecurity.conf','w+') as fb:
                self.SFSecurity = fb.read()
            self.headers['Cookie'] = self.Cookie
            self.headers['SFSecurity'] = self.SFSecurity


    def sign(self):
        result = requests.put("https://api.sfacg.com/user/signInfo", headers=self.headers)
        print(result.json()["status"]["msg"])

    def write_point(self,last_list):
        # last_list 是指的当前小说的剩余章节     
        if not os.path.exists('./config'):
            os.mkdir('./config')
        with open('./config/' + 'sa' + '.conf', 'w+') as fb:
            fb.write(str(last_list))
    def check_point(self):
        # TODO : 检查最后一个下载点,并从最后一个下载点开始下载
        with open('./config/' + self.Novel_Name + '.conf', 'r') as fb:
            self.last_list = fb.read()         
        pass
    def sort(self):
        # TODO : 对不同类别的小说进行下载  
        pass

    def get_chapter(self,bookid = ''):
        self.book = bookid
        self.Volume = []
        self.Division_Volume = {}
        if self.book == '':
            self.book = input("请输入小说的ID")
        book_url = "http://book.sfacg.com/Novel/"+ self.book +"/MainIndex/"
        r = requests.get(book_url,headers = Web_Headers)
        Soup = BeautifulSoup(r.text,'lxml')
        self.Novel_Name = Soup.find('h1',{'class':'story-title'}).text
        print('当前小说为:',self.Novel_Name)
        for volume in Soup.find_all('h3', {'class': 'catalog-title'}):
            self.Volume.append(volume.text)
        i = 0
        # v 代表一卷,BS4库无法直接搜索,因此要用两层循环
        for v in Soup.find('div').find_all('div',{'class': "story-catalog"}):
            Chapter = []
            for chap in v.find_all('li'):
                chapter_id = chap.find('a').get('href').split('/')[-2]
                title = chap.find('a').get('title')
                Chapter.append([chapter_id,title])
            self.Division_Volume[self.Volume[i]] = Chapter
            i += 1

    def download(self):
        if not os.path.exists('./novel'):
            os.mkdir('./novel')
        with open("./novel/"+ self.Novel_Name + ".txt", 'a', encoding='utf-8') as fb:
            for i in self.Volume:
                print("正在下载{}卷".format(i.split('】')[-1]))
                for j in self.Division_Volume[i]:
                    # self.__last_list.append()
                    url = 'https://api.sfacg.com/Chaps/' + j[0] +'?chapsId='+ j[0] +'&expand=content%2Cchatlines%2Ctsukkomi%2CneedFireMoney%2CoriginNeedFireMoney'
                    result = requests.get(url, headers = self.headers)
                    if result.json()['status']['httpCode'] == 403:
                        print("\t\t",j[-1],"需要付费VIP")
                        break
                    else:
                        text = '\n' + j[-1] +'\n' + result.json()["data"]["expand"]["content"]
                        fb.write(text)
                        print("\t\t",j[-1],':已完成下载')
                        time.sleep(0.5)
                else:
                    continue
                print("下载《", self.Novel_Name, "》完成")
                break

            else:
                print("全本小说已经下载完成")

    def download_sort(self,num):
    # 返回 分类小说 的目录
        sort_list = []
        for i in range(num):
            result = requests.get("https://api.sfacg.com/novels/0/sysTags/novels?expand=tags%2CtypeName%2Cdiscount%2CdiscountExpireDate&fields=novelId%2CnovelName%2CnovelCover%2CtypeId%2CauthorName%2CsignStatus%2Cpoint%2CcategoryId%2CcharCount&isfinish=both&isfree=both&page=" + str(i+1) +"&size=10&sort=viewtimes&systagids=74&typeId=0",headers = self.headers)
            for data in result.json()['data']:
                if int(data['charCount']) >= 100000:
                    sort_list.append(str(data['novelId']))
                    print('书名《{novelName}》\n  小说字数{charCount}'.format_map(data))
            print("总计下载{}本书".format(len(sort_list)))
        for i in sort_list:
            self.get_chapter(i)
            self.download()

笔记:

open对象创建的文件,不能用write方法写入非string的数据

可以用 if not 语句来判断东西的exited

def download_sort(num):
    # 返回 分类小说 的目录
    sort_list = []
    for i in range(num):
        result = requests.get("https://api.sfacg.com/novels/0/sysTags/novels?expand=tags%2CtypeName%2Cdiscount%2CdiscountExpireDate&fields=novelId%2CnovelName%2CnovelCover%2CtypeId%2CauthorName%2CsignStatus%2Cpoint%2CcategoryId%2CcharCount&isfinish=both&isfree=both&page=" + str(i+1) +"&size=10&sort=viewtimes&systagids=74&typeId=0",headers = Iphone_Headers)
        for data in result.json()['data']:
            if int(data['charCount']) >= 100000:
                sort_list.append(str(data['novelId']))
                print('书名《{novelName}》\n  小说字数{charCount}'.format_map(data))
    print("总计下载{}本书".format(len(sort_list)))
    Book_downloader = API()
    for i in sort_list:
        Book_downloader.get_chapter(i)
        Book_downloader.download()
downloader = API()
downloader.get_cookie_security()
downloader.download_sort(3)
# for i in sort_list:
#     Book_downloader.get_chapter(i)
#     Book_downloader.download()
# BOOK = API("344997")
# BOOK.get_chapter()
# BOOK.download()
# url = 'https://api.sfacg.com/Chaps/4300212?chapsId=4300212&expand=content%2Cchatlines%2Ctsukkomi%2CneedFireMoney%2CoriginNeedFireMoney'
# 签到
# result = requests.put("https://api.sfacg.com/user/signInfo", headers=Iphone_Headers)
# print(result.text)
是否刷新cookie 与 security:[y/n(default)]n
书名《穿上cos服的我变成了九尾天狐》
  小说字数105105
书名《重生为美少女的我不想被支配》
  小说字数318744
书名《穿越成龙族公主的我不愿再次悲伤》
  小说字数1795491
书名《变成狐娘的我被真龙圣女捕获了》
  小说字数1352916
书名《血族少女爱上我》
  小说字数1252466
书名《身为麻雀的我受尽师门宠爱》
  小说字数173522
书名《今天的宰相也是女皇陛下的宠妃呢》
  小说字数157524
书名《放开女主让我来》
  小说字数1983148
书名《斗罗大陆之律者世界》
  小说字数651935
书名《一毛钱掉地上到底要不要捡》
  小说字数296802
总计下载10本书
书名《阴暗牧师与她所追寻之光》
  小说字数796340
书名《斗罗大陆之重回万年》
  小说字数827289
书名《千反田的超高难度重生攻略》
  小说字数1761761
书名《我身边的人都好奇怪》
  小说字数566040
书名《我变成了游戏宠物?狐娘?!》
  小说字数2695966
书名《贵族精灵小姐要时刻优雅》
  小说字数153956
书名《变成猫娘的我不想失去自由》
  小说字数276775
书名《转生狐妖之后必须要倾城天下吗》
  小说字数1551123
总计下载18本书
书名《重生为美少女也要成为世界第一》
  小说字数294752
书名《妖刀姬》
  小说字数6250289
书名《变身少女后也能被女魔尊看上吗》
  小说字数488323
书名《变身倾城美女》
  小说字数1127783
书名《吸血姬大人今天也没能得到满足》
  小说字数1111860
书名《无敌的我来到了二次元》
  小说字数307609
总计下载24本书
当前小说为: 穿上cos服的我变成了九尾天狐
正在下载 第一卷卷
         第一章  带把的美少女主播 :已完成下载
         第二章   灵仙?狐娘? :已完成下载
         第三章   身份暴露?! :已完成下载
         第四章   和我去约会! :已完成下载
         第五章    身体的变化! :已完成下载
         第六章  年轻真好! :已完成下载
         第七章   危! :已完成下载
         第八章   狐仙?! :已完成下载
         第九章  九尾狐仙? :已完成下载
         第十章   万界花店 :已完成下载
         第十一章   亵渎之花 :已完成下载
         第十二章   华夏制造 :已完成下载
         第十三章  神州平板,寸劲开天 :已完成下载
         第十四章  魔狼雕像 :已完成下载
         第十五章   表姐 :已完成下载
         第十六章   魔药 :已完成下载
         第十七章  序列九  药师 :已完成下载
         第十八章   诡异浓雾 :已完成下载
         第十九章   阁下是来买花的吗? :已完成下载
         第二十章   魔法 :已完成下载
         第二十一章   无限之花 :已完成下载
         第二十二章   神的考验 :已完成下载
         第二十三篇  中二少女,在线发病 :已完成下载
         第二十四章  隐世仙神?! :已完成下载
         第二十五章    都市传说 :已完成下载
         第二十六章   中二模式开启 :已完成下载
         第二十七章  我等你很久了 :已完成下载
         第二十八章    煞无极 :已完成下载
         第二十九章   魔法师 :已完成下载
         第三十章   可怜的博美犬 :已完成下载

你知道雪为什么是白色的吗?因为她忘记了原来的颜色