实战---使用多线程爬取哔哩哔哩视频信息(一)

需求:
1.访问哔哩哔哩官网分别搜索(简历,简历模板,面试,实习,找工作,笔试,职场)
2.分别爬取所有视频的以下信息并分别保存至excle表格中
------A;视频标题
------B:up主
------C:视频简介
------D:视频编号(以av开头)
------E:观看总量
------F:投币数
------G:分享的总次数
------H:收藏的总次数

一:逐个搜索+获取页数

要搜索的东西有很多,所以我们将所有选项放至一个列表中,挨个进行爬取.以搜索’简历’为例,发现不止有1页,而且每一页的url都有一定的规律,第一页后面page=1,第二页后面page=2…所以你们懂的.
我们可以先获取总共的页数,然后再对每一页的视频信息进行爬取.

keywords = ['简历','简历模板','面试','实习','找工作','笔试','职场']
for keyword in keywords:
	url_keyword = 'https://search.bilibili.com/all?keyword=%s'%keyword
        #获取每一个问题的页数
        text_keyword = requests.get(url_keyword,handers).content.decode('utf-8')
        pages = re.findall(r'',text_keyword,re.DOTALL)[0]
        #去除没必要的东西
        pages = re.sub(r'\n','',pages)
        pages = int(re.sub(r' ', '', pages))

二:获取视频信息

当我第一次做的时候,使用和以前一样的方法,直接访问视频的链接,结果测试下来发现什么也没得.这个时候就要注意到,视频网页是一个动态网页,不能用以往静态网页的方法,所以我们要抓包来获取数据.
检查网页-network-刷新网页-不难发现我们要获取的数据全在view?cid=…这个包里
实战---使用多线程爬取哔哩哔哩视频信息(一)_第1张图片
而这个包的链接就在Headers中General的Request URL,这才是我们获取数据的链接,我们可以通过json轻松的进行找到数据

text = requests.get(url).content.decode('utf-8')
content = json.loads(text)

print('视频名字:',content['data']['title'])
print('作者:',content['data']['owner']['name'])
print('视频简介:',content['data']['desc'])
print('视频号:','av'+str(content['data']['stat']['aid']))
print('播放量:',content['data']['stat']['view'])
print('硬币数:',content['data']['stat']['coin'])
print('分享数:',content['data']['stat']['share'])
print('点赞数:',content['data']['stat']['like'])

三:数据保存

这个就不用多解释了,用with open就行,要注意的是根据不同的搜索建立不同的文件,我没有巧的方法,只能通过两步来完成

第一步:建立文件,写入标题

 #写入标题
with open('%s.csv'%keyword, 'w', encoding='utf-8', newline='')as fp:
	write = csv.writer(fp)
	write.writerow(title)
	fp.close()

第二步:写入数据

#写入数据
with open('%s.csv'%self.keyword,'a',encoding='utf-8',newline='')as fp:
	write = csv.writer(fp)
	write.writerows(self.data_queue.get())#保存数据的queue队列
	fp.close()

四:多线程使用

我自己使用的是生产消费模式

生产者负责获取数据
消费者负责保存数据

#生产者
class Producted(threading.Thread):
    def __init__(self,url_queue,data_queue,*args,**kwargs):
        super(Producted, self).__init__(*args, **kwargs)
        self.url_queue = url_queue
        self.data_queue = data_queue
    def run(self):
        while True:
            if self.url_queue.empty():
                break
            url = self.url_queue.get()
            self.get_data(url)
    #获取所需要的数据
    def get_data(self,url):
        text = requests.get(url).content.decode('utf-8')
        content = json.loads(text)

        title = content['data']['title']
        author = content['data']['owner']['name']
        info = content['data']['desc']
        info = re.sub(r'\n','',info)
        aid = 'av'+str(content['data']['stat']['aid'])
        view = content['data']['stat']['view']
        coin = content['data']['stat']['coin']
        share = content['data']['stat']['share']
        like = content['data']['stat']['like']
        self.data_queue.put((title,author,info,aid,view,coin,share,like))
#消费者
class Contident(threading.Thread):
    def __init__(self,url_queue,data_queue,keyword,*args,**kwargs):
        super(Contident, self).__init__(*args, **kwargs)
        self.url_queue = url_queue
        self.data_queue = data_queue
        self.keyword = keyword

    def run(self):
        while True:
            if self.url_queue.empty() and self.data_queue.empty():
                break
            print(self.data_queue.get())
            title,author,info,aid,view,coin,share,like = self.data_queue.get()

            with open('%s.csv'%self.keyword,'a', encoding='utf-8', newline='')as fp:
                write = csv.writer(fp)
                write.writerows(self.data_queue.get())

                fp.close()

查看完整代码链接请转

你可能感兴趣的:(笔记,数据挖掘)