python爬取新浪热搜排名并导入数据库

上一篇文章简单介绍了如何使用python爬取新浪微博的热搜排名:
爬虫实例:爬取新浪微博热搜排名

如果了解清楚原理的话是非常容易懂的,但是这样单纯的进行查询结果显示显然没有意义
学习了数据库之后,就尝试做了以下改进:

  1. 将热搜信息导入数据库
  2. 加了个日志函数,方便在服务器自动执行时保存运行数据

数据库我用的是mysql
目前只设计了一个名为hotsou-db的table来简单地存放内容:

CREATE TABLE hotsou-db(
hs_name VARCHAR(100),
hs_rank INT(3),
hs_number INT(20),
hs_time TIMESTAMP
);-- 四个属性都是主键感觉有点不太合理。
ALTER TABLE `hotsou-db` ADD PRIMARY KEY(hs_name, hs_rank, hs_number, hs_time);

在上篇文章的基础上,添加如下内容:

import pymysql
import time
def CommitDB(ranklist, num, tt):try:# 连接mysqlconn = pymysql.connect(host=HOST,user=USER, password=PASSWORD,port=PORT,database=DATABASE,charset=CHARSET)except:Logs(tt, 1, 'DB Connection Failed')try:cursor = conn.cursor()for i in range(1, num):rank = int(ranklist[i][0])name =ranklist[i][1]number = int(ranklist[i][2])sql = "INSERT INTO {0} VALUES('{1}', {2}, {3}, {4})".format(DB_NAME, name, rank, number, eval(tt))cursor.execute(sql)conn.commit()cursor.close()conn.close()Logs(tt, 0, 'Commit Done')except:Logs(tt, 1, 'Commit Failed')def Logs(tt, number, text):f = open("./weibo.log", "a")# 用于生成日志 - 0是正确运行日志, 1是错误日志if number is 0:f.write('[' + tt + '] -- ' + text + '\n')else:f.write('[' + tt + '] -- ' + text + '\n')f.close()

在main中做如下更改即可:

tt = time.strftime("%Y%m%d%H%M%S", time.localtime())
soup = HTMLTextconvert(text)
HTMLSearch(soup, rank, TOP_COUNT+1)
Rankprint(rank, TOP_COUNT)
CommitDB(rank, TOP_COUNT+1, tt)# 每隔3min记录一次
time.sleep(180)

可以看到主要是用到了pymysql这个库来实现与数据库的交互操作

最终效果:

导入数据库之后就可以做些有趣的事情了

附全代码:

