Task5、静态、动态网站的区别和应对

您所在的位置:网站首页 电视台收视率是怎么看出来的 Task5、静态、动态网站的区别和应对

Task5、静态、动态网站的区别和应对

#Task5、静态、动态网站的区别和应对| 来源: 网络整理| 查看: 265

Task5、静态、动态网站的区别和应对 5.1、什么是静态网站、动态网站

静态网站的特点:

静态网站是最初的建站方式,浏览者所看到的每个页面是建站者上传到服务器上的一个 html ( htm )文件,这种网站每增加、删除、修改一个页面,都必须重新对服务器的文件进行一次下载上传。

网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件。

静态网页的内容相对稳定,因此容易被搜索引擎检索。

静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难。

静态网页的交互性较差,在功能方面有较大的限制。

通俗来说,静态网页是指存放在服务器文件系统中实实在在的HTML文件。当用户在浏览器中输入页面的URL,然后回车,浏览器就会将对应的HTML文件下载、渲染并呈现在窗口中。早期的网站通常都是由静态页面制作的。

动态网站的特点:

动态网站在页面里嵌套了程序,这种网站对一些框架相同、更新较快的信息页面进行内容与形式的分离,将信息内容以记录的形式存入网站的数据库中,以便于网站各处的调用。

动态网页是相对于静态网页而言的。当浏览器请求服务器的某个页面时,服务器根据当前时间、环境参数、数据库操作等动态的生成HTML页面,然后在发送给浏览器(后面的处理就跟静态网页一样了)。

很明显,动态网页中的“动态"是指服务器端页面的动态生成,相反,"静态"则指页面是实实在在的、独立的文件。

这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的 “ 动态效果 ” 没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。

从网站浏览者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看就有很大的差别。 动态网页的特点归纳如下:

动态网页以数据库技术为基础,可以大大降低网站维护的工作量 ;

采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等 ;

动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页 ;

注意:

动态页面技术是与静态页面技术相对应的,也就是说,网页URL的后缀不是 .htm、.html、.shtml、.xml等静态网页的常见形式,而是以.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号——“? "。

这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的“动态效果"没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。

再下一篇章具体详解如何应对动态页面,这是爬虫最重要也是将来做爬虫最常要面对的

举一个例子,像如下的页面,就是常见的静态页面+动态页面展示 1、红色框内的大部分页面文字展示其实是长期固定的,这里就采用了静态加载 2、蓝色框内的排名变动就是动态加载,后台会每隔一段时间动态变化

5.2、静态网站的解析流程

① 你要爬取的网站是什么?

首先,我们应该清楚你要爬去的网站是什么?

② 你要爬取页面上的哪些信息?

其次,你要确定你的需求是怎样的,不能盲目地去做所谓的爬虫,这只会浪费时间

③ 页面是 “静态网页”,还是“动态网页”?

我通俗地大白话的直接了当粗暴地说: 如果你请求某个网页,网页的信息是一次性给你的,那么它就是 “静态网页”。 如果你请求某个网页,网页中的信息,随着你鼠标往下滑动,而慢慢展现出来,那么它就是 “动态网页”,即 “Ajax技术”。

那么它们的区别就在于: 静态网页中的数据,是一次性给你。动态网页中的数据,是随着页面一步步加载出来,而逐步呈现的,也就是你用静态网页的爬虫技术,无法获取到里面所有的数据。

5.3、某电视收视率排行网站静态爬取实战 ① 你要爬取的网站是什么?

首先,我们应该清楚你要爬去的网站是什么?

由于这里我们想要爬取的是 “电视台收视率” 中的数据,因此我们可以打开这个网站看看(如图所示)。

网站链接:www.tvtv.hk/archives/ca…?

页面是由 page/2 表示第二页,当我们把2改为1时,自然跳转到第一页,便于后续爬多页,我们仍然以下链接准

这里是我们要的最终页面链接。👇👇待爬取链接:

www.tvtv.hk/archives/ca…

② 你要爬取页面上的哪些信息?

观察下图,可以清楚看到有哪些数据,下面还有页面信息。我们需要了解这些: 一个页面中共有多少条数据。这个很重要,后面可以帮你检查,是否爬取到了每个页面的所有信息。

这里我们获取的该页面中标题、发布时间、以及跳转链接

③ 页面是 “静态网页”,还是“动态网页”?

如果你请求某个网页,网页的信息是一次性给你的,那么它就是 “静态网页”。

