文章目录

  • 1 构建Item
    • 1.1 创建Item
    • 1.2 获取目标内容
    • 1.3 解析数据接口
    • 1.4 封装Item
  • 2 存储
    • 2.1 mysql
    • 2.2 pipelines
  • 3 测试
  • 4 后记

1 构建Item

​ 在上一篇文章视频网站视频详情页-视频网站-实践-scrapy框架 中我们已经明确了要爬取的内容,下面我们要具体实现内容的抓取。

1.1 创建Item

这里给出Item类源代码如下:

from scrapy import Item, Fieldclass XpcWorkItem(Item):# 网页idarticle_id = Field()# 视频idmedia_id = Field()# 信息urlinfo_url = Field()# 标题title = Field()# 视频appKeyapp_key = Field()# 视频源地址video_url = Field()# 封面cover = Field()# 分类category = Field()# 描述description = Field()# 点赞likes = Field()# 收藏collections = Field()# 播放量play_counts = Field()# 发布时间publish_time = Field()# 发布地址ip_location = Field()

1.2 获取目标内容

  • 分析:

    • 页面内容:我们想要获取的内容,一部分可以在页面上直接找到,比如标题,分类,发布时间等;
    • 非页面内容:比如视频源url地址,article_id等,这些需要动态获取。
  • 寻找动态获取地址:
    • 首先打开f12切换到network标签页,刷新详情页,图示:

    • 只有在图示请求地址响应中我们又我们想要的部分内容,那么还有没有更全的响应内容呢?

    • 详情页右键->查看网页源代码,搜索appKey相关内容,我们发现图示:

    • 我们所需的关于改视频的内容这里都有,这部分内容包含在script标签呢,那么我们下面是直接通过抓取内容呢 还是在看看,有没有更好的方式获取

    • 通过查找,我们发现这些数据是通过这个接口获取的https://app.xinpianchang.com/article/%s:%s为之前我们获取的每个视频唯一标识-aid

1.3 解析数据接口

之前我们已经解析了详情页的地址,下面我们继续通过详情页响应来解析出数据接口地址,源码如下:

    def parse_item(self, response, aid):yield Request('https://app.xinpianchang.com/article/%s' % aid, callback=self.parse_data, headers=self.headers)

1.4 封装Item

数据接口解析之后,下一步继续解析数据,并封装,先查看下接口响应,如下图:

对比发现,其中发布时间响应数据是10位秒为单位的数字,而我们一般会转换为2020-10-06 18:36:00这种各种的时间字符串传递给数据库处理。索引我们通过ItemLoader来构建Item,代码如下:

from time import time, strftime, localtimefrom itemloaders.processors import TakeFirst, MapCompose
from scrapy.loader import ItemLoaderdef time_sec2str(sec):'''数字时间(10位秒为单位)转换为时间字符串:param sec: 秒:return:    时间字符串'''print(sec, '='*10)if not sec:return strftime('%Y-%m-%d %H:%M:%S', time())return strftime('%Y-%m-%d %H:%M:%S', localtime(sec))class XpcWorkLoader(ItemLoader):default_output_processor = TakeFirst()publish_time_out = MapCompose(time_sec2str)
  • strftime:时间转换函数,时间戳转为指定格式的时间字符串
  • TakeFirst():取列表的第一项
  • MapCompose:组合

如果对ItemLoader还有啥问题,具体可以查看官方文档或者自行搜索。

ItemLoader搞定了,下面开始封装Item,代码如下:

    def parse_data(self, response):# 产品对象加载器il = XpcWorkLoader(item=XpcWorkItem(), response=response)# 响应数据转换为jsonret = json.loads(response.text)# print(ret['data'])# 设置产品对象字段# #idil.add_value('article_id', ret['data']['id'])# #视频idil.add_value('media_id', ret['data']['media_id'])# #信息urlil.add_value('info_url', 'https://app.xinpianchang.com/article/%s' % ret['data']['id'])# #视频标题il.add_value('title', ret['data']['title'])# #视频appKeyil.add_value('app_key', ret['data']['video']['appKey'])# #视频源地址il.add_value('video_url', ret['data']['video']['content']['progressive'][0]['url'])# #封面il.add_value('cover', ret['data']['cover'])# #分类cat0 = ret['data']['categories'][0]il.add_value('category', cat0['category_name'] + '-' + cat0['sub']['category_name'])# #描述il.add_value('description', ret['data']['content'])# #点赞il.add_value('likes', ret['data']['count']['count_like'])# #收藏il.add_value('collections', ret['data']['count']['count_collect'])# #播放量il.add_value('play_counts', ret['data']['count']['count_view'])# #发布时间il.add_value('publish_time', ret['data']['publish_time'])# #发布地址il.add_value('ip_location', ret['data']['ip_location'])return il.load_item()

