天天看點

微網誌資料爬取

目錄

  • 前言
  • 編寫代碼
  • 總結

前言

這次我們來擷取一下微網誌,包括時間、評論數、點贊數和内容。本次以“四川農業大學的”為關鍵詞擷取到相關資料。來看一看效果吧。

微網誌資料爬取

編寫代碼

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('(.*?)',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('(.*?)',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×cope=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)      

總結