|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Daniel_Zhang 于 2021-3-19 22:20 编辑
下午心血来潮做了一个爬取百度文库的爬虫
此处鸣谢站内大佬 v.ki 的百度文库免费复制3.0 震撼来袭!!!
仅借鉴获取 json 文件地址的部分,并未针对整个程序进行测试
没有上面这篇文章的帮助,想要写出来这只爬虫真的不太容易
说实话,百度的反爬太强大了
注:本帖仅用于学习交流使用,如有违规使用,后果自负,本人概不负责
- # -*- coding: utf-8 -*-
- import json
- import requests
- import ssl
- import re
- import easygui as g
- import os
- import tkinter
- from tkinter import filedialog
- headers = {
- 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
- 'Accept': 'text/html'
- }
- def hellocallback():
- """获取用户输入的 url"""
- global url
- url = E1.get()
- get_api(url)
- def open_folder():
- """选择文件存储的目标文件夹"""
- root = tkinter.Tk()
- root.withdraw()
- file_path = filedialog.askdirectory(initialdir=os.getcwd())
- return file_path
- def open_url(url):
- """打开 url 获取内容"""
- # encoding: utf-8
- ssl._create_default_https_context = ssl._create_unverified_context
- html = requests.get(url, headers=headers).text # 获取url内容
- return html
- def save_article(final_result):
- """存储文章至 txt 文件"""
- folder_dir = open_folder()
- #folder_dir = ''
- file_store_path = ''
- while True:
- filename = g.enterbox("输入想要命名的 txt 文件名", title="新建 txt 文件")
- if '.txt' not in filename:
- filename += '.txt'
- file_store_path = ''
- file_store_path += (folder_dir+'/' + filename)
- try:
- with open(file_store_path) as f:
- g.msgbox('目标文件已存在')
- except FileNotFoundError:
- break
- with open(file_store_path, 'w') as f:
- f.write(final_result)
- g.msgbox('文件保存成功!')
- def get_article_result(url):
- """获得文库文章内容"""
- content_list = []
- contents_result = []
- res = ''
- ssl._create_default_https_context = ssl._create_unverified_context
- r = requests.get(url, headers=headers).text
- try:
- res = json.loads(r)
- res_length = len(res)
- for each in range(res_length):
- content_list.append(each)
- # print((res[1]['parags'][0]))
- except json.JSONDecodeError:
- print("error!")
- # print(content_list)
- try:
- for each in range(len(content_list)):
- contents_result.append(
- res[each]['parags'][0]["c"].replace('\n\n\f', '').replace('\r\n', '')) # 去除干扰项并将文章结果插入到列表里
- except KeyError:
- pass
- # print(contents_result)
- final_result = ''.join(contents_result) # 合并列表内容并转换为 str 类型
- save_article(final_result) # 存储内容至指定的位置
- def get_api_page(api_url, api):
- """获取到包含文件内容的 json 文件"""
- api_page = open_url(api_url)
- get_md5 = r'"md5sum":"([^"]+)'
- md5 = re.findall(get_md5, api_page)[0] # 获取 md5 值
- get_total_page_num = r'"totalPageNum":"([^"]+)'
- total_page_number = re.findall(get_total_page_num, api_page)[0] # 获取 总页数
- get_rsign = r'"rsign":"([^"]+)'
- rsign = re.findall(get_rsign, api_page)[0] # 获取 rsign 值
- content_url = 'https://wkretype.bdimg.com/retype/text/' + \
- api+'?rn='+total_page_number+md5+'&type=txt'+'&rsign='+rsign # 获取 含有所需文章的 url
- get_article_result(content_url)
- def get_api(url):
- """获取api"""
- get_api = r'([^/]+).html'
- api = re.findall(
- get_api, url)[0]
- api_url = 'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=' + \
- api
- get_api_page(api_url, api)
- if __name__ == '__main__':
- url = ''
- top = tkinter.Tk()
- top.geometry('1000x300')
- w = tkinter.Label(top, text="文档链接: ")
- w.place(x=40, y=50)
- E1 = tkinter.Entry(top, bd=3, width=80)
- E1.place(x=170, y=45)
- B = tkinter.Button(top, text="确认", command=hellocallback,
- width=20, height=3, font=('宋体', 20, 'italic'))
- B.place(x=363, y=200)
- top.mainloop()
复制代码
P.s 我的 tkinter 真的学的很烂,一个打开文件夹的窗口操作都花了半天去研究怎么弄。一开始用的是 wxpython 的一个模块,但是不知道什么原因会和 tkinter 发生冲突,导致程序卡死。后来研究半天,才在 tkinter 的 python 文档找到方法。区区几行代码,敲出来以后,真的吐血了 |
评分
-
查看全部评分
|