如果你请求某个网页,网页中的信息,随着你鼠标往下滑动,而慢慢展现出来,那么它就是 “动态网页”,即 “Ajax技术”。

那么它们的区别就在于: 静态网页中的数据,是一次性给你。动态网页中的数据,是随着页面一步步加载出来,而逐步呈现的,也就是你用静态网页的爬虫技术,无法获取到里面所有的数据。

这里有一个很好 “检验” 是静态网页还是动态网页的方法,我给大家介绍一下 。

点击 “鼠标右键”,点击 “查看网页源代码”。

最终效果如下(部分截图):

这其实就是你请求这个网页,最终返回给你的信息。你要爬取的数据,如果在里面都能找到,大致可以判断是 “静态网页”,如果找不到,大致可以考虑是 “动态网页”。 怎么查找呢? 在上述页面,可以点击 “Ctrl + F”,调出搜索框(如图所示),你将网页中的数据,粘贴进来,看看能否都能被搜索到。

如何定位数据

在正式写代码之前,你肯定要知道,你想要用哪种方式,来帮你解析数据。常见的Python爬虫解析数据的方法有:re正则表达式、xpath、beautifulsoup、pyquery等。

本文采用的将会是xpath解析法。

点击 “鼠标右键”,再点击 “审查元素”。【或者直接按电脑上的F12键】

爬虫代码讲解 # ① 导入相关库 import pandas as pd # 用于数据存储 import requests # 用于请求网页 import chardet # 用于修改编码 import re # 用于提取数据 from lxml import etree # 解析数据的库 import time # 可以粗糙模拟人为请求网页的速度 import warnings # 忽略代码运行时候的警告信息 warnings.filterwarnings("ignore") # ② 请求一级页面的网页源代码 url = 'http://www.tvtv.hk/archives/category/tv' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} rqg = requests.get(url, headers=headers, verify=False) # a rqg.encoding = chardet.detect(rqg.content)['encoding'] # b html = etree.HTML(rqg.text) print(html)

这里我们仅仅讲述a、b两处。

在a处,有两个参数,一个是headers一个是verify。其中headers是一种反反扒的措施,让浏览器认为爬虫不是爬虫,而是人在用浏览器去正常请求网页。verify是忽略安全证书提示,有的网页会被认为是一个不安全的网页,会提示你,这个参数你记住就行。

在b处,我们已经获取到了网页的源码。但是由于网页源代码的编码方式和你所在电脑的解析方式,有可能不一致,返回的结果会导致乱码。此时,你就需要修改编码方式,chardet库可以帮你自动检测网页源码的编码(不懂得再下去研究一下这个库)。

