爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片

本文讲述了作者在尝试将大量微博图片数据存储到MySQL数据库中遇到的问题,包括BLOB类型限制、emoji编码、二进制数据存储、MySQL配置调整以及连接丢失等。通过修改表结构、使用base64编码图片、调整MySQL配置参数以及实现断线重连机制,最终成功完成数据存储。同时,作者还分享了个人博客链接供进一步交流。
摘要由CSDN通过智能技术生成

本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。同时欢迎加入社交媒体数据交流群:99918768

前言

  由于硬件等各种原因需要把大概170多万2t左右的微博图片数据存到Mysql中.之前存微博数据一直用的非关系型数据库mongodb,由于对Mysql的各种不熟悉,踩了无数坑,来来回回改了3天才完成。

挖坑填坑之旅

建表

存数据的时候首先需要设计数据库,我准备设计了3个表

微博表:[id, userid, blog_text, lat, lng, created_time, reserve]   pkey: id

图片表:[md5, pic_url, pic_bin, exif, reserve]   pkey: md5

关系表:[id, md5, reserve]   pkey: (id, md5)   fkey: (id, 微博表id)  (md5, 图片表md5)

  建表的时候别的问题都还好,主要是 pic_bin 的类型和 blog_text 的类型有很大的问题,首先是pic_bin的类型,开始设置的为BLOB,但是运行之后发现BLOB最大只能存1M的数据,并不能满足微博图片的存储,后改成MEDIUMBLOB(16M)基本能够满足要求了。再后来就是blog_text,我遇到的第一个大坑

  开始的时候很自然的设置blog_text的类型为TEXT,但跑起来发现有些数据存不进去,会报错,经筛查发现是有些微博文本中包含了emoji表情…随后找了很多资料发现是因为utf8下文字是三字节,但是emoji是四字节,需要将编码改成utf8mb4。然而我在mac上整mysql的配置文件报各种奇葩错误,一怒之下把TEXT改成了BLOB,就好了。因为本地是MAC,我要连接到远程的一台Windows上才能通过那个Windows连接到群晖的Mysql上…本地配置改了也白改。

存图片

  然后这就是一个大坑!!! 由于我使用的python3,所以读取图片得到的二进制的结果前面会有一个b’, 表示bytes,正是由于这个b’导致sql语句拼接的时候这个b后面的单引号会和sql语句的引号结合,导致后面的二进制没有在引号里面出错!二进制编码又不像string可以对字符转义,试了好多方法都不行!最后没有办法使用base64 对二进制进行加密转化成字符串,存到数据库中,然后要用时的时候再解密。

pic_bin = str(base64.b64encode(pic_bin))[2:-1]

改配置文件

  由于使用Python多进程,一个小时8G数据量,图片数据比较大,发包的时候回超过mysql的默认限制,出现Mysql server has gone away, 这个时候要改配置文件,在配置文件中参数

max_allowed_packet = 600M
wait_timeout = 60000

Lost connection to Mysql server during query

  程序跑着跑着总会出现这个错误,一直找原因,试了各种办法看了好多资料,一直都是错误。实在不知道什么原因了…后来一想,我管他什么原因,失去连接之后重新连接就行了。使用conn.Ping(True) 判断是否连接mysql成功。如果失去连接就重新连接就行了!最后解决了这个问题

代码实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Baoyi on 2017/10/16
from multiprocessing.pool import Pool

import pymysql
import requests
import json
import exifread
from io import BytesIO
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要安装 requests 和 BeautifulSoup 库来完成网页爬取;以及 mysql-connector-python 库来完成数据库连接和数据存储。 安装方式: ``` pip install requests pip install beautifulsoup4 pip install mysql-connector-python ``` 接下来,可以先编写一个爬取天气数据的函数,例如: ```python import requests from bs4 import BeautifulSoup def get_weather(city): url = f'http://www.weather.com.cn/weather/{city}.shtml' r = requests.get(url) r.encoding = 'utf-8' soup = BeautifulSoup(r.text, 'html.parser') # 获取天气信息 weather = soup.find('p', class_='wea').text.strip() # 获取温度信息 temp = soup.find('p', class_='tem').text.strip().replace('℃', '') # 获取风向风速信息 wind = soup.find('p', class_='win').text.strip() return weather, temp, wind ``` 其,city 参数为城市代码,在网站上可以找到对应的代码。 然后,可以编写一个函数来连接数据库并将数据存储数据,例如: ```python import mysql.connector def save_to_mysql(city, weather, temp, wind): # 连接数据库 conn = mysql.connector.connect( host='localhost', user='root', password='password', database='weather' ) # 创建游标 cursor = conn.cursor() # 插入数据 sql = "INSERT INTO weather (city, weather, temp, wind) VALUES (%s, %s, %s, %s)" val = (city, weather, temp, wind) cursor.execute(sql, val) # 提交事务 conn.commit() # 关闭连接 cursor.close() conn.close() ``` 其,需要先在数据创建名为 weather 的表格,用于存储天气数据。 最后,可以编写一个主函数来实现整个流程,例如: ```python if __name__ == '__main__': # 爬取天气数据 city = '101020100' # 北京市 weather, temp, wind = get_weather(city) # 存储数据库 save_to_mysql(city, weather, temp, wind) ``` 这样,就可以完成网页爬取天气数据并将数据存储mysql 数据的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值