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源码爬取完毕!\n")except urllib.error.URLError as e:print("#ERROR>HTML源码爬取失败!\n")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 = Nonetry:findNewsDictList = re.compile(r',"content":\[\{([\s\S]*)\}\],"moreUrl":')newsDictListStr = re.findall(findNewsDictList,html)[0]print("#SUCCESS>字典串截取成功")except IndexError:print("#ERROR>字典串截取失败,目标网站源码可能发生改变!")return newsDictListStrdataStrList = newsDictListStr.split('},{')print('#SUCCESS>原始数据字典分析完毕')newsList = []try:for dataStr in dataStrList:Str ='{' + dataStr + '}'oldDict = ast.literal_eval(Str)newDict = dict()newDict["index"] = oldDict["index"] + 1newDict["article"] = oldDict["word"]newDict["info"] = oldDict["desc"]newDict["link"] = oldDict["url"]newDict["img"] = oldDict["img"]newsList.append(newDict)except KeyError:print("#ERROR>未找到数据字典中的键,原网站数据字典可能已经改变")return Noneprint("#SUCCESS>新数据字典已提取")   return newsList

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

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

# 生成MD文件字符串
def getMD(newsList):print('#>>>MD文件生成中...>>>')nowTime = datetime.datetime.now()nowTimeStr1 = nowTime.strftime('%Y/%m/%d %H:%M:%S')nowTimeStr2 = nowTime.strftime('%Y年%m月%d日 %H:%M:%S')colorList = ["red", "green", "blue"]newsMDStr = "---\ntitle: 每日新闻\ndate: {}\n---\n".format(nowTimeStr1)newsMDStr += '\n# ' + nowTimeStr2 + '\n'for i in range(len(newsList)):if i < 3:newsMDStr += "\n ## [<font color= {} >{} .{}</font>]({})<br><br>".format(colorList[i], str(newsList[i]["index"]), newsList[i]["article"], newsList[i]["link"])else:newsMDStr += "\n ### {} .[{}]({}) <br><br>".format(str(newsList[i]["index"]), newsList[i]["article"], newsList[i]["link"])newsMDStr += r'<img src="{}" width = 60% height = 60% align= "middle"/><br><br>'.format(newsList[i]["img"])if newsList[i]["info"] == "":newsMDStr += "> 暂无详细消息<br><br>"else:newsMDStr += "> {}<br><br>".format(newsList[i]["info"])newsMDStr += '**信息来源来自百度热榜,本网站不对真实性负责**\n'return newsMDStr# 保存MD文件
def writeMD(newsMDStr):f = open(savePath,"w",encoding="utf-8")f.write(newsMDStr)print("#SUCCESS>MD文件已生成")

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

6. 结果与全部代码

整体代码如下:

import re
import ast
import datetime
import urllib.request,urllib.errornewsUrl = "https://top.baidu.com/board?tab=realtime"
savePath = "news.md"# 主逻辑
def runNewsSpider():print('#>>>每日新闻爬取中...>>>')print("#目标网站:" + newsUrl)print("#存储路径:" + savePath)htmlCode = askURL()if htmlCode is None:print("#ERROR>数据字典爬取失败")return FalsenewsList = getData(htmlCode)if newsList is None:print("#ERROR>数据字典生成失败")return FalsenewsMDStr = getMD(newsList)writeMD(newsMDStr)print('#SUCCESS>新闻爬取完毕')return True#获取网页源码
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源码爬取完毕!\n")except urllib.error.URLError as e:print("#ERROR>HTML源码爬取失败!\n")if hasattr(e, "code"):print("#" + str(e.code))if hasattr(e, "reason"):print("#" + str(e.reason))return html#解析数据
def getData(html):print('#>>>解析数据中...>>>')newsDictListStr = Nonetry:findNewsDictList = re.compile(r',"content":\[\{([\s\S]*)\}\],"moreUrl":')newsDictListStr = re.findall(findNewsDictList,html)[0]print("#SUCCESS>字典串截取成功")except IndexError:print("#ERROR>字典串截取失败,目标网站源码可能发生改变!")return newsDictListStrdataStrList = newsDictListStr.split('},{')print('#SUCCESS>原始数据字典分析完毕')newsList = []try:for dataStr in dataStrList:Str ='{' + dataStr + '}'oldDict = ast.literal_eval(Str)newDict = dict()newDict["index"] = oldDict["index"] + 1newDict["article"] = oldDict["word"]newDict["info"] = oldDict["desc"]newDict["link"] = oldDict["url"]newDict["img"] = oldDict["img"]newsList.append(newDict)except KeyError:print("#ERROR>未找到数据字典中的键,原网站数据字典可能已经改变")return Noneprint("#SUCCESS>新数据字典已提取")   return newsList# 生成MD文件字符串
def getMD(newsList):print('#>>>MD文件生成中...>>>')nowTime = datetime.datetime.now()nowTimeStr1 = nowTime.strftime('%Y/%m/%d %H:%M:%S')nowTimeStr2 = nowTime.strftime('%Y年%m月%d日 %H:%M:%S')colorList = ["red", "green", "blue"]newsMDStr = "---\ntitle: 每日新闻\ndate: {}\n---\n".format(nowTimeStr1)newsMDStr += '\n# ' + nowTimeStr2 + '\n'for i in range(len(newsList)):if i < 3:newsMDStr += "\n ## [<font color= {} >{} .{}</font>]({})<br><br>".format(colorList[i], str(newsList[i]["index"]), newsList[i]["article"], newsList[i]["link"])else:newsMDStr += "\n ### {} .[{}]({}) <br><br>".format(str(newsList[i]["index"]), newsList[i]["article"], newsList[i]["link"])newsMDStr += r'<img src="{}" width = 60% height = 60% align= "middle"/><br><br>'.format(newsList[i]["img"])if newsList[i]["info"] == "":newsMDStr += "> 暂无详细消息<br><br>"else:newsMDStr += "> {}<br><br>".format(newsList[i]["info"])newsMDStr += '**信息来源来自百度热榜,本网站不对真实性负责**\n'return newsMDStr# 保存MD文件
def writeMD(newsMDStr):f = open(savePath,"w",encoding="utf-8")f.write(newsMDStr)print("#SUCCESS>MD文件已生成")

