爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片
来源:SegmentFault
时间:2023-01-27 12:12:28 462浏览 收藏
小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片》,就很适合你,本篇文章讲解的知识点主要包括MySQL、python、Ubuntu、javascript。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!
PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。同时欢迎加入社交媒体数据交流群:99918768)
挖坑填坑之旅
建表
存数据的时候首先需要设计数据库,我准备设计了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 import configparser import hashlib import logging import base64 # 配置logging logging.basicConfig(level=logging.WARNING, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='weibo.log', filemode='w') cf = configparser.ConfigParser() cf.read("ConfigParser.conf") # 读取配置mysql db_host = cf.get("mysql", "db_host") db_port = cf.getint("mysql", "db_port") db_user = cf.get("mysql", "db_user") db_pass = cf.get("mysql", "db_pass") db = cf.get("mysql", "db") # 创建连接 conn = pymysql.connect(host=db_host, user=db_user, passwd=db_pass, db=db, port=db_port, charset='utf8') # 获取游标 cursor = conn.cursor() # 创建insert_sql insert_blog_sql = ( "INSERT IGNORE INTO blog(userid, id, blog_text, lat, lng, created_time) VALUES('{uid}', '{id}','{blog_text}','{lat}','{lng}','{created_time}')" ) insert_pic_sql = ( "INSERT IGNORE INTO pics(pic_url, pic_bin, md5, exif) VALUES ('{pic_url}','{pic_bin}','{md5}','{exif}')" ) insert_relationship_sql = ( "INSERT IGNORE INTO relationship(id, md5) VALUES ('{id}','{md5}')" ) uid = [] with open('./data/final_id.txt', 'r') as f: for i in f.readlines(): uid.append(i.strip('\r\n')) # 处理图片数据 def handle_pic(pic_url): large_pic_url = pic_url.replace('thumbnail', 'large') large_bin = requests.get(large_pic_url) return large_bin.content def get_poiid_info(uid): try: url = 'https://api.weibo.com/2/statuses/user_timeline.json' load = { 'access_token': 'xxxxxxxxxx', 'uid': uid, 'count': 100, 'feature': 2, 'trim_user': 1 } get_info = requests.get(url=url, params=load, timeout=(10, 10)) if get_info.status_code != 200: logging.warning(ConnectionError) pass info_json = json.loads(get_info.content) info_json['uid'] = uid statuses = info_json['statuses'] # 处理筛选微博数据 for status in statuses: id = status['idstr'] if status['geo'] is not None: lat = status['geo']['coordinates'][0] lng = status['geo']['coordinates'][1] pic_urls = status['pic_urls'] # 判断是否在北京 if (115.7
撒一波广告
本人长期出售抓取超大量微博数据的代码,并提供微博数据打包出售,Message to YuboonaZhang@Yahoo.com
个人博客
今天关于《爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
-
467 收藏
-
303 收藏
-
176 收藏
-
368 收藏
-
475 收藏
-
266 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习