微博数据爬取
皮猪 247 2

目录

  • 前言
  • 编写代码
  • 总结

前言

这次我们来获取一下微博,包括时间、评论数、点赞数和内容。本次以“四川农业大学的”为关键词获取到相关数据。来看一看效果吧。 微博数据爬取

编写代码

1.分析网页

还是老套路,右键点击检查。发现我们需要的数据原来的网页里就有。这就很简单了。 唯一需要注意的是微博你不登录你就只能看到第一页的搜索结果,登录后也只能看到前50页的搜索结果。所以我们的请求头里必须带上cookie。还有一点,微博内容过长时,它会折叠起来。展开的内容标签就在折叠内容标签的下方。如果是没有展开全文的内容的话,p标签下就只会有一个a标签。 微博数据爬取 微博数据爬取 微博数据爬取 然后我们来看看请求的参数。这个请求的表单内q是搜索的内容,timescope是搜索的时间范围,page是页数。因为我这次就只是获取以“四川农业大学的”为关键字,2021年1月1日至2021年5月5日内的微博,所需要更改的参数只有page,所以我没有采用表单的形式请求,而是直接在url上进行拼接。如果不会使用表单的话可以看我上一篇文章。8684网站航班数据获取那篇文章就采用了表单请求的方式。 微博数据爬取

2.编写代码

首先是获取数据的函数。

def get_html(url):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': '你的cookie',
        'Host': 's.weibo.com',
        'Pragma': 'no-cache',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
    }
    res = requests.get(url,headers=headers)
    if res.status_code == 200:
        print('获取成功')
        return res.text
    else:
        print('失败')

然后是解析数据的函数。

def jianxi(res):
    data = []
    res = re.findall('<!--card-wrap-->(.*?)<!--/card-wrap-->',res,re.S)
    for r in res:
        xp = etree.HTML(r)
        n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content_full"]//text()')
        if len(n) == 0:
            n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content"]//text()')
        t = xp.xpath('//div[@class="content"]/p[@class="from"]/a[1]/text()')
        p = xp.xpath('//div[@class="card-act"]//li[3]/a/text()')[0]
        d = xp.xpath('//div[@class="card-act"]//li[4]//em/text()')
        if len(d) != 0:
            d = d[0]
        else :
            d = '0'
        p =re.findall('\d*',p)
        p = ''.join('%s' % r.split() for r in p).replace('[', '').replace(']', '').replace('\'', '')
        if p == '':
            p = '0'
        t = ''.join(t[0].split())
        n = ''.join('%s' %r.split() for r in n).replace('[','').replace(']','').replace('\'','')
        n = re.sub(r'\\u...','',n)
        n = re.sub(r'收起全文d','',n)
        data.append({'时间': t, '评论数': p, '点赞数': d, '内容': n})
    return data

最后是写入表格的函数。

def write_data(datas):
    wb = load_workbook('四川农业大学相关微博.xlsx')
    ws = wb.create_sheet('四川农业大学相关微博', 0)
    ys = {
        'A':'时间',
        'B':'评论数',
        'C':'点赞数',
        'D':'内容'
    }
    for key, value in ys.items():
        ws[key + '1'] = value
    b = 0
    for data in datas:
        for n in range(len(list(data.values())[0])):
            for key, value in ys.items():
                ws[key + str(n + 2 + b)] = list(data.values())[0][n][value]
        b += len(list(data.values())[0])
    wb.save('四川农业大学相关微博.xlsx')

3.总的代码

#coding:utf-8
from openpyxl import Workbook
from openpyxl import load_workbook
from lxml import etree
import requests
import time,re

def get_html(url):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': '你的cookie',
        'Host': 's.weibo.com',
        'Pragma': 'no-cache',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
    }
    res = requests.get(url,headers=headers)
    if res.status_code == 200:
        print('获取成功')
        return res.text
    else:
        print('失败')

def jianxi(res):
    data = []
    res = re.findall('<!--card-wrap-->(.*?)<!--/card-wrap-->',res,re.S)
    for r in res:
        xp = etree.HTML(r)
        n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content_full"]//text()')
        if len(n) == 0:
            n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content"]//text()')
        t = xp.xpath('//div[@class="content"]/p[@class="from"]/a[1]/text()')
        p = xp.xpath('//div[@class="card-act"]//li[3]/a/text()')[0]
        d = xp.xpath('//div[@class="card-act"]//li[4]//em/text()')
        if len(d) != 0:
            d = d[0]
        else :
            d = '0'
        p =re.findall('\d*',p)
        p = ''.join('%s' % r.split() for r in p).replace('[', '').replace(']', '').replace('\'', '')
        if p == '':
            p = '0'
        t = ''.join(t[0].split())
        n = ''.join('%s' %r.split() for r in n).replace('[','').replace(']','').replace('\'','')
        n = re.sub(r'\\u...','',n)
        n = re.sub(r'收起全文d','',n)
        data.append({'时间': t, '评论数': p, '点赞数': d, '内容': n})
    return data

def write_data(datas):
    wb = load_workbook('四川农业大学相关微博.xlsx')
    ws = wb.create_sheet('四川农业大学相关微博', 0)
    ys = {
        'A':'时间',
        'B':'评论数',
        'C':'点赞数',
        'D':'内容'
    }
    for key, value in ys.items():
        ws[key + '1'] = value
    b = 0
    for data in datas:
        for n in range(len(list(data.values())[0])):
            for key, value in ys.items():
                ws[key + str(n + 2 + b)] = list(data.values())[0][n][value]
        b += len(list(data.values())[0])
    wb.save('四川农业大学相关微博.xlsx')

if __name__ == '__main__':
    wb = Workbook()
    wb.save('四川农业大学相关微博.xlsx')
    datas = []
    for i in range(1,51):
        url = 'https://s.weibo.com/weibo/%25E8%25B5%25B5%25E7%259D%25BF%25E5%258F%2597%25E4%25BC%25A4?q=%E5%9B%9B%E5%B7%9D%E5%86%9C%E4%B8%9A%E5%A4%A7%E5%AD%A6%E7%9A%84&typeall=1&suball=1&timescope=custom:2021-01-01:2021-05-05&Refer=g&page='+str(i)
        res = get_html(url)
        data = jianxi(res)
        print(i,data)
        datas.append({str(i): data})
        time.sleep(0.5)
    write_data(datas)

总结

本次代码没什么难度,看了后是不是感觉很轻松。这篇写完后我就要休息一段时间,为下次的文章准备内容了。下次见!

评论区

索引目录