从零打造视频播放网站(1)-数据采集篇

news/2024/5/11 19:20:05/文章来源:https://blog.csdn.net/qq_40077167/article/details/90520630

数据采集篇

      • 1.数据库设计:
      • 2.环境:
      • 3.创建项目:
      • 4. settings.py
      • 5.爬虫编写:
      • 6.增量式爬虫:
      • 7.启动爬虫:
      • 8.总结:

1.数据库设计:

source表(播放源):

idnamedescparseshow
自增id播放源名称播放源描述解析url展示名

在这里插入图片描述

video表:

idtitledesctypeareathumbyeardirectorintroductionactors
视频id视频名称视频描述类型(1:电影,2:电视剧,3:综艺,4:动漫)地区缩略图年份导演简介演员

在这里插入图片描述

play表:

idvideo_idfromurlpart
自增id视频id(与video.id关联)播放源名称(与source.name关联)播放地址集数

在这里插入图片描述

2.环境:

  • python 3.6.6
  • 所用模块:
  1. scrapy:编写爬虫
  2. scrapy-redis:与scrapy结合实现增量式爬虫
  3. requests:发送post,get请求
  • windows7系统
  • mysql数据库:存储数据
  • redis数据库

3.创建项目:

scrapy startproject project_name

4. settings.py

LOG_LEVEL="WARNING"
USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'Scrapy_www_vultr1_com (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = False

5.爬虫编写:

初始化(连接数据库):

    def __init__(self):dict = {}dict["host"] = self.MYSQL_HOSTdict["port"] = self.MYSQL_PORTdict["user"] = self.MYSQL_USERdict["passwd"] = self.MYSQL_PWDdict["db"] = self.MYSQL_DBdict["use_unicode"]=Truedict["charset"]="utf8"self.db = MySQLdb.connect(**dict)#self.playerconfig()

处理响应:

    def parse(self, response):href_list = response.xpath("//ul[@class='stui-header__menu type-slide']/li/a/@href")[1:-1]for href in href_list:_type=re.search(r"v/(\d*).html",href.get()).group(1)yield scrapy.Request(self.domain+href.get(),callback=self.parse_item,meta={"type":_type})#处理专题def parse_item(self, response):a_list=response.xpath("//a[@class='stui-vodlist__thumb lazyload']/@href")for a in a_list:yield scrapy.Request(self.domain+a.extract(),callback=self.parse_detail,meta={"type": response.meta["type"]})#print(self.domain + a.extract() +"---已抓取")next_url = response.xpath("//ul[@class='stui-page text-center clearfix']/li/a[text()='下1页']/@href").extract_first(default="")last_url = response.xpath("//ul[@class='stui-page text-center clearfix']/li/a[text()='尾页']/@href").extract_first(default="")active_url=response.xpath("//ul[@class='stui-page text-center clearfix']/li[@class='hidden-xs active']/a/@href").extract_first(default="")if (next_url != None) and active_url!=last_url:#print("---------------------")print("next_url:"+self.domain + next_url + "---已抓取")yield scrapy.Request(self.domain + next_url, callback=self.parse_item,meta={"type":response.meta["type"]})else:print("数据已爬完.......")#处理详情页def parse_detail(self,response):item={}item["table"]="video"item["id"]=re.search(r"video/(\d*).html",response.request.url).group(1)item['thumb']=response.xpath("//img[@class='lazyload']/@src").get(default="")item['title']=response.xpath("//h1[@class='title']/text()").extract_first(default="")#item['type']=response.xpath("//p[@class='data ']/a/text()").extract_first()item["type"]=response.meta["type"]item['area']=response.xpath("//p[@class='data ']/text()[4]").extract_first(default="").replace('\t','')item['year'] = response.xpath("//p[@class='data ']/text()[6]").extract_first(default="").replace('\t','').replace('\r\n','')item['director']=response.xpath("//p[@class='data'][2]/a/text()").get(default="")item['introduction']=""sketch=response.xpath("//span[@class='detail-sketch']/text()")content=response.xpath("//span[@class='detail-content']/text()")if sketch:item['introduction'] +=sketch.get(default="")if content:item['introduction'] += sketch.get(default="")item['actors'] =""for s in response.xpath("//p[@class='data'][1]/a/text()"):item['actors']+=s.extract()+" "yield item#之后略#处理视频播放页def parse_play(self,response):item={}item["part"]=response.meta["part"]item["video_id"] = response.meta["video_id"]item["table"]="play"player_data=re.search(r"player_data=(.*?)</script>",response.text).group(1)player_data=json.loads(player_data)item["from"]=player_data["from"]item["url"]=player_data["url"]yield item

