爬取微博文章内容

部署运行你感兴趣的模型镜像

项目场景:

爬取微博文章内容:
导入一些模块:
import time
import requests
import csv
import os
from datetime import datetime


问题描述

爬取14个数据:

id
likeNum
commentsLen
reports_count
region
content
contentLen
created_at
type
detailUrl
authorAvatar
authorName
authorDetail
isVip

保存到csv文件:

def init():
    if not os.path.exists('./articleData.csv'):
        with open('./articleData.csv', 'w', encoding='utf-8', newline='') as csvFile:
            writer = csv.writer(csvFile)
            writer.writerow([
                'id',
                'likeNum',
                'commentsLen',
                'reports_count',
                'region',
                'content',
                'contentLen',
                'created_at',
                'type',
                'detailUrl',
                'authorAvatar',
                'authorName',
                'authorDetail',
                'isVip'
            ])


def writerRow(row):
    with open('./articleData.csv', 'a', encoding='utf-8', newline='') as csvFile:
        writer = csv.writer(csvFile)
        writer.writerow(row)


完整代码:

import time
import requests
import csv
import os
from datetime import datetime


def init():
    if not os.path.exists('./articleData.csv'):
        with open('./articleData.csv', 'w', encoding='utf-8', newline='') as csvFile:
            writer = csv.writer(csvFile)
            writer.writerow([
                'id',
                'likeNum',
                'commentsLen',
                'reports_count',
                'region',
                'content',
                'contentLen',
                'created_at',
                'type',
                'detailUrl',
                'authorAvatar',
                'authorName',
                'authorDetail',
                'isVip'
            ])


def writerRow(row):
    with open('./articleData.csv', 'a', encoding='utf-8', newline='') as csvFile:
        writer = csv.writer(csvFile)
        writer.writerow(row)


