今天是第二部分
在上一部分,我们已经将信息提取的思想做了大致的分析,现在我们就来爬取我们所需要的信息。首先,我把咱们所需要的代码,放在这里。然后逐个讲解。
from typing import List, Any
import requests
import re
def html(url):
try:
re =requests.get(url)
re.raise_for_status()
re.encoding=re.apparent_encoding
return re.text
except:
print('网站提取出现问题')
def htmltext(list,text):
video_num = re.findall(r'<a title="(.*?)"', text)
title = re.findall(r'<a title="(.*?)" href', text, re.S)
href = re.findall(r'<a title=".*?" href="//(.*?)"',text,re.S)
danmu = re.findall(r'<i class="icon-subtitle"></i>(.*?)<', text, re.S)
putdtae= re.findall(r'<i class="icon-date"></i>(.*?)<', text, re.S)
upname = re.findall(r'class="up-name">(.*?)</a>', text, re.S)
upkongjian = re.findall(r'</i><a href="//(.*?)"', text, re.S)
for i in range(len(video_num)):
putdata = re.split(r'\n',putdtae[i])[1]
danmudata = re.split(r'\n',danmu[i])[1]
list.append([title[i],href[i],upname[i], upkongjian[i],putdata, danmudata])
return list
def printlist(printlst):#主要是在pycharm显示一遍,好观察,数据是否出错
place ="{:<50} {:<45} {:^30} {:^30} {:^30} {:^20}"
print(place.format('题目','作品链接','upname','up空间','推播时间','弹幕数量'))
for g in printlst:
#print(g[4])
print("{:<50} {:<45} {:^30} {:^30} {:^30} {:^20}".format(g[0],g[1],g[2],g[3],g[4],g[5]))
def savetext(printlst):
with open(r"C:\Users\华为\Desktop\python.txt","w",encoding='utf-8') as f:
f.write('题目'+'\t'+'作品链接'+'\t'+'upname'+'\t'+'up空间'+'\t'+'推播时间'+'\t'+'弹幕数量'+'\t'+'\n')
for i in printlst:
for j in i:
f.write(j+'\t')
f.write('\n')
f.close()
print("保存完成")
def main():
word= input('请输入你想了解的博主:')
list = []
for i in range(50):
url= 'https://search.bilibili.com/all?keyword='+word+'&from_source=nav_search_new&page='+str(i+1)
text = html(url)
printlst = htmltext(list,text)
print(list)
printlist(printlst)
savetext(printlst)
main()
对于以上代码,一个函数对着一个函数进行封装,最后调用。
大家可以先打印一下代码,看看会不会出错呢?
如果不出意外是会出错的哦。大家想想为什么?
带着问题,我们往下走。。。。
def html(url):#封装函数
#try:函数
#except:有错误进行这一部分
try:
re =requests.get(url) #提取网站
re.raise_for_status() #查询网站状态,是否可以提取
re.encoding=re.apparent_encoding #将代码转化成所需要的代码
return re.text#返回文档形式
except:
print('网站提取出现问题')
这一个函数部分主要目的上在网上找到我们所需要的网站,然后用第三方库requests库,将网页源代码进行下载。最后封装在re.text,进行调用使用。
def htmltext(list,text):
video_num = re.findall(r'<a title="(.*?)"', text)
title = re.findall(r'<a title="(.*?)" href', text, re.S)
href = re.findall(r'<a title=".*?" href="//(.*?)"',text,re.S)
danmu = re.findall(r'<i class="icon-subtitle"></i>(.*?)<', text, re.S)
putdtae= re.findall(r'<i class="icon-date"></i>(.*?)<', text, re.S)
upname = re.findall(r'class="up-name">(.*?)</a>', text, re.S)
upkongjian = re.findall(r'</i><a href="//(.*?)"', text, re.S)#从这里到上面主要使用了re正则方法对信息进行提取。
for i in range(len(video_num)):
putdata = re.split(r'\n',putdtae[i])[1]#将里面数据进行分割,并提取里面我们所需要的数据
danmudata = re.split(r'\n',danmu[i])[1]
list.append([title[i],href[i],upname[i], upkongjian[i],putdata, danmudata])#将每个数据都添加到列表,方便后面的提取
return list#最后,整个函数返回list列表
def savetext(printlst):
with open(r"C:\Users\华为\Desktop\python.txt","w",encoding='utf-8') as f:#打开文件夹,如果在这里没有文件夹,后果是怎样的呢?自己动手试一试。
f.write('题目'+'\t'+'作品链接'+'\t'+'upname'+'\t'+'up空间'+'\t'+'推播时间'+'\t'+'弹幕数量'+'\t'+'\n')
for i in printlst:
for j in i:
f.write(j+'\t')
f.write('\n')
f.close()
print("保存完成")
到这里,代码的讲解大致差不多了,如果您还有不懂得可以联系我。
来源:CSDN
作者:小白巨白
链接:https://blog.csdn.net/weixin_45837168/article/details/104549801