bilibili_video_stat
https://github.com/Wangler2333/bilibili_video_stat
爬取b站视频信息,供大数据分析用户喜好。使用scrapy-redis分布式,在16核服务器上实现抓取2500万条/天。可长期部署抓取,实现视频趋势分析
- 1.提供代理ip池
- 2.提供user agent池
- 3.使用scrapy-redis分布式
- 4.使用mongodb保存数据(也可使用mysql,提供了相应代码)
- 5.使用多进程(单个爬虫线程数请根据设备情况自行在settings.py中修改)
- 6.提供完整error记录
- 7.提供自定义重试中间件UserRetryMiddleware(如使用,请在settings.py中修改)
- 8.提供在redis中添加starurls的代码,请阅读redis_n.py文件
启动命令
pip3 install -r requirements.txt
python3 start.py 进程数
# python3 start.py 32
建议配合代理ip池使用,提供 https://github.com/arthurmmm/hq-proxies 代理池的调用中间件,需在settings中开启中间件
请在使用前设置settings.py中的redis和mongodb的连接
pipeline.py注释了使用mysql保存的代码,如使用,请在settings.py添加相应设置
关键代码:
bilibili_spider.py
# -*- coding: utf-8 -*-
from scrapy_redis.spiders import RedisSpider
import logging
from scrapy.exceptions import CloseSpider
from bilibili.items import BiliBiliData
import json
import time
logger = logging.getLogger(__name__)
class BilibiliSpiderSpider(RedisSpider):
name = 'bilibili_spider'
# allowed_domains = ['bilibili.com']
# 启动爬虫的命令
redis_key = "bilibili_spider:strat_urls"
def parse(self, response):
try:
# 若settings中HTTPERROR_ALLOW_ALL = True,则需检测状态吗
if response.status not in [200, 301, 302, 303, 307]:
raise CloseSpider("网址:%s 状态码异常:%s" % (response.url, response.status))
except CloseSpider as error:
logger.error(error)
else:
try:
# 解析json数据
json_data = json.loads(response.text)
except Exception as error:
# 若解析错误,记录url
json_data = {
"code": 403}
logger.error((response.url, error))
with open("./error_json.txt", "a") as fb:
fb.write(response.url)
fb.write("\n")
item = BiliBiliData()
if json_data["code"] == 0:
# 解析json数据,若为"--"则计为0
data = json_