def get_data(url, params):
    headers = {
        'Cookie': 'XSRF-TOKEN=zASpYIx0oUosfBlB0MsTSRdi; SSOLoginState=1704083302; SUB=_2A25Ilk82DeThGeBI71US9yzKzzuIHXVr6s7-rDV8PUJbkNB-LWXlkW1NRpId-Znw75c-wagHUOjJucjoob6tHv3U; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWZM5jTZLaMAANadOdO6n405NHD95QcSoBNe0MESoBNWs4DqcjPi--Xi-i2iK.4i--NiK.XiKLsS0e4eo-t; WBPSESS=Ii9Wh36g6mj5Z4ggI26vDWjCIui3_Ugbw4SWQGD-3thTaFTWO4WfBvG6bThO4kGKymgzVpGAtZV7ECafvFIdUVzuArqnCejbOvzVVpt49LX2IF7cmIN2gYRZz9Z8CMGcwbkBpKHIXseyKeK-4ee9gw==',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()['statuses']
    else:
        return None


def getAllTypeList():
    typeList = []
    with open('./navData.csv', 'r', encoding='utf-8') as reader:
        readerCsv = csv.reader(reader)
        next(reader)
        for nav in readerCsv:
            typeList.append(nav)
    return typeList


def parse_json(response, type):
    for article in response:
        id = article['id']
        likeNum = article['attitudes_count']
        commentsLen = article['comments_count']
        reports_count = article['reposts_count']
        try:
            region = article['region_name'].replace('发布于', '')
        except:
            region = '无'
        content = article['text_raw']
        contentLen = article['textLength']
        created_at = datetime.strptime(article['created_at'], '%a %b %d %H:%M:%S %z %Y').strftime('%Y-%m-%d')
        type = type
        try:
            detailUrl = 'https://www.weibo.com/' + str(article['id']) + '/' + str(article['mblogid'])
        except:
            detailUrl = '无'
        authorAvatar = article['user']['avatar_large']
        authorName = article['user']['screen_name']
        authorDetail = 'https://www.weibo.com/u/' + str(article['user']['id'])
        isVip = article['user']['v_plus']
        writerRow([
            id,
            likeNum,
            commentsLen,
            reports_count,
            region,
            content,
            contentLen,
            created_at,
            type,
            detailUrl,
            authorAvatar,
            authorName,
            authorDetail,
            isVip
        ])


def start(typeNum=3, pageNum=2):
    articleUrl = 'https://weibo.com/ajax/feed/hottimeline'
    init()
    typeList = getAllTypeList()
    typeNumCount = 0
    for type in typeList:
        if typeNumCount > typeNum:
            return
        time.sleep(1)
        for page in range(0, pageNum):
            print('正在爬取的类型:%s中的第%s页的文章数据' % (type[0], page + 1))
            time.sleep(1)
            params = {
                'group_id': type[1],
                'containerid': type[2],
                'max_id': page,
                'count': 10,
                'extparam': 'discover|new_feed'
            }
            response = get_data(articleUrl, params)
            parse_json(response, type[0])
        typeNumCount += 1


if __name__ == '__main__':
    start()



结果:

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用Python实现微博文章的网络爬虫 要通过Python实现微博文章的网络爬虫,通常可以选择多种方法和技术栈。以下是基于Scrapy框架以及相关技术的具体实现方式。 #### 1. Scrapy框架简介 Scrapy是一个强大的开源Web爬虫框架,用于提取网站上的结构化数据[^2]。它提供了许多内置功能来简化爬取过程,例如请求调度、HTML解析和数据存储等。 #### 2. 准备工作 在开始编写爬虫之前,需要完成以下准备工作: - **安装依赖库** 需要安装`scrapy`和其他可能用到的第三方库,例如`pandas`(用于数据分析)、`requests`(发送HTTP请求)和`selenium`(模拟浏览器行为)。可以通过pip命令安装这些库: ```bash pip install scrapy pandas requests selenium ``` - **获取Cookie** 微博有严格的反爬机制,因此直接访问API可能会遇到限制。为了绕过这一问题,建议使用Chrome或其他现代浏览器登录微博账号并抓取Cookies。将这些Cookies保存下来供爬虫程序使用。 #### 3. 编写Scrapy项目 创建一个新的Scrapy项目,并定义Spider类来指定目标URL模式、解析逻辑等内容: ```python import scrapy from scrapy import Request class WeiboSpider(scrapy.Spider): name = 'weibo_spider' allowed_domains = ['m.weibo.cn'] def start_requests(self): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Cookie': '<your_cookie_here>' # 替换为实际的Cookie字符串 } keywords = ["热点", "新闻"] # 自定义关键词列表 base_url = "https://m.weibo.cn/api/container/getIndex?type=wb&queryVal={}&containerid=100103type%3D2%26q%3D{}" for keyword in keywords: url = base_url.format(keyword, keyword) yield Request(url=url, headers=headers, callback=self.parse) def parse(self, response): data = response.json() statuses = data.get('data', {}).get('cards', []) for status in statuses: mblog = status.get('mblog') if not mblog: continue item = {} item['text'] = mblog.get('text') # 提取微博正文 item['created_at'] = mblog.get('created_at') # 创建时间 item['reposts_count'] = mblog.get('reposts_count') # 转发数 item['comments_count'] = mblog.get('comments_count') # 评论数 item['attitudes_count'] = mblog.get('attitudes_count') # 点赞数 yield item ``` 上述代码片段展示了如何构建一个基本的Scrapy Spider以爬取包含特定关键词的微博内容。 #### 4. 数据清洗与预处理 由于原始数据可能存在噪声或冗余信息,在进一步分析前需对其进行清理。常见的操作包括但不限于: - 剔除广告性质的内容; - 移除非中文字符; - 删除重复项; 可以借助Pandas库高效地完成以上任务: ```python import pandas as pd df = pd.read_csv("output.csv") # 加载导出文件 df_cleaned = df.drop_duplicates(subset=['text']) # 去重 df_filtered = df_cleaned[df_cleaned["text"].str.contains(r"[^\u4e00-\u9fa5]", na=False)] # 过滤非汉字文本 print(df_filtered.head()) ``` #### 5. 存储结果 最后一步是决定如何持久化收集到的信息。一般可选方案如下: - CSV 文件:适合轻量级场景下的快速存档。 - MongoDB 或 MySQL 数据库:当面对海量数据时更为适用。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强哥哥1222

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

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

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

打赏作者

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

抵扣说明:

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

余额充值