使用Python爬取百度热搜榜

1. 简介

去年用C#给自己博客写的每日新闻爬虫突然就不能用了,最近闲下来看了一下,原来是百度热搜榜的前端页面改版了,那难怪。这次索性人生苦短,我选Python吧。

2. 百度热搜榜源码观察

百度热搜榜的网址如下: 去了点开源码一看,我乐了。 百度很贴心的在最前面用注释写好了热搜榜内容的数据字典,也不知道是后端程序员生成出来忘记删了,还是真就方便大家爬呢。

那么接下来就好办了。

3. 获取网页html源码

使用python的urllib.request包,我就直接上代码了,大家看吧

#获取网页源码
def askURL():
    print(#>>>获取网页HTML源码中...>>>)
    # 模拟浏览器头部信息,向服务器发送消息
    head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
    # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    request=urllib.request.Request(newsUrl,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        print("#SUCCESS>HTML源码爬取完毕!
")
    except urllib.error.URLError as e:
        print("#ERROR>HTML源码爬取失败!
")
        if hasattr(e, "code"):
            print("#" + str(e.code))
        if hasattr(e, "reason"):
            print("#" + str(e.reason))
    return html

4. 整理源码中的数据

打算将html中的字符串直接转换为dict,然后再将原本的dict简化成我们需要的dict(只留新闻标题,新闻详情,新闻图片与新闻链接) 代码如下:

#解析数据
def getData(html):
    print(#>>>解析数据中...>>>)
    newsDictListStr = None
    try:
        findNewsDictList = re.compile(r,"content":[{([sS]*)}],"moreUrl":)
        newsDictListStr = re.findall(findNewsDictList,html)[0]
        print("#SUCCESS>字典串截取成功")
    except IndexError:
        print("#ERROR>字典串截取失败,目标网站源码可能发生改变!")
        return newsDictListStr

    dataStrList = newsDictListStr.split(},{)
    print(#SUCCESS>原始数据字典分析完毕)
    newsList = []
    try:
        for dataStr in dataStrList:
            Str ={ + dataStr + }
            oldDict = ast.literal_eval(Str)
            newDict = dict()
            newDict["index"] = oldDict["index"] + 1
            newDict["article"] = oldDict["word"]
            newDict["info"] = oldDict["desc"]
            newDict["link"] = oldDict["url"]
            newDict["img"] = oldDict["img"]
            newsList.append(newDict)
    except KeyError:
        print("#ERROR>未找到数据字典中的键,原网站数据字典可能已经改变")
        return None
    print("#SUCCESS>新数据字典已提取")   
    return newsList

5. 输出保存整理好的新闻

我打算将得到的数据整理成markdown的格式保存下来,方便导出成图片。 代码如下:

这样以来,就大功告成了,可以每天轻松看新闻啦!

6. 结果与全部代码

整体代码如下:

导出md再导出图片如下:

经验分享 程序员 微信小程序 职场和发展