由于b站爬虫难度较小(url地址主要通过av定位),我第一的爬虫尝试就选择了b站

以下为初步的尝试。

首先,由于初步统计,b站空视频(已下架或者删除)的比例大概是百分之五十(统计样本基本在前几年的视频中),因此,我觉得使用简单的迭代搜索问题不大(如果为了减少一半的搜索量写大量爬虫逻辑代码比较浪费时间)我使用的是python自带的request获取b站页面源代码,然后本来想直接获取数据。然而,开始的数据(硬币,播放数等)并不能很容易的获取。因为b站的数据都是通过js动态加载,直接用request只能获得静态页面。不过问题不大,通过使用chrome开发者工具的监听抓包,我找出了js文件并发现b站对外的公共接口

弹幕接口为:http://comment.bilibili.com/%s.xml %cid

视频信息接口为:https://api.bilibili.com/x/web-interface/archive/stat?aid=%s %aid

其中,aid和cid为两个可以从页面源代码中获取的编号

以上,基本完成对b站视频的爬虫,当然单线程会出现速度慢的问题,目前先用

from multiprocessing.pool import Pool

解决,处理速度大概是100条/s,其中70%的时间用于request获取页面源码,30%时间用于request获取视频信息接口的json包

之后,看了网上的爬虫教程,部分人推荐使用seleium+PhantomJS的框架,因为PhantomJS作为无头浏览器,可以直接获取动态页面的数据,就可以不用再用抓包和访问api的方式获取信息了。但是,尽管PhantomJS是无头浏览器,相对的对系统的负载较小,但相对于传统的爬虫,功能上的损耗还是比较大的,经过测试,似乎除去了获取json包的时间,使用seleium的获取速度甚至比不上之前使用多线程的requests。这方面的问题可能需要再思考一下。

经统计,目前b站视频总数大概是2000,0000个,而且还在持续增长中,如果用100/s的速度获取,需要20,0000s,折合55h。这个数据应该还有改进的空间。

目前想到的是两种改进方式:

1.优化爬虫逻辑,筛除已下架视频(大概可以减少一半的时间)

2.尝试使用scrapy框架

另:目前用万级数据测试似乎没有因为访问频率过快被禁止访问,如果出现该情况应该会用sleep和尝试使用多ip地址访问

useRequest:

# -*-  coding:utf-8 -*-
import requests
import re
import json
import copy
from savecsv import savecsv
from savecsv import csvhead
from multiprocessing.pool import Pool
import time # driver = webdriver.PhantomJS()
# driver.get("https://www.bilibili.com")
# count = 0
# dict = {}
# # @profile
def myspider(av):
dict = {}
# global count
# global dict
url = 'https://www.bilibili.com/video/av%s/' % str(av)
resp = requests.get(url)
page = resp.text
temp = re.search(r'<div class="v-title"><h1 title="(.+?)">', page)
if temp:
# count += 1
title = re.search(r'<div class="v-title"><h1 title="(.+?)">', page).group(1)
authorkit = re.search(r'r-info.+?title="(.+?)"', page)
if authorkit:
author = authorkit.group(1)
aid = re.search(r'aid=(\d+)', page).group(1)
cid = re.search(r'cid=(\d+)', page).group(1)
print cid
if aid:
page = requests.get('https://api.bilibili.com/x/web-interface/archive/stat?aid=%s' % aid).text
info = json.loads(page)
dict[av] = copy.deepcopy(info['data'])
dict[av]['title'] = title.encode('utf-8')
dict[av]['author'] = author.encode('utf-8')
savecsv(dict, "test.csv")
# print title
# print aid
# print cid if __name__ == "__main__":
start = time.time()
csvhead(['av','硬币','排名','copyright','标题','分享','up主','收藏','弹幕数','回复','aid','','最高排名','观看数'], 'test.csv')
results = []
mypool = Pool(processes=100)
for av in xrange(10000):
results.append(mypool.apply_async(myspider, args=(av,)))
# myspider(7)
mypool.close()
mypool.join()
end = time.time()
print str(end - start)+'s'
useSeleium:
# -*-  coding:utf-8 -*-
import requests
import re
import json
import copy
from savecsv import savecsv
from savecsv import csvhead
from multiprocessing.pool import Pool
import time
from selenium import webdriver # driver = webdriver.PhantomJS()
# driver.get("https://www.bilibili.com")
# count = 0
# dict = {}
# # @profile
def myspider(av):
dict = {}
# global count
# global dict
url = 'https://www.bilibili.com/video/av%s/' % str(av)
service_args = []
service_args.append('--load-images=no') ##关闭图片加载
service_args.append('--disk-cache=yes') ##开启缓存
service_args.append('--ignore-ssl-errors=true') ##忽略https错误
service_args.append('--ssl-protocol=any')
driver = webdriver.PhantomJS(service_args=service_args)
driver.get(url)
page = driver.page_source
# resp = requests.get(url)
temp = re.search(r'<div class="v-title"><h1 title="(.+?)">', page) if temp:
# count += 1
title = re.search(r'<div class="v-title"><h1 title="(.+?)">', page).group(1)
authorkit = re.search(r'r-info.+?title="(.+?)"', page)
if authorkit:
author = authorkit.group(1)
aid = re.search(r'aid=(\d+)', page).group(1)
cid = re.search(r'cid=(\d+)', page).group(1)
driver.quit()
print aid
print cid
print title if __name__ == "__main__":
start = time.time()
csvhead(['av','硬币','排名','copyright','标题','分享','up主','收藏','弹幕数','回复','aid','','最高排名','观看数'], 'test.csv')
results = []
# mypool = Pool(processes=100)
# spiderpath()
for av in xrange(10):
# results.append(mypool.apply_async(myspider, args=(av,)))
myspider(av)
# mypool.close()
# mypool.join()
end = time.time()
print str(end - start)+'s'

