由于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. Nginx 小入门记录 之 Nginx 配置文件解读(二)

    上一小节主要是记录一些环境准备和Nginx的安装,接下来对Nginx基本配置进行记录. 查看配置文件安装记录 可以通过以下Linux命令进行查看: rpm -ql nginx rpm 是liunx的包 ...

  2. The timeout period elapsed prior to completion of the operation or the server is not responding.

    问题:更新数据的状态值时,部分报出如下异常: 即时有成功更新,时有报错问题出现. 在LOG中发现成功更新的数据,存在更新时间过长问题,将近30秒(EF默认的CommandTimeout为30秒): 代 ...

  3. Design In-Memory File System

    Design an in-memory file system to simulate the following functions: ls: Given a path in string form ...

  4. uniapp如何使用阿里iconfont

    1.将iconfont中需要的图标,添加到购物车,然后添加到自己的项目.生成在线代码. 2.点击下载至本地.然后解压后复制 iconfont.css 文件到你的项目. 3.复制第一步生成的代码,替换i ...

  5. java开源APM概要

      候选APM naver/pinpoint(github上2148个star) 韩国的一个公司开源的,有待评估使用情况,就是整体还不是JDK8,有些还是有点费劲,技术上采用agent的方式,对jav ...

  6. 有关带scala版本的eclipse4.7的下载

    有关带scala版本的eclipse4.7的下载, 你可以直接去: http://scala-ide.org/download/sdk.html ​ 下载下来后是:scala-SDK-4.7.0-vf ...

  7. 怎样查看或修改元素节点的id属性

    使用 el.id; el表示获取到的元素节点, 如下所示: // HTML 代码 // <div id="app" class="c1">hello ...

  8. 怎样理解document节点

    1. document是七种文档节点中的一种, 是最顶级的一种节点; 2. 其他六种节点都包在document节点之内; 3. document既是一种节点的名字, 也是这种节点在DOM中的实例对象; ...

  9. poj 1224

    题意:有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭. 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转. 现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过 ...

  10. asp.net core In Docker(Image)

    原文地址:https://www.cnblogs.com/stulzq/p/9059108.html 大家应该知道目前.NET Core(2.0)还是没有System.Drawing程序集,如果我们要 ...