划水‍♂️!好耶!

果然还是逃不过作业,初三刚过就要营业

审题

爬虫+算法:划水中的员工

员工 A 此刻内心一酸,大年初一加班惨绝人寰,情不自禁打开 B 站,跟着网友一起划水看番。

但是由于技术故障原因番没了,员工 A 心态差点爆炸,刚好有个 Up 主疯狂掉粉几十万引起了他的注意,掉得他内心莫名舒坦,但是他想起自己还要工作不能实时查看粉丝数,于是他准备把这个工作交给下属。

他交代下属:将某个 Up 主的粉丝数用爬虫的方法抓取下来,并且每小时重新爬取一次,可视化出来。

当然,除此之外,他还想知道多个 Up 主之间粉丝的重合度,请选三个 Up 主,爬取其粉丝,用合理的算法给出大致正确的重合度,给出算法时间复杂度,估计算法所用的空间内存。

要做什么:

  • 任务一:

    1. 爬! 一个up主的粉丝数
    2. 设定每个小时爬一次
    3. 记录每次粉丝数画图
  • 任务二:

    1. 爬三个Up主粉丝数据
    2. 相互对比算出重合度
    3. 给出算法时间复杂度
    4. 估计空间内存(什么登西)

任务一

1、获取up主粉丝数

据网上可靠消息up主粉丝数就藏在

https://api.bilibili.com/x/relation/stat?vmid= + 一串神奇数字(uid) + &jsonp=jsonp

的里面

为了挖掘宝藏需要安装一波requests

安装requests

pip install requests

代码

import requests as req
import time
def fans(uid):
uid = str(uid)
url = "https://api.bilibili.com/x/relation/stat?vmid=" + uid + "&jsonp=jsonp"
resp = req.get(url)
info = eval(resp.text)
num = str(info['data']['follower'])
print("the number of followers is " + num) if __name__ == "__main__":
uid = input("Enter the uid:")
uid = int(uid)
fans(uid)

获取并打印粉丝数(结合下面环节应该是把粉丝数导入列表)

2、设定每小时爬一次

schedule

python中有一个轻量级的定时任务调度的库:schedule。他可以完成每分钟,每小时,每天,周几,特定日期的定时任务。因此十分方便我们执行一些轻量级的定时任务。

安装schedule
pip install schedule -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
import schedule
fans()
schedule.every(10).second.do(fans)
while True:
schedule.fans_pending() # run_pending:运行所有可以运行的任务
输出:
The number of followers is 12614183
The number of followers is 12614188
The number of followers is 12614195
The number of followers is 12614199
......

罗老师涨粉好快!

但是毫无卵用!!

这个schedule好像只能重复无参函数,还停不下来,应该适用于那种实时抓实时输出的程序

换条路!

sleep()

通过time.sleep(t)可以使程序暂停t秒时间,结合for循环控制循环次数,用datetime获取时间,用fans()获取粉丝数作为画图数据

uid = input("请输入up主的uid:")
interval = input("请输入获取粉丝数的时间间隔(单位:秒):")
interval = int(interval)
count = input("请输入获取次数:")
count = int(count)
t = []
number = []
for i in range(0,count):
t.append(datetime.datetime.now().strftime('%H:%M:%S'))
number.append(fans(uid))
time.sleep(interval)
print(t)
print(number)

正常运行,针不戳

接下来是画图时间

画图

plt.plot(t,number)
plt.show()

为节约时间设置每二十秒获取一次,一个小时的话设置3600秒即可

好耶!!任务一完成!!

任务二

1、爬三部电影评论数据

爬用户名的函数部分