2 存储

数据有了,下面我们将数据存入数据库,方便其他系统调用,这里我们选择mysql数据库。

2.1 mysql

​ 数据库建库、建表等这里不再赘述,如果有相关问题,可以下面评论留言或者自行查阅相关内容,效果图示:

2.2 pipelines

数据库、表已经创建好了,下面我们需要吧数据存入数据库,需要通过pipeline(管道),代码如下:

import pymysqlclass XpcMysqlPipeline:def __init__(self, host, port, db, user, password):self.host = hostself.port = portself.db = dbself.user = userself.password = password@classmethoddef from_crawler(cls, crawler):return cls(host=crawler.settings.get('MYSQL_HOST', '127.0.0.1'),port=crawler.settings.get('MYSQL_PORT', 3306),db=crawler.settings.get('MYSQL_DB'),user=crawler.settings.get('MYSQL_USER', 'root'),password=crawler.settings.get('MYSQL_PASSWORD', 'root'))def open_spider(self, spider):self.conn = pymysql.connect(host=self.host,port=self.port,db=self.db,user=self.user,password=self.password)self.cur = self.conn.cursor()def close_spider(self, spider):self.cur.close()self.conn.close()def process_item(self, item, spider):keys = item.keys()values = list(item.values())sql = 'insert into video_show({}) values ({}) '.format(','.join(keys),','.join(['%s'] * len(values)))# sql = 'insert into blog(title, publish, approval, unlike, `comment`, collection) values (%s, %s, %s, %s,# %s, %s)'# sql_exe = sql % tuple(val for val in values)# print(sql_exe, '='*10)self.cur.execute(sql, values)self.conn.commit()# print(self.cur._last_executed)return item
  • 为了后续在添加字段时,不在改动代码,这么我们没有把实际的字段名传入,而是通过字符串模板的方式实现,具体见process_item方法

  • 我们把数据库配置信息,放置在settings.py中(具体数值改为自己的),代码如下

    # mysql数据库配置
    MYSQL_HOST = '127.0.0.1'
    MYSQL_PORT = 3306
    MYSQL_DB = 'py_scrapy_xpc'
    MYSQL_USER = 'root'
    MYSQL_PASSWORD = 'root'
    MYSQL_CHARSET = 'utf-8'
  • 构建了pipelines之后,需要在settings.py中开启(具体名称改为自己的),代码如下:

    ITEM_PIPELINES = {'xpc.pipelines.XpcMysqlPipeline': 300,
    }
    

3 测试

​ 其他的测试我们这里不详述了,这里只展示下数据库中内容,图示:

4 后记

如果有问题欢迎留言和交流,下面为联系方式和仓库源代码地址。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/python-study.git

