游客发表

怎么把爬虫爬到的数据放进数据库

发帖时间:2026-10-17 05:06:48

爬虫跑完,把爬数据在内存里堆着,虫爬程序一关全没了。数据数据你得把它落到硬盘上,放进数据库就是把爬最顺手的地方。我见过太多人把数据存成 CSV 然后每次查询都重新读一遍,虫爬数据量一大就卡得想砸键盘。数据数据直接写库,放进省事得多。把爬

选什么数据库?虫爬看数据长什么样。如果是数据数据结构固定的商品信息——标题、价格、放进销量、把爬链接,虫爬MySQL 或 PostgreSQL 都行。数据数据要是字段经常变,或者嵌套层级深,比如评论里还有回复,MongoDB 更省心。我自己的习惯:小项目直接 SQLite,一个文件搞定,不用装服务。数据量上了百万再换 PostgreSQL。

拿 Python 举例。假设你爬的是某本书的信息,用 requests + BeautifulSoup 拿到一个列表,每个元素是字典。先装驱动,MySQL 用 pymysql,PostgreSQL 用 psycopg2,MongoDB 用 pymongo。以 MySQL 为例:

import pymysql conn = pymysql.connect( host='localhost', user='root', password='你的密码', database='spider_data', charset='utf8mb4' ) cursor = conn.cursor() # 建表,只做一次 cursor.execute(''' CREATE TABLE IF NOT EXISTS books ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), price DECIMAL(10,2), url VARCHAR(500) ) ''') 

插入数据时,别用字符串拼接,SQL 注入不说,引号能把你逼疯。用参数化查询:

data = [ { 'title': 'Python编程', 'price': 59.9, 'url': 'http://example.com/1'}, { 'title': '爬虫实战', 'price': 45.0, 'url': 'http://example.com/2'} ] for item in data: cursor.execute( 'INSERT INTO books (title, price, url) VALUES (%s, %s, %s)', (item['title'], item['price'], item['url']) ) conn.commit() 

注意 commit()。不调用的话,数据只在事务里,连接一断就没了。我刚开始写爬虫时忘了这行,调试半小时才发现数据根本没进去。

批量插入比一条条快得多。数据量上千条时,用 executemany:

values = [(item['title'], item['price'], item['url']) for item in data] cursor.executemany( 'INSERT INTO books (title, price, url) VALUES (%s, %s, %s)', values ) conn.commit() 

MongoDB 更简单,不用建表。连上之后直接 insert_many:

from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client['spider_data'] collection = db['books'] collection.insert_many(data) 

但别高兴太早。爬虫数据经常有重复,比如翻页时同一本书出现两次。MySQL 里给 url 加唯一索引,插入时用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE。MongoDB 可以建唯一索引,或者插入前先查一下。我一般用 update_one 配合 upsert=True,有则更新,无则插入。

还有编码问题。中文标题存进去变成问号,多半是连接时没指定 charset='utf8mb4'。MySQL 的 utf8 是残废的,存不了 emoji,用 utf8mb4 才稳。

连接别开着不关。爬虫跑完,cursor.close() 和 conn.close() 写上。或者用 with 上下文管理器,省心。MongoDB 的 client 一般不用手动关,但长连接多了也占资源。

最后说个坑:爬虫速度太快,数据库写入跟不上,连接池爆了。加个 time.sleep(0.1) 或者用队列缓冲。我试过一次性插十万条,MySQL 直接卡死,后来改成每 500 条提交一次,世界安静了。

存库不是终点。数据进去之后,加索引、定期备份、写个定时任务清理旧数据。这些以后再说。先把第一条记录塞进去,你就成功了一半。

    热门排行

    友情链接