bilibili网站爬虫

这是一个Python爬虫程序,用于抓取Bilibili(B站)上的视频信息,包括评论人数、点赞数、用户个人信息以及评论内容。程序通过API获取视频ID、标题、属性等,并遍历多页评论进行打印。最后,程序会计算总耗时。
部署运行你感兴趣的模型镜像
# -*- coding: utf-8 -*-
"""
Created on Mon May 07 11:05:49 2018
B站爬虫:
功能: 1 获取评论人数,点赞数,用户个人信息及评论等等
@author: Alis
"""

import re,time
import requests
import os
import json


headers = {'user-agents':'User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'}


def getavID(pn):
    avID = []
    for i in range(1,pn+1):
        url = 'https://api.bilibili.com/x/web-interface/dynamic/region?&jsonp=jsonp&pn=%d&ps=50&rid=24&_=1525679623909'%i
        r = requests.get(url,headers = headers).text
        data = json.loads(r)
        archives = data['data']['archives']
        for ac in archives:
            avID.append(ac['aid'])
            print 'aid: ',ac['aid']
            print 'title: ',ac['title']
            print 'attribute: ',ac['attribute']
        time.sleep(2)
    return avID
    

def getHTMLText(i,num = 2):
    for n in range(1,num):
        url = "https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn="+str(n)+"&type=1&oid="+str(i)+"&sort=0&_=1496477384198"
        r = requests.get(url,headers = headers)
        text = r.text
        print("正在打印第"+str(n)+"页评论!")
        num = printTXT(text)  
        if num > 1:
            break
        
    for n in range(2,num+1):
        url = "https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn="+str(n)+"&type=1&oid="+str(i)+"&sort=0&_=1496477384198"
        r = requests.get(url,headers = headers)
        text = r.text
        print("正在打印第"+str(n)+"页评论!")        
        printTXT(text)  
        time.sleep(1)


def printTXT(text):
    data = json.loads(text)
    reply = data['data']['replies']
    for t in reply:
        print u"用户昵称 :",t['member']['uname'],u'性别',t['member']['sex']
        print u'评论信息',t['content']['message']
        
        if len(t['replies']) > 0:
            for t2 in t['replies']:
                print u"用户昵称 :",t2['member']['uname'],u'性别',t2['member']['sex']
                print u'评论信息',t2['content']['message']                                
    pageNum = data['data']['page']['count'] / 20 + 1   # 评论页数
    return pageNum


if __name__    ==  "__main__":
    
    #i = input(u"请输入av号(数字):")
    begin = time.clock()
    avid = getavID(1)
    map(getHTMLText,avid)
    end = time.clock()
    print 'cost time is: ',round(end-begin,3),'s'

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### B评论区数据抓取爬虫关键词 为了有效地构建一个能够从B评论区抓取数据的爬虫程序,了解并运用恰当的技术栈和方法至关重要。以下是几个关键概念和技术要点: #### 1. API接口调用 直接访问网站前端加载的内容并非总是最高效的方式。许多现代Web应用程序提供了官方API来供开发者合法地获取所需资源。对于B而言,存在公开可用的API端点可以用来请求特定视频下的评论列表[^1]。 ```python import requests def fetch_comments(video_id): url = f"https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn=1&type=1&oid={video_id}" response = requests.get(url) data = response.json() return data['data']['replies'] ``` #### 2. Selenium模拟浏览器行为 当目标网页依赖JavaScript动态渲染内容时,传统的HTTP请求可能无法获得完整的HTML文档。此时可以通过Selenium库控制真实或无头模式下的Chrome/Firefox实例执行自动化操作,从而绕过此类限制条件[^3]。 ```python from selenium import webdriver from selenium.webdriver.common.by import By options = webdriver.ChromeOptions() options.add_argument('--headless') # 设置为无界面模式 driver = webdriver.Chrome(options=options) def get_video_page_content(video_url): driver.get(video_url) elements = driver.find_elements(By.CLASS_NAME, "comment-text") # 假设这是存储评论的地方 comments = [element.text for element in elements] return comments ``` #### 3. 数据解析与提取 无论是通过API还是DOM元素定位方式取得原始响应体之后,都需要进一步处理才能得到结构化的信息片段。这通常涉及到JSON对象遍历或是BeautifulSoup等工具辅助完成HTML标签过滤工作。 ```python from bs4 import BeautifulSoup html_doc = "<div class='root'><span>example</span></div>" soup = BeautifulSoup(html_doc, 'lxml') text = soup.span.string print(text) # 输出 example ``` #### 4. 反爬机制应对策略 为了避免触发反爬措施导致IP被封禁等问题,在设计爬虫逻辑时应考虑加入随机延时、更换User-Agent头部字段以及合理设置并发数量等因素以降低服务器压力并提高成功率[^2]。 ```python import time import random headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } for i in range(10): # 请求次数可以根据实际情况调整 try: resp = requests.get(target_url, headers=headers) parse(resp.content.decode()) sleep_time = round(random.uniform(0.8, 1.2), 2) time.sleep(sleep_time) except Exception as e: print(f"Error occurred: {str(e)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值