前言度娘啊,你以为你把百度网盘取消限速了,我们就满意了?当然不满意,还有某度文库呢!本来好好的文档,非得不让我们下载……今天,就教大家跟我一起写某度文库下载器Weeker,拒绝某库,从我做起。
我们的下载器是一个GUI程序,具体架构是,先写核心文件(get.py),再写命令行解析文件(weeker.py),接着使用Fire生成命令行,最后用Gooey把CLI转换为GUI。 准备安装
目录初始化项目(下面的脚本是在Unix或Linux上运行的): 复制代码 隐藏代码cd /path/to/projectmkdir Weekertouch get.py weeker.py 爬虫核心第一步,打开get.py,先引入类库:
每个模块的作用如下:
由于保存文件时我们需要判断路径,定义一个pwd常量,用来存储“当前路径: 复制代码 隐藏代码pwd = getcwd() 再声明一个get
编写get:::::函数获取html&解析把光标移到get:::::函数。首先照例我们要用requests,并且祭上bs4一条龙解析:
添加标题我们给文档先添上标题,也就是网页的标题。 复制代码 隐藏代码everyline.append(soup.title.string) 但是这样会有一个问题,添加出来的标题都是“xxxxxxx_百度文库”,很不雅观。所以抬上re.sub作替换,改成:
获取正文通过观察网页,我们发现,bd doc-reader这个class有重大嫌疑,这个class里的东西都是正文内容: 我们通过bs4解析它,发现内容中有很多\n、\x0c和空格,\n是换行符,我们把它分割到数组中,而后两者分别删除即可: 复制代码 隐藏代码for doc in soup.find_all('div', attrs={'class': 'bd doc-reader'}): everyline.extend(doc.get_text().split('\n')) # 扩展数组 everyline = [i.replace(' ', '') for i in everyline] everyline = [i.replace('\x0c', '') for i in everyline] 保存文件接下来就是保存文件。我的思路是,先按照txt格式保存,然后再判断convert参数,如果填写了docx,再将txt加后缀并修改为docx。
创建GUI打开weeker.py。 复制代码 隐藏代码from gooey import Gooey, GooeyParserimport get 接着添加if __name__ == '__main__':
我们来定义一下这个main(): 复制代码 隐藏代码@Gooey(encoding='utf-8', program_name='Weeker ', language='chinese')def main(): parser = GooeyParser(description='百度文库下载器,干杯!') parser.add_argument('url', metavar='文档地址', widget='TextField') parser.add_argument('ua', metavar='用户UA', widget='Dropdown', choices={'Googlebot': 1, 'Baiduspider': 2}) parser.add_argument('path', metavar='保存路径', widget='DirChooser') parser.add_argument('output', metavar='重命名', widget='TextField') parser.add_argument('convert', metavar='格式转换', widget='Dropdown', choices={'docx': 1}) args = parser.parse_args() get.get(args.url, ua=args.ua, path=args.path, output=args.output, convert=args.convert) @Gooey是一个修饰器,可以把main()转换为一个Gooey函数。在main中,我们写下类似argparse的parser.add_argument函数,最终定义args = parser.parse_args(),从args的成员获取每个参数的输入,传到get.py里。我们运行一下,神奇的一幕发生了: 我们成功地把CLI转换成了GUI!!!
|
|