import urllib.request
import re
comment = 'C:\\Users\\13666\\Desktop\\Pythonwork\\test.txt'
T='<span content=".*?" class=".*?">.*?</span>'
def get_name(id):
url_1 = f"https://movie.douban.com/subject/{id}/reviews?start="
name_list = []
for i in range(10):
url = url_1 + str(i*20) # 确定要爬取的入口链接
# 模拟成浏览器并爬取对应的网页 谷歌浏览器
headers = {'User-Agent',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read().decode('utf8')
time_pattern = re.compile('<span content=".*?" class=".*?">(.*?)</span>', re.S)
time = re.findall(time_pattern, data)
id_pattern= re.compile('<h2><a href="https://movie.douban.com/review/(.*?)/', re.S)
id= re.findall(id_pattern, data) for j in range(len(id)):
html = 'https://movie.douban.com/j/review/' + str(id[j]) + '/full'
data = opener.open(html).read().decode('utf8')
html = data
content_pattern = re.compile('data-original(.*?)main-author', re.S)
content = re.findall(content_pattern, html)
text_pattern = re.compile('[\u4e00-\u9fa5|,、“”‘’:!~@#¥【】*()——+。;?]+', re.S)
text = re.findall(text_pattern, content[0])
text = ''.join(text)
name_pattern = re.compile('data-author=.*?"(.*?)"', re.S)
name = re.findall(name_pattern, html)
name_list.append(name[0].strip('\\'))
return name_list

获取部分很大一部分是copy的qwq

然后自己改了一波可以使用任意电影

url那一部分一开始是这样的:

url = "https://movie.douban.com/subject/30331149/reviews?start="+str(i*20)  # 确定要爬取的入口链接

只能使用确定的网址

然后我为了可以指定任意电影就改成了

url = "https://movie.douban.com/subject/" + id + "/reviews?start="+str(i*20)  # 确定要爬取的入口链接

好像挺完美的样子

然后玩命报错giao

假装下面全是红色

Traceback (most recent call last):
File "C:\Users\13666\AppData\Local\Programs\Python\Python38-32\lib\http\client.py", line 571, in _readall_chunked
value.append(self._safe_read(chunk_left))
File "C:\Users\13666\AppData\Local\Programs\Python\Python38-32\lib\http\client.py", line 610, in _safe_read
raise IncompleteRead(data, amt-len(data))
http.client.IncompleteRead: IncompleteRead(55421 bytes read, 9874 more expected) During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "C:/Users/13666/PycharmProjects/豆瓣评论区/main.py", line 40, in <module>
first_list = get_name(first)
File "C:/Users/13666/PycharmProjects/豆瓣评论区/main.py", line 14, in get_name
data = opener.open(url).read().decode('utf8')
File "C:\Users\13666\AppData\Local\Programs\Python\Python38-32\lib\http\client.py", line 461, in read
return self._readall_chunked()
File "C:\Users\13666\AppData\Local\Programs\Python\Python38-32\lib\http\client.py", line 575, in _readall_chunked
raise IncompleteRead(b''.join(value))
http.client.IncompleteRead: IncompleteRead(9514 bytes read)

后来修改成网址前半段在函数开头就确定然后后来再拼接的方式就可以了(见上面的函数)

怎会如此?????

2、相互对比算出重合度

我是将三个列表的重合元素重新组成一个列表,计算列表长度,然后计算重合度

first= input("输入第一部电影的id:")
second = input("输入第二部电影的id:")
third = input("输入第三部电影的id:")
first_list = []
second_list = []
third_list = []
first_list = get_name(first)
second_list = get_name(second)
third_list = get_name(third)
same_12 = [val for val in first_list if val in second_list]
same_123 = [val for val in same_12 if val in third_list]
rate = len(same_123)/(3*len(first_list)-2*len(same_123))
print("三部电影评论用户重合人数为:" + str(len(same_123)))
print("三部电影评论用户重合率为:" + str(rate*100) + "%")

3、给出算法时间复杂度

后面反复调用三次函数算是一个for了,加上函数本身包含俩for,时间复杂度应该是T(n)=O(n^3)

4、贴一下运行结果

居然有五个人看了唐探三、李焕英和刺杀小说家并写了影评,不容易不容易,瑞思拜

总结

延续上一次作业的优良传统不靠大佬救靠csdn

任务一大部分是自己完成的

任务二爬粉丝名字有点超出能力范围了 函数部分代码抄的有点猛,比较遗憾,自己整出来还是比较有成就感

第三次作业就这样结束啦,一个寒假还是收获了蛮多的,每次作业都有交自己小骄傲一下,越学习越能感受到自己的渺小和代码世界的广阔,还是要继续努力。

sleep()使用方法

schedule使用方法

爬取up主粉丝数

matplotlib画图

爬取豆瓣评论区

python求列表交集的方法

Homework_3 (完整版)的更多相关文章

  1. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  2. Android版的菜谱客户端应用源码完整版

    Android版的菜谱客户端应用源码完整版,这个文章是从安卓教程网转载过来的,不是本人的原创,希望能够帮到大家的学习吧. <ignore_js_op> 152936qc7jdnv6vo0c ...

  3. sed实例精解--例说sed完整版

    原文地址:sed实例精解--例说sed完整版 作者:xiaozhenggang 最近在学习shell,怕学了后面忘了前面的就把学习和实验的过程记录下来了.这里是关于sed的,前面有三四篇分开的,现在都 ...

  4. flexbox-CSS3弹性盒模型flexbox完整版教程

    原文链接:http://caibaojian.com/flexbox-guide.html flexbox-CSS3弹性盒模型flexbox完整版教程 A-A+ 前端博客•2014-05-08•前端开 ...

  5. 转贴 IT外企那点儿事完整版

    转贴 IT外企那点儿事完整版 第一章:外企也就那么回儿事(http://www.cnblogs.com/forfuture1978/archive/2010/04/30/1725341.html) 1 ...

  6. C#.Net 上传图片,限制图片大小,检查类型完整版

    C#.Net 上传图片,限制图片大小,检查类型完整版 源代码: 处理图片类,如检查图片大小,按宽度比例缩小图片 public class CImageLibrary{   public enum Va ...

  7. office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

    office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.O ...

  8. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  9. thinkPHP3.2.3完整版 在sae上面的部署

    第一步:         thinkPHP3.2.3完整版,目录结构如下 第二步:在新浪sae上面创建一个新应用 第三步:用svn  down,下来会有两个文件:index.php.config.ya ...

随机推荐

  1. 【LeetCode】114. Flatten Binary Tree to Linked List 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先序遍历 递归 日期 题目地址:https://le ...

  2. hdu -4325-Flowers(离散化 线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325: 题目意思: 给你N个花开的时间段,然后在有M个时间点,问你在这个时间点有多少花开着. 昨天刚做的一个类似 ...

  3. BestCoder Round #66 (div.2)B GTW likes gt

    思路:一个O(n)O(n)的做法.我们发现b_1,b_2,...,b_xb​1​​,b​2​​,...,b​x​​都加11就相当于b_{x+1},b_{x+2},...,b_nb​x+1​​,b​x+ ...

  4. git安装与使用,未完待续... ...

    ​ 目录 一.git概念 二.git简史 三.git的安装 四.git结构 五.代码托管中心-本地库和远程库的交互方式 六.初始化本地仓库 七.git常用命令 1.add和commit命令 2.sta ...

  5. 教学日志:javaSE-流程控制语句

    import java.util.Scanner; //导包 /* java流程控制语句: 单分支结构: 只有一个条件,符合就执行 双分支结构: 有两个条件,符合哪个就执行哪个语句块 多分支结构: 有 ...

  6. SpringMVC 五大组件

    DispatcherServlet HandleMapping Controller ModeAndView ViewResolver 1.DispatcherServlet 这个控件是SpringM ...

  7. [多线程]async异步操作的使用实例及不同策略的对比

    #include <iostream> #include <thread> #include <mutex> #include <iostream> / ...

  8. 不同目录存在相同名称的py文件,执行时,报错的解决方法

    1.问题现象如下,执行时报错  imported module 'test_case_execution' has this __file__ attribute platform win32 -- ...

  9. Django_MVT(二)

    一.MVT简介 M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答. T全拼为Template,与 ...

  10. Dubbo服务 上传文件解决方案以及Hessian协议

    ​ 协议支持 Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebService协议 Thrift协议 Memcached协议 Redis协议 在通 ...