Python语言B站爬虫

用python语言写的简单的B站爬虫

网络爬虫基本工作流程

  • 获取初始的URL,该URL是你指定的,想爬取的网页
  • 爬取对应URL地址的网页的时候,获取新的URL地址
  • 将新的URL地址放入URL队列中
  • 从URL队列中读取新的URL,重复
  • 停止条件设置,或者,直至无法获取新的URL

headers设置

原因

有些网站会禁止爬虫访问(比如*乎),加上headers信息可以将访问伪装成浏览器,这样就可以继续访问了。

实现

在Firefox中打开要爬取的页面,按F12查看网络,刷新界面,找到要一组请求头,全部复制,做成headers字典,并在requests.get时使用headers=headers

B站信息存储位置

由于B站对爬虫十分友好,经查阅网上资料(见后面链接),可以找到每种类型对应的api位置。

通过爬取获得json文件,然后通过进行json文件的字典提取,得到每一个标签对应的数据,比如标题title,弹幕数danmaku。

最后将获取到的字典comic_list写入到csv文件中

对比之前写的代码检查文件,这次试用csv文件进行写真是太方便了

遇到的问题

想同时获取硬币、评分、收藏,但是很麻烦的是,评分与我已经找的东西不在同一个json文件中,也没有找到合适跳转方式,只能作罢了,留下一个想法,也许可以通过对加载完的网页进行一些正则匹配获得结果

code

import requests
import json
import csv
import time
from  multiprocessing.dummy import Pool as ThreadPool

headers = {...}

comic_list = []
urls = []

def get_url(x):
    url = 'http://api.bilibili.com/x/web-interface/newlist?rid='+str(x)+'&pn='
    for i in range(1, 513):
        urls.append(url + str(i) + '&ps=50')
     
def get_message(url):
    print(url)
    time.sleep(0.5)
    try:
        r = requests.get(url, timeout=5)
        data = json.loads(r.text)['data']['archives']
        for j in range(len(data)):
            content = {}
            content['aid'] = data[j]['aid']
            content['title'] = data[j]['title']
            content['coin'] = data[j]['stat']['coin']
            content['danmaku'] = data[j]['stat']['danmaku']
            content['reply'] = data[j]['stat']['reply']
            comic_list.append(content)
    except Exception as e:
        print(e)

def write_to_file(comic_list):
    with open(addr, 'w', newline='', encoding='utf-8') as f:
        fieldnames = ['aid', 'title', 'coin', 'danmaku', 'reply']
        writer = csv.DictWriter(f, fieldnames = fieldnames)
        writer.writeheader()
        try:
            writer.writerows(comic_list)
        except Exception as e:
            print(e)
    
if __name__ == '__main__':
    addr = input("信息(*.csv)保存位置:")
    x = input("获取类型:完结番剧 32;连载番剧 33: ")
    get_url(x)
    pool = ThreadPool(4)
    pool.map(get_message, urls)
    pool.close()
    write_to_file(comic_list)

链接

52pojie-Python利用B站API获取视频信息

简书-<python3爬虫>bilibili完结番剧分区数据抓取

GitHub-BilibiliSpider

学到的

主要还是熟悉了各种模块的使用

  • json模块
  • ThreadPool模块
  • time模块
  • requests模块
  • csv模块
  • Python的字典与列表类型