# 3 解析页面网页中的信息 # 1. 标题 title = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/font/h2/a/@title') # 2. 发布时间 date = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/div/time/text()') # 3. 链接 link = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/font/h2/a/@href') print(title) print(date) print(link) ['2021年10月11日电视台收视率排行榜(上海东方卫视、江苏卫视、北京卫视)', '2021年10月10日电视台收视率排行榜(上海东方卫视、江苏卫视、浙江卫视)', '2021年10月9日电视台收视率排行榜(江苏卫视、浙江卫视、上海东方卫视)', '2021年10月8日电视台收视率排行榜(浙江卫视、北京卫视、上海东方卫视)', '2021年10月7日电视台收视率排行榜(浙江卫视、上海东方卫视、江苏卫视)', '2021年10月6日电视台收视率排行榜(北京卫视、上海东方卫视、江苏卫视)', '2021年10月5日电视台收视率排行榜(浙江卫视、上海东方卫视、北京卫视)', '2021年10月4日电视台收视率排行榜(江苏卫视、浙江卫视、北京卫视)', '2021年10月3日电视台收视率排行榜(上海东方卫视、江苏卫视、浙江卫视)', '2021年10月2日电视台收视率排行榜(浙江卫视、江苏卫视、上海东方卫视)', '2021年10月1日电视台收视率排行榜(浙江卫视、北京卫视、上海东方卫视)', '2021年9月30日电视台收视率排行榜(江苏卫视、北京卫视、上海东方卫视)', '2021年9月29日电视台收视率排行榜(浙江卫视、上海东方卫视、北京卫视)', '2021年9月28日电视台收视率排行榜(浙江卫视、上海东方卫视、湖南卫视)', '2021年9月27日电视台收视率排行榜(湖南卫视、浙江卫视、江苏卫视)', '2021年9月26日电视台收视率排行榜(上海东方卫视、江苏卫视、浙江卫视)', '2021年9月25日电视台收视率排行榜(浙江卫视、北京卫视、江苏卫视)', '2021年9月24日电视台收视率排行榜(浙江卫视、湖南卫视、江苏卫视)', '2021年9月23日电视台收视率排行榜(江苏卫视、浙江卫视、上海东方卫视)', '2021年9月22日电视台收视率排行榜(浙江卫视、江苏卫视、湖南卫视)'] ['2021-10-12', '2021-10-11', '2021-10-11', '2021-10-09', '2021-10-08', '2021-10-08', '2021-10-08', '2021-10-08', '2021-10-08', '2021-10-08', '2021-10-08', '2021-10-08', '2021-09-30', '2021-09-29', '2021-09-28', '2021-09-27', '2021-09-26', '2021-09-26', '2021-09-24', '2021-09-23'] ['http://www.tvtv.hk/archives/10586.html', 'http://www.tvtv.hk/archives/10583.html', 'http://www.tvtv.hk/archives/10580.html', 'http://www.tvtv.hk/archives/10577.html', 'http://www.tvtv.hk/archives/10574.html', 'http://www.tvtv.hk/archives/10571.html', 'http://www.tvtv.hk/archives/10568.html', 'http://www.tvtv.hk/archives/10565.html', 'http://www.tvtv.hk/archives/10562.html', 'http://www.tvtv.hk/archives/10559.html', 'http://www.tvtv.hk/archives/10556.html', 'http://www.tvtv.hk/archives/10553.html', 'http://www.tvtv.hk/archives/10549.html', 'http://www.tvtv.hk/archives/10545.html', 'http://www.tvtv.hk/archives/10542.html', 'http://www.tvtv.hk/archives/10539.html', 'http://www.tvtv.hk/archives/10536.html', 'http://www.tvtv.hk/archives/10533.html', 'http://www.tvtv.hk/archives/10530.html', 'http://www.tvtv.hk/archives/10526.html'] print(len(title)) print(len(date)) print(len(link)) # 确认数据是一一对应的,没有遗漏数据 20 20 20

4、翻页操作

随意复制几个不同页面的url,观察它们的区别。这里可以看到,也就page参数后面的数字不同,是第几页,数字就是几。

www.tvtv.hk/archives/ca… www.tvtv.hk/archives/ca… www.tvtv.hk/archives/ca…

x = "http://www.tvtv.hk/archives/category/tv/page/" url_list = [x + str(i) for i in range(1,11)] print(url_list) ['http://www.tvtv.hk/archives/category/tv/page/1', 'http://www.tvtv.hk/archives/category/tv/page/2', 'http://www.tvtv.hk/archives/category/tv/page/3', 'http://www.tvtv.hk/archives/category/tv/page/4', 'http://www.tvtv.hk/archives/category/tv/page/5', 'http://www.tvtv.hk/archives/category/tv/page/6', 'http://www.tvtv.hk/archives/category/tv/page/7', 'http://www.tvtv.hk/archives/category/tv/page/8', 'http://www.tvtv.hk/archives/category/tv/page/9', 'http://www.tvtv.hk/archives/category/tv/page/10'] 完整代码 import csv # 用于数据存储 import requests # 用于请求网页 import chardet # 用于修改编码 import re # 用于提取数据 from lxml import etree # 解析数据的库 import time # 可以粗糙模拟人为请求网页的速度 import warnings # 忽略代码运行时候的警告信息 warnings.filterwarnings("ignore") def get_data(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} rqg = requests.get(url, headers=headers, verify=False) # a rqg.encoding = chardet.detect(rqg.content)['encoding'] # b html = etree.HTML(rqg.text) # 1. 标题 title = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/font/h2/a/@title') # 2. 发布时间 date = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/div/time/text()') # 3. 链接 link = html.xpath('//header[@class="entry-header"]/table/tbody/tr/td[2]/font/h2/a/@href') return title, date, link def main(): x = "http://www.tvtv.hk/archives/category/tv/page/" url_list = [x + str(i) for i in range(1,11)] headers = ['标题','发布时间','链接'] values = [] titles = [] dates = [] links = [] for url in url_list: print('>> 正获取: ',url) title, date, link = get_data(url) for t in title: titles.append(t) for d in date: dates.append(d) for l in link: links.append(l) time.sleep(3) # 加时间延迟,减少访问频率 for i in range(len(titles)): value = [titles[i],dates[i],links[i]] values.append(value) with open('电视台.csv','w',newline='') as fp: # 获取对象 writer = csv.writer(fp) # 写入数据 writer.writerow(headers) #写入表头 writer.writerows(values) # 写入数据 if __name__=='__main__': main() >> 正获取: http://www.tvtv.hk/archives/category/tv/page/1 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/2 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/3 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/4 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/5 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/6 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/7 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/8 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/9 >> 正获取: http://www.tvtv.hk/archives/category/tv/page/10 Task5、作业

