Python中文社区菜鸟学Python大数据 爬虫Python AI Sql

python爬虫再体验,爬取文章浏览量。俗人必备工具

2020-03-27  本文已影响0人  爱吃西红柿嘛

开门见山,我是个俗人,俗不可耐的那种。

几天前开始日更,至今已有9篇或流水账或菜鸡技术篇问世,论钻石,我仰望大佬,论评论,我仰望大佬,论点赞,我仰望大佬,论浏览量,我依旧仰望大佬。人都说,写文章嘛,记录生活就好了,何必那么在意。我也这么想,但总感觉没人看的时候,自己会好受挫。我承认我俗了。每天打开简书刷新文章页面的时间占我玩手机的百分之80以上。文章少的时候,我还能靠我超(普)强(通)的记忆力,记住每篇文章的阅读数,并与上次记忆时作比较,嘴角露出一丝猥琐的笑。如今不行了,文章越来越多,人也越来越俗。那么,咱就来想办法解决解决。

昨天刚开始学爬虫,爬了最好大学网,实在有趣至极。心里实在痒得不行,我们今天就来爬简书。并且,我们将爬出来的数据进行可视化,输出至图片,曲线总是比图片好看不是嘛。说干就干,它来了。

先来看看我们的主页:

我的主页
接下来查看网站源码:
网站源码
可以十分清晰的看到,我们需要的浏览量,还有标题都被
<a class="title" target="_blank" href="/p/96fc3adaf818">北方人的面食生活</a> 类似的标签包裹,那就好办多了。

下面直接上代码:

代码部分1:导入需要的库,此处并未使用高级爬虫框架,依然采用的是requests,使用了正则表达式re来匹配我们要查找的字段,使用了time来实现每过20分钟查询一次功能的实现,以及每次查询时间的记录等等,最最生涩的库matplotlib图表库,来实现数据的可视化

import requests
import re
import time
import matplotlib.pyplot as plt

代码部分2:此为低级爬虫获取网站源码的框架。

def getHTMLText(url):
    try:
        kv = {"user-agent": "Mozilla/5.0"}
        r = requests.get(url, headers=kv, timeout=30)  # 设置代理才能进入
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("异常")
        return ""

代码部分3: 构造正则表达式,查询我们需要的浏览量和标题

def parsePage(uList, html):
    titlelist = re.findall(r'<a class="title" target="_blank" href=".+">(.+)</a>', html)
    viewcountlist = re.findall(r'<i class="iconfont ic-list-read"></i>(.+)', html)
    for i in range(len(titlelist)):
        uList.append([viewcountlist[i], titlelist[i]])

代码部分4: 输出到文件,为了达到与上次浏览量的对比,我们将每次的记录追加至csv文件中

def printGoodsList(uList):
    with open("D://textdata.csv", "a") as file:
        for g in uList:
            file.write(",".join(g) + "," + str(time.strftime("%H:%M", time.localtime())))
            file.write("\n")

可以看到csv文件如下图:

csv文件
代码部分5: 读取并处理数据,将所有数据从文件中读出,并进行格式处理。
格式如:{“北方人的面食生活”:[[163,164,165],[16:47,16:48,16:48]]}以字典形式进行保存,键为标题,值的第一字段为浏览量列表,第二字段为记录时间列表
def getDatafromfile():
    with open("D://textdata.csv", "rt") as file:
        datalines = file.readlines()
        datadict = {}
        for line in datalines:
            linelist = line.strip().split(",")
            datadict.setdefault(linelist[1], [[], []])[0].append(linelist[0])
            datadict.setdefault(linelist[1], [[], []])[1].append(linelist[2])
        linechart(datadict)  # 数据处理完毕,调用画图函数

代码部分6:数据可视化。

def linechart(datadict):
    datalist = list(datadict.items())
    colors = ["red", "green", "gray", "black", "gold", "blue"]
    plt.figure(figsize=(20, 10))
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

    for i in range(len(datalist)):
        plt.subplot(len(datalist) // 3+1, 3, i + 1)  # 分成几行几列 最后一位为几张图
        plt.plot(datalist[i][1][1], datalist[i][1][0], color=colors[i % 6])
        plt.xlabel(datalist[i][0])
    plt.tight_layout()
    plt.savefig('C://Users//rookie//Desktop//textdata.png')
    plt.show()

代码部分7:定义主函数,并进行定时处理。

def main():
    infolist = []
    url = "https://www.jianshu.com/u/a264a2c4184f"
    html = getHTMLText(url)
    parsePage(infolist, html)
    printGoodsList(infolist)
    getDatafromfile()

# 每n秒执行一次
def timer(n):
    while True:
        main()
        time.sleep(n)

timer(1200) #20分钟

结果令人舒适,轻松加愉快: textdata.png

事后烟:
丑是丑了点,但是妈妈再也不用担心我每天盯着手机记浏览量了。下一步准备生成可执行文件,放在服务器执行。可怜的浏览量。一起加油!!!
更新:
使用如下命令打包成exe文件,发送到桌面快捷方式,双击执行即可。


命令行生成exe exe文件
上一篇 下一篇

猜你喜欢

热点阅读