Bootstrap

CSV vs 数据库:爬虫数据存储的最佳选择是什么

爬虫代理

介绍

在爬虫技术中,数据存储是一个不可缺少的环节。然而,选择合适的存储方式对数据分析和结果应用都致关重要。CSV和数据库是常用的两种存储方式,但它们各有优缺。这篇文章将分析两者在爬虫数据存储方面的选择值。

微博热搜是当前网络热点话题的重要风向标,其内容涵盖了娱乐、时事、社会等多方面的信息。爬取微博热搜的数据,不仅可以帮助研究网络热点的传播规律,还能为数据分析和商业决策提供重要参考。

技术分析

CSV

优势

  1. 简单易用:CSV文件格式直观,读写操作无需处理处理。
  2. 资源使用低:对于小量数据,CSV文件存储耗时短,运行效率高。
  3. 移植性高:可存储为文件,容易分享和转换。

不足

  1. 并发性不足:对于大量数据,操作无法并发。
  2. 高级查询支持不足:对于复杂查询,需要额外程序处理。

数据库

优势

  1. 效率高:选择适合的数据库可高效存储和查询大量数据。
  2. 并发支持:通过统一访问控制保证并发操作的数据对值。
  3. 高级查询:SQL语言充分高效处理复杂操作。

不足

  1. 配置处理复杂:需要配置和进行文档学习。
  2. 资源使用较高:对于小量数据,显得过于突出。

总结

如果是小型项目或加载轻量数据,CSV是好选择。而对于大量数据和复杂操作,调用数据库更为适合。

代码实现

以爬取https://weibo.com的热搜信息为例,通过使用多线程和爬虫代理IP技术,将数据存储到数据库中。

import requests
from concurrent.futures import ThreadPoolExecutor
import pymysql

# 配置代理IP 亿牛云爬虫代理 www.16yun.cn
PROXY = {
    "http": "http://用户名:密码@proxy.16yun.cn:8080",
    "https": "http://用户名:密码@proxy.16yun.cn:8080",
}

# 配置头部信息
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Cookie": "请填写您的Cookie",
}

# 数据库连接
connection = pymysql.connect(
    host="localhost",
    user="root",
    password="password",
    database="weibo_data",
    charset="utf8mb4",
)
cursor = connection.cursor()

# 创建表
cursor.execute(
    """
    CREATE TABLE IF NOT EXISTS hot_search (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        content TEXT NOT NULL
    ) CHARSET=utf8mb4;
    """
)
connection.commit()

# 爬取函数
def fetch_hot_search(url):
    try:
        response = requests.get(url, headers=HEADERS, proxies=PROXY, timeout=10)
        response.raise_for_status()
        data = response.json()  # 假设回复格式是JSON

        for item in data.get("hot_search", []):
            title = item.get("title")
            content = item.get("content")
            cursor.execute(
                "INSERT INTO hot_search (title, content) VALUES (%s, %s)", (title, content)
            )
            connection.commit()

    except Exception as e:
        print(f"Error fetching data from {url}: {e}")

# 使用多线程
urls = [f"https://weibo.com/hot_search?page={i}" for i in range(1, 6)]
with ThreadPoolExecutor(max_workers=5) as executor:
    executor.map(fetch_hot_search, urls)

cursor.close()
connection.close()

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;