爬取百度文库
本帖最后由 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['parags']))
except json.JSONDecodeError:
print("error!")
# print(content_list)
try:
for each in range(len(content_list)):
contents_result.append(
res['parags']["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)# 获取 md5 值
get_total_page_num = r'"totalPageNum":"([^"]+)'
total_page_number = re.findall(get_total_page_num, api_page)# 获取 总页数
get_rsign = r'"rsign":"([^"]+)'
rsign = re.findall(get_rsign, api_page)# 获取 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)
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 文档找到方法。区区几行代码,敲出来以后,真的吐血了{:10_285:} 说实话,v.ki 大佬的界面看上去真的比我做的好太多了
没有添加 v.ki 大佬为好友,此处只能手动艾特
已在文章开头附上大佬的原帖 牛啊,更新了 哈哈,我爬虫的时候经常被反爬虫{:10_245:} 感谢分享! 我爬虫特别菜,羡慕死了{:10_266:}
厉害 小伤口 发表于 2021-3-19 23:18
我爬虫特别菜,羡慕死了
厉害
我 tkinter 特别菜,pygame 啥也不会,羡慕死了{:10_266:}
厉害 厉害{:5_106:} 厉害 不愧是大佬 666 Daniel_Zhang 发表于 2021-3-19 23:52
我 tkinter 特别菜,pygame 啥也不会,羡慕死了
厉害
爬虫才是灵魂{:10_266:} {:10_291:} 厉害{:10_254:} 厉害了!!! 羡慕大佬 太强了{:5_111:} {:10_260:} 咋的用为啥我的实现不了啊
yayc_zcyd 发表于 2021-3-19 22:11
哈哈,我爬虫的时候经常被反爬虫
{:5_100:}
页:
[1]
2