import requests
import re
import bs4
import pymysql
import timeHOST = ""
USER=""
PASSWORD=""
PORT=0
DB_NAME = ""
DATABASE=""
CHARSET="utf8"
TOP_COUNT=20    # 前多少热搜条数
TOP_SHOW=False   # 是否显示置顶# 获取一个中英文混合的字符串文本的字符宽度部分
widths = [(126, 1), (159, 0), (687, 1), (710, 0), (711, 1),(727, 0), (733, 1), (879, 0), (1154, 1), (1161, 0),(4347, 1), (4447, 2), (7467, 1), (7521, 0), (8369, 1),(8426, 0), (9000, 1), (9002, 2), (11021, 1), (12350, 2),(12351, 1), (12438, 2), (12442, 0), (19893, 2), (19967, 1),(55203, 2), (63743, 1), (64106, 2), (65039, 1), (65059, 0),(65131, 2), (65279, 1), (65376, 2), (65500, 1), (65510, 2),(120831, 1), (262141, 2), (1114109, 1),
]def get_width(a):global widthsif a == 0xe or a == 0xf:return 0for num, wid in widths:if a <= num:return widreturn 1def length(str):sum = 0for ch in str:sum += get_width(ord(ch))return sum# 获取HTML文本
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_encodingreturn r.textexcept:print("InternetError!")return " "# 解析并且返回HTML文本
def HTMLTextconvert(html):try:soup = bs4.BeautifulSoup(html, "html.parser")return soupexcept:print("HTMLConvertError!")return " "# 检索HTML中的信息,获取搜索排名信息
# 存在置顶的情况,需要特殊判断
def HTMLSearch(html, ranklist, cnt):try:flag = 0# 计数器mm = 0# 找到所有tbody标签下的所有内容,并且遍历所有的儿子节点for tr in html.find("tbody").children:# 添加判断:获得的内容是否为标签Tag类型if isinstance(tr, bs4.element.Tag):# 使用flag特判置顶的情况if flag == 0:rank = "置顶"# 注意由于class属性会和python中的关键字重名,因此需要变为class_td02 = tr.find_all(class_=re.compile('td-02'))for i in td02:if isinstance(i, bs4.element.Tag):# trans得到的类型为列表trans = i.find_all("a")number = " "ranklist.append([rank, trans[0].string, number])flag = 1else:# 排名信息在td标签下的class=td-01属性中td01 = tr.find_all(class_=re.compile("td-01"))for i in td01:if isinstance(i, bs4.element.Tag):rank = i.string# 热搜内容和搜索量在td标签下的class=td-02属性中:内容是a标签,搜索量是span标签td02 = tr.find_all(class_=re.compile("td-02"))for i in td02:name = i.find_all("a")column = i.find_all("span")# 使用string获取字符串信息不准确,因为微博还有一些热搜标题为含有表情的,因此使用了textranklist.append([rank, name[0].text, column[0].text])mm += 1if mm == cnt:breakexcept:print("HTMLSearchError!")# 打印排名
def Rankprint(ranklist, num):try:# 先打印表头,总长为70个字符,其中{1}和{3}是变化的空格数量计算,默认为:# 排名*4,空格*3,名称*50,空格*5,点击量*8a = " "print("——————————————————————————————————————")print("{0}{1}{2}{3}{4}\n".format("排名", a * 5, "热搜内容", a * 45, "搜索量" + a * 2))if TOP_SHOW is True:print("{0}{1}{2}\n".format(ranklist[0][0], a * 3, ranklist[0][1]))for i in range(1, num+1):# c是排名有一位、两位的数字,用来纠正空格c = 7 - len(ranklist[i][0])# 根据内容来随时计算所要填充的空格数量bstr = ranklist[i][1]b = 62 - length(ranklist[i][1]) - len(ranklist[i][0]) - cprint("{0}{1}{2}{3}{4:<8}".format(ranklist[i][0], a * c, ranklist[i][1], a * b, ranklist[i][2]))print("\n")except:print("RankPrintError!")def CommitDB(ranklist, num, tt):try:# 连接mysqlconn = pymysql.connect(host=HOST,user=USER, password=PASSWORD,port=PORT,database=DATABASE,charset=CHARSET)except:Logs(tt, 1, 'DB Connection Failed')try:cursor = conn.cursor()for i in range(1, num):rank = int(ranklist[i][0])name =ranklist[i][1]number = int(ranklist[i][2])sql = "INSERT INTO {0} VALUES('{1}', {2}, {3}, {4})".format(DB_NAME, name, rank, number, eval(tt))cursor.execute(sql)conn.commit()cursor.close()conn.close()Logs(tt, 0, 'Commit Done')except:Logs(tt, 1, 'Commit Failed')def Logs(tt, number, text):f = open("./weibo.log", "a")# 用于生成日志 - 0是正确运行日志, 1是错误日志if number is 0:f.write('SUCCESS: [' + tt + '] -- ' + text + '\n')else:f.write('ERROR: [' + tt + '] -- ' + text + '\n')f.close()# 主函数
def main():# while(True):try:# 微博热搜的网站url = "https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6"# 使用二维列表存储每一条热搜信息的rank信息和内容rank = []text = getHTMLText(url)tt = time.strftime("%Y%m%d%H%M%S", time.localtime())# print("当前时间: " + tt)soup = HTMLTextconvert(text)HTMLSearch(soup, rank, TOP_COUNT+1)Rankprint(rank, TOP_COUNT)# CommitDB(rank, TOP_COUNT+1, tt)# 每隔3min记录一次# time.sleep(180)except:Logs(tt, 1, 'SystemError!');return 0if __name__ == '__main__':print("获取前"+str(TOP_COUNT)+"条")print("显示置顶"+str(TOP_SHOW))main()

