python爬虫学习笔记

注释给了一些要点

用requests库爬取时网页可能加载不完整,故用selenium库,加sleep延时使加载充分

主要利用re库,利用正则表达式提取html文件中的信息

threading是多线程运行,节省时间

如何使用?

        配置selenium库,下载chomedriver,网上有教程

        更改range函数的范围就可以对该范围内用户信息爬取

存在问题:

        太慢

        不稳定,会漏用户,测试中        

        用正则表达式麻烦

改进:

        学习xpath、scrapy爬虫框架、线程池等

from selenium import webdriver
import re
import time
import threading

def blbl_uid_get(uid):

    url="https://space.bilibili.com/"+str(uid)
    
    # 不开网页显示
    option = webdriver.ChromeOptions()
    option.add_argument("headless")

    # 使用selenium模块得到网页完整源码
    driver=webdriver.Chrome(chrome_options=option)
    driver.get(url) 
    respond=driver.page_source
    time.sleep(8)

    # 网页内容爬取测试
    # with open("blbl.html","wb+") as f:
    #     f.write(respond.encode())

    up_name=re.findall(r'<span id="h-name">\s*(.*?)\s*</span>',respond,re.S)
    up_fans=re.findall(r'<p id="n-fs" class="n-data-v space-fans">\s*(.*?)\s*</p>',respond,re.S)
    # 网页还是缺失了部分信息如下
    # zan_num=re.findall(r'视频、动态、专栏累计获赞([^"]*)',respond,re.S)
    # watch_num=re.findall(r'截止昨天,播放数总计为([^"]*)',respond,re.S)
    # read_num=re.findall(r'截止昨天,阅读数总计为([^"]*)',respond,re.S)
    if len(up_fans)!=0 and len(up_name)!=0:
        # 摘取要寻找的信息
        record=""
        record=up_name[0]+" "+up_fans[0]+'\n'# +" "+zan_num[0]+" "+watch_num[0]+" "+read_num[0]
        # 写入文件
        with open("up_fans.txt","a+") as f:
            f.write(record)
            f.close()

    # 一定要quit
    driver.quit()

# 并发执行爬虫
for i in range(348651384,348651400):
    t = threading.Thread(target=blbl_uid_get, args=(i,))
    t.start()

结果:

70975784467_bili 0
chnksxf 0
深蓝色五角枫 8
-SWQ- 27
w773727 0
If-There-If 2
bili75588510448 0
u723510 1
o206413 0
10292619012_bili 1
丶帝丶弑 0
t252791 0
why13643485777 0
丁嘉丽12334 0
80204814302_bili 0
ddzn17ZXZ 1

结论:显然,-SWQ-在一定范围内粉丝最多

2023年3月20日21:40:43更新

学习了xpath语言,利用lxml库,可以代替re正则表达式

相比正则表达式,xpath更加简单简洁!

注意tree的两种创建方式的不同:本地文件和网络请求

使用xpath要注重标签之间的结构!找好属性即其值,尽量缩小范围,不然很容易多得!

from selenium import webdriver
import time
import threading
from lxml import etree

def blbl_uid_get(uid):

    url="https://space.bilibili.com/"+str(uid)
    
    # 不开网页显示
    option = webdriver.ChromeOptions()
    option.add_argument("headless")

    # 使用selenium模块得到网页完整源码
    driver=webdriver.Chrome(chrome_options=option)
    driver.get(url) 
    time.sleep(2)
    respond=driver.page_source
    with open("blbl_xpath.html","wb") as f:
        f.write(respond.encode())

    # 利用xpath提取内容(本地调用方式!)
    # paser=etree.HTMLParser(encoding='utf-8')
    # tree=etree.parse('blbl_xpath.html',parser=paser)

    # 利用xpath提取内容(互联网中响应)
    tree=etree.HTML(respond)

    up_name=tree.xpath('//div[@class="h-basic"]//span[@id="h-name"]/text()')
    fans_num=tree.xpath('//div[@class="n-statistics"]//p[@id="n-fs"]/text()')[0].replace('\n','').replace(' ','')
    # statistics=tree.xpath('//div[@class="n-statistics"]//p[@id="n-bf"]/text()')
    work_title=tree.xpath('//div[@class="content clearfix"]//a[@class="title"]/text()')
    work_length=tree.xpath('//div[@class="content clearfix"]//span[@class="length"]/text()')
    work_play=tree.xpath('//div[@class="content clearfix"]//span[@class="play"]/text()')
    work_time=tree.xpath('//div[@class="content clearfix"]//span[@class="time"]/text()')
    min_num=min(len(work_time),len(work_length),len(work_title),len(work_play))

    # 摘取要寻找的信息
    record=""
    record="up昵称:"+up_name[0]+"\n"+"粉丝数:"+fans_num+'\n'
    if(min_num!=0):
        record+='代表作:'+'\n'
        for i in range(0,min_num):
            record+="作品名:"+work_title[i]+"\n"+"时长:"+work_length[i]+"\n"+"播放量:"+work_play[i].replace('\n','').replace(' ','')+"\n"+"发布时间:"+work_time[i].replace('\n','').replace(' ','')
    record+='\n\n'

    # 写入文件
    with open("blbl_xpath_2.txt","w+",encoding='utf-8') as f:
        f.write(record)
        f.close()

    
    # 一定要quit
    driver.quit()

# 并发执行爬虫
for i in range(348651375,348651390):
    t = threading.Thread(target=blbl_uid_get, args=(i,))
    t.start()

结果如下:

up昵称:68228791709_bili
粉丝数:0


up昵称:-SWQ-
粉丝数:27
代表作:
作品名:《刺客信条》6分49秒极限攀爬,同步率1000%
时长:04:18
播放量:164
发布时间:2022-3-20作品名:《消逝的光芒》对断桥、云端的向往以及信仰之跃
时长:09:35
播放量:419
发布时间:2022-2-1作品名:《生化危机2重制版》克莱尔打光弹药后手刃威廉G4
时长:12:14
播放量:310
发布时间:2022-2-1作品名:在西电中秋快乐的一天
时长:07:07
播放量:166
发布时间:2021-9-22作品名:4年菜鸡唯一一次五杀
时长:00:52
播放量:158
发布时间:2021-9-10作品名:沙雕室友们的日常
时长:00:21
播放量:51
发布时间:2020-8-22作品名:2020班级元旦晚会快来康康
时长:03:03
播放量:109
发布时间:2020-1-12作品名:社会我祥哥,同学冒死拍班主任
时长:00:13
播放量:114
发布时间:2019-8-19作品名:【建筑模型】建模锦标赛中华庭院模型展示
时长:02:39
播放量:2797
发布时间:2019-8-19

up昵称:p604904
粉丝数:0


up昵称:78992601564_bili
粉丝数:0


up昵称:10292619012_bili
粉丝数:1


up昵称:DMAP_
粉丝数:9
代表作:
作品名:拍拍猫猫
时长:02:03
播放量:89
发布时间:2022-11-29

up昵称:82212894921_bili
粉丝数:0


up昵称:bili75588510448
粉丝数:0


up昵称:丁嘉丽12334
粉丝数:0


up昵称:68228791709_bili
粉丝数:0


up昵称:80204814302_bili
粉丝数:0


up昵称:t229231
粉丝数:0


up昵称:chnksxf
粉丝数:0


up昵称:GH952105677
粉丝数:0


up昵称:52393731947_bili
粉丝数:0


up昵称:流口水的南方
粉丝数:0


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

switch_swq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值