导出md再导出图片如下:

好兄弟萌,关注我,下次一起爬爬天气预报~!

使用Python爬取百度热搜榜相关推荐

  1. python爬取微博热搜榜

    python爬取微博热搜榜 最近应我大学室友得需求,做了一个简单的爬虫案例,先给大家看一下程序运行效果 接下来就是贴出代码了,在这里我会做一些简单说明,对如刚入门的同学可能会有所帮助,这里使用的是py ...

  2. Python爬取微博热搜榜,将数据存入数据库

    一直想学习用Python来进行数据的爬取,也一直想知道Python连接数据库的操作,今天刚好看到的这篇文章满足了这两个条件,我试着爬了下微博,并成功将数据添加到数据库中,颇为欢喜.作者写的很简单,有些 ...

  3. python爬取微博热搜榜教程,python爬取微博热搜并存入表格

    微博热搜的爬取较为简单,我只是用了lxml和requests两个库 url= https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&am ...

  4. Python爬取新浪微博热搜榜

    Python爬取新浪微博实时热搜榜.名人热搜榜.热点热搜榜和潮流热搜榜四大板块.这些板块都是不需要登录的,所以爬起来还是比较简单的.不过频繁的爬取会出现验证码. 作用爬取四大榜单的关键词和热搜指数并存 ...

  5. php采集百度热搜,python 爬取百度热搜

    ###导入模块 import requests from lxml import etree import requests,json ###网址 url="http://top.baidu ...

  6. python爬取微博热搜显示到折线图_微博热搜榜前20信息数据爬取进行数据分析与可视化...

    一.设计方案 1.主题式网络爬虫名称:微博热搜榜前20信息数据爬取进行数据分析与可视化 2.爬取内容与数据特征分析:爬取微博热搜榜前20热搜事件.排名与热度,数据呈一定规律排序. 3.设计方案概述:思 ...

  7. python爬取百度标题_Python爬取百度热搜和数据处理

    一.主题式网络爬虫设计方案 1.主题式网络爬虫名称:爬取百度热搜 2.主题式网络爬虫爬取的内容与数据特征分析:百度热搜排行,标题,热度 3.主题式网络爬虫设计方案概述:先搜索网站,查找数据并比对然后再 ...

  8. c#使用正则表达式获取TR中的多个TD_使用python+BeautifulSoup爬取微博热搜榜

    本文将介绍基于Python使用BeautifulSoup爬取微博热搜榜的实现过程 1.首先导入需要使用的库 from bs4 import BeautifulSoup from urllib.requ ...

  9. 爬虫—爬取微博热搜榜

    1. 引言 利用scrapy框架爬取微博热搜榜网站前50条热搜. 爬取信息:热搜排名.热搜新闻名.热搜新闻热搜量. 数据存储:存储为.csv文件. 2.爬取流程 新建scrapy爬虫项目: 在终端输入 ...

  10. python爬取微博热搜数据并保存!

    主要用到requests和bf4两个库将获得的信息保存在d://hotsearch.txt下importrequests;importbs4mylist=[]r=requests.get(ur- 很多 ...

最新文章

  1. 《智慧书》格言241-250
  2. 深度学习100例-卷积神经网络(AlexNet)手把手教学 | 第11天
  3. 40个非常有创意的404页面设计作品
  4. 第一个 Metro程序(空白应用程序)
  5. login组件的两种用法_vue2组件系列第四十节:NoticeBar 通告栏
  6. Find a way——BFS
  7. python插值算法实现_图像插值算法Opencv+python实现
  8. [转载]VHDL的testbench的编写
  9. yacc 简易计算机规则,Lex Yacc 学习笔记(2)- 简单计算器
  10. python 上传文件到服务器(模拟网页前端上传)
  11. bootice添加黑苹果引导_黑苹果OC(OpenCore)引导升级教程
  12. 几种前端h264播放器记录
  13. 设计模式(二)-软件开发过程中需要遵循的设计原则
  14. zynq7000学习笔记
  15. riscv-amo原子指令
  16. shell里的json超级工具 jq 高级用法介绍
  17. 中国最好的职业TOP10
  18. Python列表去重顺序不变
  19. 专业的web打印插件
  20. 敏捷开发绩效管理系列之八:阿米巴经营之序言

热门文章

  1. ADS仿真过孔阻抗(via designer)
  2. 基于Fragstats的土地利用景观格局分析
  3. 豆瓣小组html模板,用前端的方式打开豆瓣租房小组
  4. 计算机硕论题目,硕士论文题目精选(计算机方向)
  5. [MATLAB]基本介绍
  6. maven下载及安装教程(保姆及教程)
  7. Eclipse语言包安装
  8. 天勤数据结构顺序表算法操作含完整测试
  9. OpenDrive学习笔记
  10. 智能小车-红外循迹篇