piplines(数据处理:存入数据库)

    def process_item(self, item, spider):#print(item)sql=""sql+="INSERT INTO "+item["table"]+" SET "item.pop("table")for k,v in item.items():if k=="id" or k=="video_id" or k=="part" or k=="type":sql += "`" + k + "`=" + v + ","else:sql+="`"+k+"`=\""+v+"\","sql=sql[:-1]#print(sql)cursor=spider.db.cursor()cursor.execute(sql)spider.db.commit()return item

6.增量式爬虫:

  • settings.py:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = TrueREDIS_URL="redis://127.0.0.1:6379" 
  • spider继承RedisSpider
  • redis数据库写入键值:
LPUSH spider_name:start_urls start_url

7.启动爬虫:

scrapy crawl spider_name

8.总结:

  • re.match与re.search区别:match是从字符串开头开始匹配,search则不是
  • response.xpath返回的是SelectorList ,是一个包含Selector的列表
class SelectorList(list):def getall(self):"""Call the ``.get()`` method for each element is this list and returntheir results flattened, as a list of unicode strings."""return [x.get() for x in self]extract = getalldef get(self, default=None):"""Return the result of ``.get()`` for the first element in this list.If the list is empty, return the default value."""for x in self:return x.get()else:return defaultextract_first = get
class Selector(object):def get(self):"""Serialize and return the matched nodes in a single unicode string.Percent encoded content is unquoted."""try:return etree.tostring(self.root,method=self._tostring_method,encoding='unicode',with_tail=False)except (AttributeError, TypeError):if self.root is True:return u'1'elif self.root is False:return u'0'else:return six.text_type(self.root)extract = getdef getall(self):"""Serialize and return the matched node in a 1-element list of unicode strings."""return [self.get()]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_868372.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马就业班(02.JavaWeb+项目实战\16.JavaWeb综合项目实战手把手学习)旅游网站项目(发现案例有问题!已修正)+浏览器页面代码调试(视频45-16.00)

本文对应项目&#xff1a;目录&#xff1a;G:\idea_java_project 下的travel项目本文参考资料《综合案例笔记》笔记 1、准备工作 项目导入 将资料的空travel项目导入IDEA中。&#xff08;注意导入项目的方法&#xff0c;选择的是pom.xml文件&#xff0c;参考视频1-4.00&#…

缓存、动态页面静态化、网站优化

一、缓存 缓存(Cache)技术在软件开发过程中有着广泛的用途, 它对提升软件性能和改善客户体验有很大帮助. 所谓缓存, 是指将那些经常重复的操作结果暂时存放起来, 在以后的执行过程中, 只要使用前面的暂存结果即可. 缓存技术在日常生活中随处可见, 就拿排队买票来说吧: 买票时需…

vs2008开发wap网站(一)

http://www.cnblogs.com/3stones/archive/2009/01/05/1351969.html 首先新创建个项目&#xff0c;打开VS2008&#xff0c;新建个网站项目&#xff0c;我们添加新项时会发现以前在vs2003或vs2005中的“移动Web窗体”项没有了&#xff0c;下图为vs2003和2005中的。 vs2008中就没…

关于spring 获取不到网站上的xsd的处理记录

前两天做一个项目还好好的&#xff0c;今天突然报出这个错误 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element mvc:annotation-driven 应该是xml文件找不到相应的xsd了&#xff0c;这时候我的springmvc.xml的头部是这么…

创建网站快捷方式

直接托那个图标就可以了

