记得之前写毕业论文的时候总是会去看百度文库,里面还是有很多知识点值得我们去学习借鉴的。今天刚好项目没什么事、就去网上看了下别人怎么爬取的。自己再整理一下。发给大家一起借鉴
其实也没什么难的, 就是里面正则表达式需要自己去理解。iOS项目里面一般只是在验证手机号、判断网页Url的时候会用一下正则表达式,刚好也是技能学习,多了解一点总更好。
单独讲一下这个Demo里面的正则吧,具体的我还不是很了解,我也没深入研究这个东西
1、result返回的是括号里面的内容, 那么.*表示的应该是里面的一个任意长度的字符 直到.html停止
2、findAll 返回的是一个数组,所以这里我们拿的是[0] 数组里面的第一个元素
3、假设 url= 'hhwerwerwerview/42342341wr.html' 那么result= 42342341wr
result = re.findall('view/(.*).html', url)[0]
1、查找起始是title .*? 的意思是中间是任意长度的字符除换行符,\: 匹配的是\ 好像所有的标点符号都用了反斜杠
2、结果是返回括号里面的值
3、假设 url = 'title3423qw:qwwer'1231434' 那么result= 1231434
result = re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]
1、这里面我也不是很懂 意思就是你需要匹配的字符串里面出现反斜杠的话\,需要用四个反斜杠
3、假设 url = 'https://14234235346456.html\x22' 那么result= https://14234235346456.html
url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)
import requests
import re
import json
import os
session = requests.session()
def fetch_url(url):
return session.get(url=url).content.decode('gbk')
def get_doc_id(url):
return re.findall('view/(.*).html', url)[0]
def parse_type(content):
return re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0]
def parse_title(content):
return re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]
def parse_doc(content):
result = ''
url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content) # 匹配\需要\\\\
# https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert4844\\\/\\\/wk\\\/7210afedd7358a5
# bd48649cf6dad0de5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C
# %2029%20Jun%202019%2014%3A56%3A28%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa
# 7cc85045ce7179e%2F2019-05-15T06%3A56%3A28Z%2F3600%2Fhost%2Fddebf898b7d5f21bffa6b06bbfc684
# 1d2f89f574e32a5fa4edee8ffbff44e057&x-bce-range=0-16174&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIx
# LjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU1NzkwNjk4OCwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDY
# WNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.bDk2fN4WA%2BfOAHAWSeT
# UvfSu4xHnyKVQJ9LzqgqiOEg%3D.1557906988
url_list = [addr.replace("\\\\\\/", "/") for addr in url_list] # 将 url上的\\\转换成\
for url in url_list:
content = fetch_url(url)
y = 0
txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)
for txt in txtlists:
if not y == txt[1]:
n = '\n'
else:
n = ''
result += n
result += txt[0].encode('utf-8').decode('unicode_escape', 'ignore')
y = txt[1]
return result
def parse_txt(doc_id):
pass
def save_file(filename, content):
with open(filename, 'w', encoding='utf8') as f:
f.write(content)
print('已保存为:'+ filename)
def main():
# input(str('请输入要下载的文库URL....\n'))
url = 'https://wenku.baidu.com/view/aa31a84bcf84b9d528ea7a2c.html'
content = fetch_url(url)
doc_id = get_doc_id(url)
type = parse_type(content)
title = parse_title(content)
if type == 'doc':
result = parse_doc(content)
save_file(title+'.txt', result)
pass
if __name__ == '__main__':
main()
结果
image.png
好了、也没什么别的了。逻辑上来说的话就是简单。难的就是刚入门的人来说,不了解每个函数的作用,带参问题。 还有一个难点,就是在解析网页的时候需要知道怎么解析得到你想要的数据
网友评论