目标网站:www.tvtv.hk/archives

目标:只需要通过获取htm文件提取文本内容即可,保存方式建议excel、csv

!! 温馨提示,该项目只作为练习,切勿做出对目标网站有所压力的行为

import csv # 用于数据存储 import requests # 用于请求网页 import chardet # 用于修改编码 import re # 用于提取数据 from lxml import etree # 解析数据的库 import time # 可以粗糙模拟人为请求网页的速度 import warnings # 忽略代码运行时候的警告信息 warnings.filterwarnings("ignore") def get_data(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} rqg = requests.get(url, headers=headers, verify=False) # a rqg.encoding = chardet.detect(rqg.content)['encoding'] # b html = etree.HTML(rqg.text) # 1. 标题 title = html.xpath('//*[@id="main"]/article/div/ul/li/a/text()') # 2. 发布时间 date = html.xpath('//*[@id="main"]/article/div/ul/li/text()') # 3. 链接 link = html.xpath('//*[@id="main"]/article/div/ul/li/a/@href') return title, date, link def main(): url = "http://www.tvtv.hk/archives" headers = ['标题','发布时间','链接'] values = [] titles = [] dates = [] links = [] print('>> 正获取: ',url) title, date, link = get_data(url) for t in title: titles.append(t) for d in date: dates.append(d.strip(':')) for l in link: links.append(l) time.sleep(3) # 加时间延迟,减少访问频率 for i in range(len(titles)): value = [titles[i],dates[i],links[i]] values.append(value) with open('电视台按月查询收视率.csv','w',newline='') as fp: # 获取对象 writer = csv.writer(fp) # 写入数据 writer.writerow(headers) #写入表头 writer.writerows(values) # 写入数据 print(f"已写入{len(title)}条记录") if __name__=='__main__': main() >> 正获取: http://www.tvtv.hk/archives 已写入40条记录 !cat 电视台按月查询收视率.csv 标题,发布时间,链接 2021年10月20日电视剧收视率排行榜(功勋、你是我的城池营垒),10月21日:,http://www.tvtv.hk/archives/10618.html 2021年10月20日综艺节目收视率排行榜(大戏看北京、今晚、最强大脑),10月21日:,http://www.tvtv.hk/archives/10617.html 2021年10月20日电视台收视率排行榜(上海东方卫视、江苏卫视、北京卫视),10月21日:,http://www.tvtv.hk/archives/10616.html 2021年10月19日电视剧收视率排行榜(功勋、第十二秒),10月20日:,http://www.tvtv.hk/archives/10614.html 2021年10月19日综艺节目收视率排行榜(一站到底青创纪、今晚、生命缘),10月20日:,http://www.tvtv.hk/archives/10613.html 2021年10月19日电视台收视率排行榜(江苏卫视、上海东方卫视、浙江卫视),10月20日:,http://www.tvtv.hk/archives/10612.html 2021年10月18日电视剧收视率排行榜(功勋、第十二秒),10月19日:,http://www.tvtv.hk/archives/10611.html 2021年10月18日综艺节目收视率排行榜(一站到底青创纪、暖暖的新家、中餐厅),10月19日:,http://www.tvtv.hk/archives/10610.html 2021年10月18日电视台收视率排行榜(上海东方卫视、江苏卫视、北京卫视),10月19日:,http://www.tvtv.hk/archives/10609.html 2021年10月17日电视剧收视率排行榜(功勋、大决战),10月18日:,http://www.tvtv.hk/archives/10608.html 2021年10月17日综艺节目收视率排行榜(我们的歌、追梦人无界人生、向前一步),10月18日:,http://www.tvtv.hk/archives/10607.html 2021年10月17日电视台收视率排行榜(上海东方卫视、江苏卫视、浙江卫视),10月18日:,http://www.tvtv.hk/archives/10606.html 2021年10月16日综艺节目收视率排行榜(非诚勿扰、嗨放派、打卡吧吃货团、我们的歌),10月18日:,http://www.tvtv.hk/archives/10605.html 2021年10月16日电视剧收视率排行榜(功勋、大决战),10月18日:,http://www.tvtv.hk/archives/10604.html 2021年10月16日电视台收视率排行榜(江苏卫视、浙江卫视、上海东方卫视),10月18日:,http://www.tvtv.hk/archives/10603.html 2021年10月15日综艺节目收视率排行榜(中国好声音巅峰之夜、申学记、夏日少年派2021、京城十二时辰),10月18日:,http://www.tvtv.hk/archives/10602.html 2021年10月15日电视剧收视率排行榜(功勋、大决战),10月18日:,http://www.tvtv.hk/archives/10601.html 2021年10月15日电视台收视率排行榜(浙江卫视、北京卫视、上海东方卫视),10月18日:,http://www.tvtv.hk/archives/10600.html 2021年10月14日电视剧收视率排行榜(功勋、大决战),10月15日:,http://www.tvtv.hk/archives/10599.html 2021年10月14日综艺节目收视率排行榜(最强大脑、今晚、我是大医生),10月15日:,http://www.tvtv.hk/archives/10598.html 2021年10月14日电视台收视率排行榜(上海东方卫视、北京卫视、江苏卫视),10月15日:,http://www.tvtv.hk/archives/10597.html 2021年10月13日电视剧收视率排行榜(功勋、大决战),10月14日:,http://www.tvtv.hk/archives/10596.html 2021年10月13日综艺节目收视率排行榜(大戏看北京、今晚、最强大脑),10月14日:,http://www.tvtv.hk/archives/10594.html 2021年10月13日电视台收视率排行榜(上海东方卫视、北京卫视、江苏卫视),10月14日:,http://www.tvtv.hk/archives/10593.html 2021年10月12日电视剧收视率排行榜(功勋、婆婆的镯子),10月13日:,http://www.tvtv.hk/archives/10592.html 2021年10月12日综艺节目收视率排行榜(一站到底青创纪、今晚、生命缘),10月13日:,http://www.tvtv.hk/archives/10591.html 2021年10月12日电视台收视率排行榜(上海东方卫视、江苏卫视、北京卫视),10月13日:,http://www.tvtv.hk/archives/10590.html 2021年10月11日电视剧收视率排行榜(功勋、婆婆的镯子、燃烧大地),10月12日:,http://www.tvtv.hk/archives/10588.html 2021年10月11日综艺节目收视率排行榜(一站到底青创纪、今晚、暖暖的新家),10月12日:,http://www.tvtv.hk/archives/10587.html 2021年10月11日电视台收视率排行榜(上海东方卫视、江苏卫视、北京卫视),10月12日:,http://www.tvtv.hk/archives/10586.html 2021年10月10日电视剧收视率排行榜(功勋、大决战),10月11日:,http://www.tvtv.hk/archives/10585.html 2021年10月10日综艺节目收视率排行榜(我们的歌、蒙面舞王、向前一步),10月11日:,http://www.tvtv.hk/archives/10584.html 2021年10月10日电视台收视率排行榜(上海东方卫视、江苏卫视、浙江卫视),10月11日:,http://www.tvtv.hk/archives/10583.html 2021年10月9日综艺节目收视率排行榜(非诚勿扰、嗨放派、打卡吧吃货团、我们的歌),10月11日:,http://www.tvtv.hk/archives/10582.html 2021年10月9日电视剧收视率排行榜(功勋、大决战),10月11日:,http://www.tvtv.hk/archives/10581.html 2021年10月9日电视台收视率排行榜(江苏卫视、浙江卫视、上海东方卫视),10月11日:,http://www.tvtv.hk/archives/10580.html 2021年10月8日电视剧收视率排行榜(功勋、大决战),10月9日:,http://www.tvtv.hk/archives/10579.html 2021年10月8日综艺节目收视率排行榜(中国好声音、京城十二时辰、中餐厅、夏日少年派2021),10月9日:,http://www.tvtv.hk/archives/10578.html 2021年10月8日电视台收视率排行榜(浙江卫视、北京卫视、上海东方卫视),10月9日:,http://www.tvtv.hk/archives/10577.html 2021年10月7日电视剧收视率排行榜(功勋、婆婆的镯子、大决战),10月8日:,http://www.tvtv.hk/archives/10576.html


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3