Python爬虫与信息提取(八)将新浪热搜排名导入数据库相关推荐

  1. Python爬虫实例--新浪热搜榜[xpath语法]

    Python爬虫实例--新浪热搜榜[xpath语法] 1.基础环境配置: requests-->版本:2.12.4 lxml-->版本:3.7.2 2.网页分析 很容易从html源码中看到 ...

  2. Python爬虫实例--新浪热搜榜[正则表达式]

    Python爬虫实例--新浪热搜榜[正则表达式] 1.基础环境配置: requests-->版本:2.12.4 re-->:Python自带,无需安装 2.网页分析 很容易从html源码中 ...

  3. python爬虫-使用BeautifulSoup爬取新浪新闻标题

    ** python爬虫-使用BeautifulSoup爬取新浪新闻标题 ** 最近在学习爬虫的技巧,首先学习的是较为简单的BeautifulSoup,应用于新浪新闻上. import requests ...

  4. 爬虫实例3:Python实时爬取新浪热搜榜

    因为了解到新浪热搜榜每分钟都会更新,所以写的是每分钟爬取一次的死循环,按照日期为格式创建路径,将 爬取的信息按照时间顺序 输出到excel. 步骤: 1.在浏览器中,用F12分析热搜榜页面的html标 ...

  5. python爬虫:案例四:新浪微指数

    新浪的微指数,首页输入一个关键字,比如 欢乐颂,会跳转至:http://data.weibo.com/index/hotword?wid=1091324230349&wname=欢乐颂 我不知 ...

  6. 小白快速体验之爬虫抓取新浪热搜

    首先要有一些准备工作,当然前提是需要了解一下python的基础知识. 安装所需要的语言环境和工具: 1.python 我使用的是python3.6.5版本 2.三方库 requests 安装命令:pi ...

  7. Python爬虫入门(八)

    Python爬虫入门(八) 讲解Xpath常用代码,无任何实例: · 读取xml节点内容(多个,单个) · xpath读取heml文件 · 读取指定节点,条件筛选,循环读取 ####XPath解析 f ...

  8. Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名

    经过一段时间的Python网络爬虫学习,今天自己摸索制作了一个能够爬取新浪微博实时热搜排名的小爬虫 1.效果: 2.制作过程中遇到的问题: (1)一开始研究微博热搜页面的源代码时忽略了<tbod ...

  9. 从子域名看百度,新浪,搜狐,QQ和网易

    从二级域名看百度,新浪,搜狐,QQ和网易 本来想写一篇关于百度产品的分析,写了一半发现题目太大,写不下去了.干脆自己八卦一下. 网易的子域名:108 个: QQ的子域名:102 个: 新浪子域名:86 ...

最新文章

  1. win8.1升级到win10后 vmware不能连网的问题
  2. Quora Andy Barton
  3. 设计模式之委派模式及适配器模式
  4. 空服务器安装linux,debian服务器linux服务器web建站搭建linux服务器之Debian安装
  5. 「Python-Bug」错误requests.exceptions.proxyerror: httpsconnectionpool解决方法
  6. 黑马day16 jqueryamp;属性过滤选择器
  7. mysql数据库主从不同步_mysql数据库主从不同步的解决方法
  8. 游戏开发之C++IO流(C++基础)
  9. 深度强化学习- 最全深度强化学习资料
  10. 使用swix反编译swf文件修改版权
  11. C#控制Bartender自动列印的2种方法(附源码)
  12. html以鼠标为中心放大网页,鼠标滚轮网页放大缩小
  13. 范浩强平衡树(FHQ_Treap)介绍
  14. Chromium浏览器不能播放MP4
  15. Java实现腾讯企业邮箱收发邮件
  16. jscriptbug
  17. 如何成为很厉害的程序员?- 读《精进》
  18. 所有域名都需要实名认证吗?域名实名认证有什么好处?
  19. 淘宝“蓝鲸计划”细节内容曝光 收编谷歌中国资源
  20. jsp/servlet 实现的图书管理系统

热门文章

  1. 什么软件测试固态硬盘坏没坏,固态硬盘容易坏吗 SSD固态硬盘坏掉前有什么征兆【详细介绍】...
  2. 插入视频短代码WordPress函数wp_video_shortcode
  3. html5开发wp8,WP7几则消息(HTML5,Sliverlight,WP8)
  4. 3、流量分析--分组TopN统计
  5. bootstrap-pagination数据全部加载到前端再进行处理_求助!vue单页项目如何改造路由使其能够进行分模块打包?...
  6. android 获取build,分析,读取 android build.prop
  7. 深度学习中 经常提到的 end to end 的理解
  8. 高速缓存对c程序的影响
  9. tenacity 报错_tenacity 重试
  10. Windows xp .iso下载大全——超全面超难找的收藏版(一)