关于b站爬虫的尝试(一)
由于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站爬虫的尝试(一)的更多相关文章
- 关于b站爬虫的尝试(二)
前几天学习了scrapy的框架结构和基本的使用方法,部分内容转载自:http://blog.csdn.net/qq_30242609/article/details/52810840 scrapy由编 ...
- 【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施
[初码文章推荐] 程序员的自我修养 Azure系列文章 阿里云系列文章 爬虫系列文章 [初码产品推荐] AlphaMS开发模式 闪送达城市中央厨房 今天带来一个有意思的东西-分布式B站爬虫任务系统 这 ...
- 用Python+Aria2写一个自动选择最优下载方式的E站爬虫
前言 E站爬虫在网上已经有很多了,但多数都只能以图片为单位下载,且偶尔会遇到图片加载失败的情况:熟悉E站的朋友们应该知道,E站许多资源都是有提供BT种子的,而且通常打包的是比默认看图模式更高清的文件: ...
- R语言爬虫初尝试-基于RVEST包学习
注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...
- 基于Scrapy的B站爬虫
基于Scrapy的B站爬虫 最近又被叫去做爬虫了,不得不拾起两年前搞的东西. 说起来那时也是突发奇想,想到做一个B站的爬虫,然后用的都是最基本的Python的各种库. 不过确实,实现起来还是有点麻烦的 ...
- 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取
新建项目 # 新建项目$ scrapy startproject jianshu# 进入到文件夹 $ cd jainshu# 新建spider文件 $ scrapy genspider -t craw ...
- 【Python爬虫案例】用Python爬取李子柒B站视频数据
一.视频数据结果 今天是2021.12.7号,前几天用python爬取了李子柒的油管评论并做了数据分析,可移步至: https://www.cnblogs.com/mashukui/p/1622025 ...
- 某图片站反爬加密字段x-api-key破解
前言 此次逆向的是某“你们都懂”领域的图片站,目前此站限制注册,非会员无法访问:前两天偶然搞到了份邀请码,进入后发现质量还可以,于是尝试爬取,在爬虫编写过程中发现此站点采用了不少手段来阻止自动化脚本( ...
- Scrapy (网络爬虫框架)入门
一.Scrapy 简介: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado) ...
随机推荐
- [转帖]龙芯:Docker 配置与实践清单
Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...
- 在django中进行后台管理时插入外键数据时不显示值的问题
在django的后台管理站点插入数据时,发现需要添加外键时,下拉框中不显示值 按照显示内容中的object,考虑这里应该是调用的模型类的objects对象方法,那么去models.py中对模型类添加一 ...
- JS数据拷贝
JS的拷贝可分为浅拷贝和深拷贝: 浅拷贝:如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化. 深拷贝 ...
- 二进制协议gob和msgpack介绍
二进制协议gob和msgpack介绍 本文主要介绍二进制协议gob及msgpack的基本使用. 最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空接口存放的数 ...
- 关于泛型擦除的知识(来源于csdn地址:https://blog.csdn.net/briblue/article/details/76736356)
泛型,一个孤独的守门者. 大家可能会有疑问,我为什么叫做泛型是一个守门者.这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇.泛型是 Java 中一个很小巧的概念,但 ...
- TPFanControl.ini
TPFanControl.ini 64位系统安装目录分为两种 64位用:C:\Program Files 32位用:C:\Program Files (x86) 64位系统系统目录分为两种 64位用: ...
- [转载]关于Pretrain、Fine-tuning
[转载]关于Pretrain.Fine-tuning 这两种tricks的意思其实就是字面意思,pre-train(预训练)和fine -tuning(微调) 来源:https://blog.csdn ...
- windows 无法找到unistd.h 的解决方法
//#include <unistd.h> #ifndef _UNISTD_H #define _UNISTD_H #include <io.h> #include < ...
- SQL优化的总结和一些避免全盘扫描的注意事项
1.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描. 2.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一 ...
- 使用2种python脚本工具将2个txt文档中的文字进行比较,并计算出Corr, WER正确率,准确率
一.准备: linux服务器,src2mlf.py rec2mlf.py HResults文件,1份源文件和1份需要对比的文件.文件放置于本人云盘 二.使用方法: 1. 对比工具 HResul ...