阅读 72

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) 复制代码

<Element html at 0x7f10a5417208> 复制代码

这里我们仅仅讲述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.


作者:Livingbody
链接:https://juejin.cn/post/7022251099121795079


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