02数据存入数据库-视频网站-实践-scrapy框架-python相关推荐

  1. 网站视频详情页-网站-实践-scrapy框架

    文章目录 1 创建项目 2 目标内容 3 Spider初始化 3.1 域名起始页 3.2 起始页跳转详情页 4 测试 4.1 robots.txt报错 4.2 设置header 5 后记 1 创建项目 ...

  2. 把爬取信息导出到mysql,关于爬虫学习的一些小小记录(四)——爬取数据存入数据库...

    关于爬虫学习的一些小小记录(四)--爬取数据存入数据库 创建数据库 pymysql 模块 具体操作 预知后事如何 前面我们已经讲了怎么访问网页,并且从网页源码中提取数据.既然数据有了,怎样管理就是下一 ...

  3. python爬取微博数据存入数据库_Python爬取微博数据并存入mysql,excel中

    寒假期间做微博数据统计,由于是部门要求,也没办法,自己又是一个懒人,直接用python实现吧.写的很粗糙,也很差,请大家别介意. 总的来说分成两个模块:一个爬取微博数据存入数据库,一个从数据库调取数据 ...

  4. python爬取新闻存入数据库_python爬取数据存入数据库

    昨天本来写了一篇关于python爬取的文章,结果没通过,正好今天一起吧.用python同时实现爬取,和存入数据库,算是复习一下前面操作数据库的知识. 1.准备工作 既然是爬取,那自然要连接到爬取的页面 ...

  5. python爬取InterfaceLIFT壁纸,下载到本地,数据存入数据库(mysql,mongodb)

    github地址 欢迎star,欢迎拍砖 适用pythopn版本 Python 2.7 or Python 3.6 只在这两个版本之下测试过,正常运行 项目文件说明 main.py 主要文件 mysq ...

  6. 爬虫小案例-爬取当当网TOP500的图书并将数据存入数据库

    在这里分享一个刚刚学习爬虫时自己做的一个小案例,爬取了当当网TOP500的图书信息,包括图书名称.作者名称和出版社的名称. 1.分析网页 url:http://bang.dangdang.com/bo ...

  7. 利用python+scrapy+mysql爬取虎扑NBA球员数据存入数据库

      大家好,这是我的第一篇博客,写的不好请见谅. 小编是个多年的NBA观众,最近正值季后赛的比赛,闲来无事,突发奇想,想利用刚刚所学的python著名爬虫框架scrapy采集一下全NBA的球员基本信息 ...

  8. Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据

    First:创建项目:执行下面三句命令: 1. scrapy startproject zhilianzhaopin2. cd zhilianzhaopin3.scrapy genspider zhi ...

  9. 实战:爬取数据存入数据库并做可视化分析

    本文选用天气预报数据作为本次文章的主题. 本文大致思维:首先登录网站,查看网页内容及数据格式(使用代码查看内容),选择两个城市及对应月份,爬取对应天气数据,进行数据预处理(如缺失值处理.数据类型转换. ...

最新文章

  1. hive外部表改为内部表_3000字揭秘Greenplum的外部数据加载——外部表
  2. 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制...
  3. 32位PLSQL Developer无法登录Oracle 11g 64位
  4. Linux系统安全加固策略(二)
  5. Oracle技巧集锦
  6. oracle 日期改字符格式_oracle 日期转换格式
  7. LitJson写入中文乱码问题
  8. ftp扫描工具下载,ftp扫描下载工具到底该怎么选择?
  9. 如何搭建自己的网站别人可以直接访问
  10. SpinLock 锁实现
  11. Java毕设项目超市进销存管理系统计算机(附源码+系统+数据库+LW)
  12. 程序员必备十款开发工具,会用的可以召唤神龙了!
  13. 多语言应用性能监控系统:Elastic APM
  14. 拼多多代发商如何一件代发自动下单?
  15. 北风设计模式课程---里氏代换原则
  16. 用mysql设计学籍管理系统_学生学籍管理系统(SQL数据库系统设计)(完整版).pdf...
  17. PX4使用手册-自主避障-ObstacleAvoidance
  18. 免费论文翻译网站——通天塔
  19. python最优解集_python求最优解的集中算法
  20. lacp可以在access接口吗_LACP 链路汇聚控制协议

热门文章

  1. 腾讯计划推出搜狗输入法鸿蒙版;全球首款Web3手机售价2.38万起,全球预约人数超20万|极客头条
  2. 酒店工作者学Java逆袭薪资从6k涨到14k
  3. Spring中所使用的设计模式
  4. MySQL prepare预编译
  5. 信息学奥赛一本通(1168:大整数加法)
  6. 虚拟机ping不通网关之大坑
  7. 研究基于PX4平台的Ardupilot代码工程的makefile结构
  8. [課程筆記] 機器學習2021(李弘毅) L32.概述增強式學習(四)
  9. 【翻译】比较Pgpool-II和PgBouncer
  10. ABC281 E - Least Elements