关于b站爬虫的尝试(一)的更多相关文章

  1. 关于b站爬虫的尝试(二)

    前几天学习了scrapy的框架结构和基本的使用方法,部分内容转载自:http://blog.csdn.net/qq_30242609/article/details/52810840 scrapy由编 ...

  2. 【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施

    [初码文章推荐] 程序员的自我修养 Azure系列文章 阿里云系列文章 爬虫系列文章 [初码产品推荐] AlphaMS开发模式 闪送达城市中央厨房 今天带来一个有意思的东西-分布式B站爬虫任务系统 这 ...

  3. 用Python+Aria2写一个自动选择最优下载方式的E站爬虫

    前言 E站爬虫在网上已经有很多了,但多数都只能以图片为单位下载,且偶尔会遇到图片加载失败的情况:熟悉E站的朋友们应该知道,E站许多资源都是有提供BT种子的,而且通常打包的是比默认看图模式更高清的文件: ...

  4. R语言爬虫初尝试-基于RVEST包学习

    注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...

  5. 基于Scrapy的B站爬虫

    基于Scrapy的B站爬虫 最近又被叫去做爬虫了,不得不拾起两年前搞的东西. 说起来那时也是突发奇想,想到做一个B站的爬虫,然后用的都是最基本的Python的各种库. 不过确实,实现起来还是有点麻烦的 ...

  6. 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取

    新建项目 # 新建项目$ scrapy startproject jianshu# 进入到文件夹 $ cd jainshu# 新建spider文件 $ scrapy genspider -t craw ...

  7. 【Python爬虫案例】用Python爬取李子柒B站视频数据

    一.视频数据结果 今天是2021.12.7号,前几天用python爬取了李子柒的油管评论并做了数据分析,可移步至: https://www.cnblogs.com/mashukui/p/1622025 ...

  8. 某图片站反爬加密字段x-api-key破解

    前言 此次逆向的是某“你们都懂”领域的图片站,目前此站限制注册,非会员无法访问:前两天偶然搞到了份邀请码,进入后发现质量还可以,于是尝试爬取,在爬虫编写过程中发现此站点采用了不少手段来阻止自动化脚本( ...

  9. Scrapy (网络爬虫框架)入门

    一.Scrapy 简介: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado) ...

随机推荐

  1. [转帖]龙芯:Docker 配置与实践清单

    Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...

  2. 在django中进行后台管理时插入外键数据时不显示值的问题

    在django的后台管理站点插入数据时,发现需要添加外键时,下拉框中不显示值 按照显示内容中的object,考虑这里应该是调用的模型类的objects对象方法,那么去models.py中对模型类添加一 ...

  3. JS数据拷贝

    JS的拷贝可分为浅拷贝和深拷贝: 浅拷贝:如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化. 深拷贝 ...

  4. 二进制协议gob和msgpack介绍

    二进制协议gob和msgpack介绍 本文主要介绍二进制协议gob及msgpack的基本使用. 最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空接口存放的数 ...

  5. 关于泛型擦除的知识(来源于csdn地址:https://blog.csdn.net/briblue/article/details/76736356)

    泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇.泛型是 Java 中一个很小巧的概念,但 ...

  6. TPFanControl.ini

    TPFanControl.ini 64位系统安装目录分为两种 64位用:C:\Program Files 32位用:C:\Program Files (x86) 64位系统系统目录分为两种 64位用: ...

  7. [转载]关于Pretrain、Fine-tuning

    [转载]关于Pretrain.Fine-tuning 这两种tricks的意思其实就是字面意思,pre-train(预训练)和fine -tuning(微调) 来源:https://blog.csdn ...

  8. windows 无法找到unistd.h 的解决方法

    //#include <unistd.h> #ifndef _UNISTD_H #define _UNISTD_H  #include <io.h>  #include < ...

  9. SQL优化的总结和一些避免全盘扫描的注意事项

    1.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描. 2.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一 ...

  10. 使用2种python脚本工具将2个txt文档中的文字进行比较,并计算出Corr, WER正确率,准确率

    一.准备: linux服务器,src2mlf.py   rec2mlf.py   HResults文件,1份源文件和1份需要对比的文件.文件放置于本人云盘 二.使用方法: 1. 对比工具 HResul ...