需要学习的地方,使用官方组件下载图片的用法,保存item到MySQL数据库

需要提前创建好MySQL数据库,根据item.py文件中的字段信息创建相应的数据表

1.items.py文件

  1. from scrapy import Item,Field
  2.  
  3. class Images360Item(Item):
  4. # MongoDB数据库的表名和MySQL数据库的表名
  5. collection = table = 'images'
  6. id = Field()
  7. url = Field()
  8. title = Field()
  9. thumb = Field()

2.settings.py文件

  1. ITEM_PIPELINES = {
  2. 'images360.pipelines.ImagesPipeline': 300,
  3. 'images360.pipelines.MongoPipeline': 301,
  4. 'images360.pipelines.MySQLPipeline': 302,
  5. }
  6.  
  7. # MongoDB数据库参数
  8. MONGO_URI = '127.0.0.1'
  9. MONGO_DATABASE = 'images360'
  10.  
  11. # 图片保存路径
  12. IMAGES_STORE = 'D:\\images360\\images'
  13.  
  14. # MySQL数据库参数
  15. MYSQL_HOST = '127.0.0.1'
  16. MYSQL_DATABASE = 'images360'
  17. MYSQL_USER = 'root'
  18. MYSQL_PASSWORD = 'root'
  19. MYSQL_PORT = 3306

3.pipeline.py文件

  1. import pymongo
  2. import pymysql
  3. from scrapy import Request
  4. from scrapy.exceptions import DropItem
  5. from scrapy.pipelines.images import ImagesPipeline
  6.  
  7. # 下载项目图片
  8. class ImagesPipeline(ImagesPipeline):
  9. def file_path(self, request, response=None, info=None):
  10. url = request.url
  11. filename = url.split('/')[-1]
  12. return filename
  13.  
  14. def item_completed(self, results, item, info):
  15. image_paths = [x['path'] for ok, x in results if ok]
  16. if not image_paths:
  17. raise DropItem("Image Downloaded Failed")
  18. return item
  19.  
  20. def get_media_requests(self, item, info):
  21. yield Request(item['url'])
  22.  
  23. # 保存到MongoDB数据库
  24. class MongoPipeline(object):
  25. # 数据表名
  26. collection_name = 'scrapy_items'
  27.  
  28. def __init__(self, mongo_uri, mongo_db):
  29. self.mongo_uri = mongo_uri
  30. self.mongo_db = mongo_db
  31.  
  32. @classmethod
  33. # 从settings.py文件中获取参数
  34. def from_crawler(cls, crawler):
  35. return cls(
  36. mongo_uri=crawler.settings.get('MONGO_URI'),
  37. mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') # 数据库名
  38. )
  39.  
  40. def open_spider(self, spider):
  41. self.client = pymongo.MongoClient(self.mongo_uri)
  42. self.db = self.client[self.mongo_db]
  43.  
  44. def close_spider(self, spider):
  45. self.client.close()
  46.  
  47. def process_item(self, item, spider):
  48. self.db[item.collection].insert_one(dict(item)) # 从items.py文件中获取表名
  49. return item
  50.  
  51. # 保存数据到MySQL数据库
  52. class MySQLPipeline(object):
  53. def __init__(self, host, database, user, password, port):
  54. self.host = host
  55. self.database = database
  56. self.user = user
  57. self.password = password
  58. self.port = port
  59.  
  60. @classmethod
  61. def from_crawler(cls, crawler):
  62. return cls(
  63. host=crawler.settings.get('MYSQL_HOST'),
  64. database=crawler.settings.get('MYSQL_DATABASE'),
  65. user=crawler.settings.get('MYSQL_USER'),
  66. password=crawler.settings.get('MYSQL_PASSWORD'),
  67. port=crawler.settings.get('MYSQL_PORT'),
  68. )
  69.  
  70. def open_spider(self, spider):
  71. self.db = pymysql.connect(self.host, self.user, self.password, self.database, charset='utf8', port=self.port)
  72. self.cursor = self.db.cursor()
  73.  
  74. def close_spider(self, spider):
  75. self.db.close()
  76.  
  77. def process_item(self, item, spider):
  78. data = dict(item)
  79. keys = ', '.join(data.keys())
  80. values = ', '.join(['%s'] * len(data))
  81. sql = 'insert into %s (%s) values (%s)' % (item.table, keys, values)
  82. self.cursor.execute(sql, tuple(data.values()))
  83. self.db.commit()
  84. return item

