马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 文档找到方法。区区几行代码,敲出来以后,真的吐血了 |