python爬取bilbili信息(二)

断了今生、忘了曾经 提交于 2020-02-28 10:54:26

今天是第二部分

在上一部分,我们已经将信息提取的思想做了大致的分析,现在我们就来爬取我们所需要的信息。首先,我把咱们所需要的代码,放在这里。然后逐个讲解。

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("保存完成")

到这里,代码的讲解大致差不多了,如果您还有不懂得可以联系我。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!