使用官方组件下载图片,保存到MySQL数据库,保存到MongoDB数据库的更多相关文章

  1. Scrapy Item用法示例(保存item到MySQL数据库,MongoDB数据库,使用官方组件下载图片)

    需要学习的地方: 保存item到MySQL数据库,MongoDB数据库,下载图片 1.爬虫文件images.py # -*- coding: utf-8 -*- from scrapy import ...

  2. mysql数据库和mongodb数据库的相关操作以及两个数据库的区别

    在docs命令中执行数据操作 MySQL数据库 先启动MySQL服务器  net start mysql 进入MySQL服务器MySQL -uroot -p(这里写你的数据库密码) (-P是从哪个端口 ...

  3. php将图片以二进制保存到mysql数据库并显示

    一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...

  4. Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:

    创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...

  5. Unity WWW下载图片并保存到Unity的Assets下

    1.新建一个UGUI的Image. 2.新建一个脚本wwwTest.cs: using System.Collections; using System.Collections.Generic; us ...

  6. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  7. 微信昵称有特殊符号怎么保存到mysql库里?

    微信昵称有特殊符号怎么保存到mysql库里? mysql库怎么保存emoji表情? 这里提供 1 种稳妥有效的方法: // 入库之前,使用 Base64 编码 String nickname = re ...

  8. Asp.net Session 保存到MySql中

    一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...

  9. pandas对象保存到mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法

    问题 将DataFrame数据保存到mysql中时,出现错误提示: BLOB/TEXT column used in key specification without a key length 原因 ...

随机推荐

  1. Lua 跟 C++ 的交互

    Lua 和 C++ 是这样交互的 乱七八糟的前戏: 1. 到官网下载 Lua 文件  可參考 ->  Lua 下载与配置 2. 设置环境  可參考  ->  VS 配置Lua环境 交互过程 ...

  2. [DB][MySql]关于取得自增字段的值、及@@IDENTITY 与并发性问题

    对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑.MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢? 主要有下面几 ...

  3. sql server中数据约束相关的查询

    根据表名查找数据约束 SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'CMS_EventLog'; SEL ...

  4. 解决无线网卡 RTL8723BE ubuntu环境下不稳定情况

    jiqing@ThinkPad:~$ lspci | grep -i net 00:19.0 Ethernet controller: Intel Corporation Ethernet Conne ...

  5. 在IIS上搭建WebSocket服务器(二)

    服务器端代码编写 1.新建一个ASP.net Web MVC5项目 2.新建一个“一般处理程序” 3.Handler1.ashx代码如下: using System; using System.Col ...

  6. POJ3420 递推+矩阵快速幂

    POJ3420 很有趣的覆盖问题 递归推导如下: f[n] = f[n-1] + 4*f[n-2] + 2 * [ f[n-3] + f[n-5] + f[n-7] +.... ] + 3 *  [ ...

  7. Android开发之Thread类分析 (转载)

    转自:http://blog.csdn.net/llping2011/article/details/9706599 在我们Linux系统中创建线程函数为:pthread_create(),在Andr ...

  8. Nginx 配置https请求

    通过阿里云生成指定的https证书文件xxxx.key 和 xxxx.pem文件 在阿里云上申请的https证书的是pem格式,转成cer 先在终端cd到文件目录下 然后 openssl x509 - ...

  9. Codeforces 825D 二分贪心

    题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t ...

  10. nginx入门学习

    1.yum解决编译nginx所需的依赖包,之后你的nginx就不会报错了 yum install gcc patch libffi-devel python-devel zlib-devel bzip ...