网站网页通用底部

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head> <meta charset"UTF-8"> <title>标题名</title> <style>*{margin:0px;padding:0px;box-sizing:border-box}body{margin:0 auto;font-size:12px;font-fam…

Linux系统中搭建LAMP动态博客网站

在新Web2.0革命中&#xff0c;博客是最早出现的&#xff0c;也被更多的人所了解。博客的中文有两重含义&#xff0c;既指撰写个人网络日志的人(Blogger)&#xff0c;也指承载个人网络日志的网站(Blog)。用全球最大博客网站Blogger.com的解释&#xff1a;“blog 可以是个人日记、…

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码 Lan 2020-05-12 10:06 190 人阅读 0 条评论 2020最新版高仿哔哩哔哩视频播放器网站源码&#xff0c;支持弹幕&#xff0c;演示链接&#xff1a;点击进入 可以用于视频cms使用 使用方法 &#xff1a;域名/?url 如…

给你的网站加上随机一句,一言API调用代码

给你的网站加上随机一句&#xff0c;一言API调用代码 Lan 2020-05-19 13:24 258 人阅读 0 条评论 这个接口由萌创团队开放的&#xff0c;文档地址&#xff1a;点击进入 引用代码&#xff1a; <div class"hitokoto" style"text-align: center;color: grey; …

大型网站架构演化过程(一)

1. 初始阶段的网站架构 小型网站访问量不大&#xff0c;所以一台服务器绰绰有余&#xff0c;这时网站架构如图1所示。 2. 随着网站的业务的发展&#xff0c;数据量越来越多&#xff0c;一台服务器不能满足需求的时候&#xff0c;越来越多的用户访问导致服务器的响应越来越慢&am…

大型网站架构演化过程(二)

本文接上篇文章&#xff1a;大型网站架构演化过程&#xff08;一 &#xff09; 3. 使用应用服务器集群改善网站的并发处理能力 使用集群是网站解决高并发&#xff0c;海量数据问题的常用手段。当一台服务器的存储空间不足hi抵抗并发压力时&#xff0c;不要企图去更换更强大的服…

大型网站架构演化过程(三)

上接:大型网站架构演化过程&#xff08;二&#xff09; 6.使用分布式文件系统和分布式数据库系统 我们都知道&#xff0c;任何强大的单一服务器都无法满足大型网站持续增长的业务需求。数据库经过读写分离后&#xff0c;从一台变成两台&#xff0c;但随着业务的发展依然无法满足…

网站优化篇

网站优化篇 最近公司要大力推广官方网站&#xff0c;但是发现不论是PC网站还是手机网站的打开响应速度都比较卡顿&#xff0c;而每个人都知道官方网站&#xff0c;一般是企业对外用户打造品牌&#xff0c;进行宣传的第一道门&#xff0c;如果用户访问网站时遇到了卡顿&#xff…

利用Asp来打包网站

如何利用asp来打包网站 一、遇到的权限问题。 我们在打包网站的时候经常会遇到权限问题。因为现在的虚拟主机的安全性不断的在提高&#xff0c;很多虚拟主机都禁用了WScript.shell。因为这个对象可以执行一些cmd命令&#xff0c;对虚拟主机的安全具有很大的威胁。记得前几…

使用JFreeChart 在网站中使用走势图

生活中我们经常用到各种图表&#xff0c;走势图就是其中的一种&#xff0c;例如&#xff1a;股票走势图&#xff0c;产品价格走势图&#xff0c;某个网站访问量走势图?D?D没错&#xff0c;现在网站中使用走势图也是越来越普遍了。因为网站本身是为了发布信息而存在的&#xf…

使用JFreeChart 在网站中使用走势图

生活中我们经常用到各种图表&#xff0c;走势图就是其中的一种&#xff0c;例如&#xff1a;股票走势图&#xff0c;产品价格走势图&#xff0c;某个网站访问量走势图?D?D没错&#xff0c;现在网站中使用走势图也是越来越普遍了。因为网站本身是为了发布信息而存在的&#xf…

网站跨站点单点登录

昨天和几位朋友探讨到了这个话题&#xff0c;发现虽然单点登录&#xff0c;或者叫做独立的passport登录虽然已经有了很多实现方法&#xff0c;但是能真正了解并实现的人却并不太多&#xff0c;所以些下此文&#xff0c;希望从原理到实现&#xff0c;能让大家了解的多一些 至于什…

网站跨站点单点登录

昨天和几位朋友探讨到了这个话题&#xff0c;发现虽然单点登录&#xff0c;或者叫做独立的passport登录虽然已经有了很多实现方法&#xff0c;但是能真正了解并实现的人却并不太多&#xff0c;所以些下此文&#xff0c;希望从原理到实现&#xff0c;能让大家了解的多一些 至于什…

最最最最基本的服务器网站维护防御攻略

最最最最基本的服务器网站维护防御攻略 由于最近网站服务器被暴力破解过一次导致数据库文件丢失被威胁过一次。 虽然好在本地有数据库备份成功备份没有太大影响&#xff0c;但是这不得不让我们开始留心服务器以及网站的安全方面有所欠缺。 经过一番学习以及交流讨论主要发现一…