【爬虫专栏7】爬取B站排行

普通格式保存

#好啊吧,我承认这一天我太无聊了水着玩的
import requests
import re
from requests.exceptions import  RequestException
import csv

'''
#csv的a+性质表示追加,这个和pandas的to_csv的mode='a'是一样的道理
csv_file = open(r'E:\vscode_code\爬虫测试\B站\Bzhan.csv', 'w', newline='', encoding='utf-8-sig')  # 解决中文乱码问题
writer = csv.writer(csv_file)
#这个理论上应该用w模式打开,这里懒得改了
writer.writerow(['排名', '名称', '观看人数'])
'''     

url = 'https://www.bilibili.com/ranking/all/0/0/3'

def get_one_page(url):
    try:
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        response = requests.get(url, headers = headers)
        if response.status_code==200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    #csv的a+性质表示追加,这个和pandas的to_csv的mode='a'是一样的道理
    #csv_file = open(r'E:\vscode_code\爬虫测试\B站\Bzhan.csv', 'a+', newline='', encoding='utf-8-sig')  # 解决中文乱码问题
    #writer = csv.writer(csv_file)
    
    #针对于多条数据的正则表达式爬取,就是用多个括号       
    #针对匹配,一个尖括号结束之后最好用.*?过渡到另一个尖括号,不要什么都不加,可能抓不出来
    #pattern = re.compile(r'<div class="num">(.*?)</div>.*?class="title">(.*?)</a>',re.S)##正则
    pattern = re.compile(r'class="title">(.*?)</a>.*?<div class="num">(.*?)</div>',re.S)##正则

    #pattern = re.compile(r'<div class="num">(.*?)</div>.*?class="title">(.*?)</a>.*?<i class="b-icon play"></i>(.*?)</span>',re.S)##正则
    #r'class="j_th_tit ">(.*?)</a><span class=.*? title="回复">(.*?)</span><span class=.*?title="主题作者:(.*?)" data-field=.*?><span class=.*? title="最后回复时间">(.*?)</span>'
    #这里爬到的是一个元组。所以需要给他隔开,不然csv读取后处理会有些麻烦
    items = re.findall(pattern,html) 
    '''
    for item in items:
        #在这里给他分开读取
        writer.writerow([item[0], item[1], item[2]])
        #print(item)
    '''
    print(items)
    #csv_file.close()

def main():
    html = get_one_page(url)
    #print('打印第',(i+1),'页')
    parse_one_page(html)
    print('ok')

if __name__=='__main__':
    main()

dict格式保存

import requests
import re
from requests.exceptions import  RequestException
import pandas as pd 
import csv

'''
#csv的a+性质表示追加,这个和pandas的to_csv的mode='a'是一样的道理
csv_file = open(r'E:\vscode_code\爬虫测试\B站\Bzhan.csv', 'w', newline='', encoding='utf-8-sig')  # 解决中文乱码问题
writer = csv.writer(csv_file)
#这个理论上应该用w模式打开,这里懒得改了
writer.writerow(['排名', '名称', '观看人数'])
'''     

url = 'https://www.bilibili.com/ranking/all/0/0/3'

def get_one_page(url):
    try:
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        response = requests.get(url, headers = headers)
        if response.status_code==200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    #csv的a+性质表示追加,这个和pandas的to_csv的mode='a'是一样的道理
    #csv_file = open(r'E:\vscode_code\爬虫测试\B站\Bzhan.csv', 'a+', newline='', encoding='utf-8-sig')  # 解决中文乱码问题
    #writer = csv.writer(csv_file)
    
    #针对于多条数据的正则表达式爬取,就是用多个括号       
    #针对匹配,一个尖括号结束之后最好用.*?过渡到另一个尖括号,不要什么都不加,可能抓不出来
    
    #'class="title">(.*?)</a>'这个正则匹配的是不完全的,会匹配到别的,下面的是对的,匹配度越高越好
    pattern1 = re.compile(r'target="_blank" class="title">(.*?)</a>',re.S)##正则
    pattern2 = re.compile(r'class="num">(.*?)</div>',re.S)##正则

    #这里爬到的是一个元组。所以需要给他隔开,不然csv读取后处理会有些麻烦
    names = re.findall(pattern1,html) 
    nums = re.findall(pattern2,html) 
    print(len(names), len(nums))
    
    #利用字典存储多个内容,这样就可以避免使用for语句使元组隔开后分开读取了,是另外一种可行方法
    data = {'names':names, 'nums':nums}
    basic_data = pd.DataFrame.from_dict(data = data)
    basic_data.to_csv(r'E:\vscode_code\爬虫测试\B站\Bzhan2.csv', index=False, header=True)
    print(basic_data)
    
    '''
    for item in items:
        #在这里给他分开读取
        writer.writerow([item[0], item[1], item[2]])
        #print(item)
    '''
    #print(items)
    #csv_file.close()

def main():
    html = get_one_page(url)
    #print('打印第',(i+1),'页')
    parse_one_page(html)
    print('ok')

if __name__=='__main__':
    main()


多个排行

import requests
import re
from requests.exceptions import  RequestException
import csv

i=[1,168,3,129,4,36,188,160,119,155,5,181]
for j in range(len(i)):
    url = 'https://www.bilibili.com/ranking/all/{}/0/3'.format(i[j])

    def get_one_page(url):
        try:
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
            response = requests.get(url, headers = headers)
            if response.status_code==200:
                return response.text
            return None
        except RequestException:
            return None

    def parse_one_page(html):
        #csv的a+性质表示追加,这个和pandas的to_csv的mode='a'是一样的道理
        csv_file = open(r'E:\vscode_code\爬虫测试\B站\Bzhan3.csv', 'a+', newline='', encoding='utf-8-sig')  # 解决中文乱码问题
        writer = csv.writer(csv_file)
        #这个理论上应该用w模式打开,这里懒得改了
        #writer.writerow(['回复数', '元尊贴吧标题'])
        
        #针对于多条数据的正则表达式爬取,就是用多个括号       
        #pattern = re.compile(r'<div class="num">(.*?)</div>.*?class="title">(.*?)</a>',re.S)##正则
        pattern = re.compile(r'<div class="num">(.*?)</div>.*?class="title">(.*?)</a>.*?<i class="b-icon play"></i>(.*?)</span>',re.S)##正则
        #r'class="j_th_tit ">(.*?)</a><span class=.*? title="回复">(.*?)</span><span class=.*?title="主题作者:(.*?)" data-field=.*?><span class=.*? title="最后回复时间">(.*?)</span>'
        #这里爬到的是一个元组。所以需要给他隔开,不然csv读取后处理会有些麻烦
        items = re.findall(pattern,html) 
        
        for item in items:
            #在这里给他分开读取
            writer.writerow([int(item[0])+100*j, item[1], item[2]])
            #print(item)
        
        #print(items)
        csv_file.close()

    def main():
        html = get_one_page(url)
        #print('打印第',(i+1),'页')
        parse_one_page(html)
        print('ok')

    if __name__=='__main__':
        main()




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值