用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)
链接
简书-<python3爬虫>bilibili完结番剧分区数据抓取
学到的
主要还是熟悉了各种模块的使用
- json模块
- ThreadPool模块
- time模块
- requests模块
- csv模块
- Python的字典与列表类型