Python

Python爬虫之微博热搜

勤劳的小蜜蜂 · 3月8日 · 2019年 · ·

最近自学了Python爬虫,手痒痒,想爬点东西,所以就有了这篇文章。由于目前本人技术有限,如有纰漏,欢迎批评指正;如有良策,也欢迎赐教。

思路

1.首先,当然是打开微博热搜,F12观察下网页结构。令人高心的是,微博热搜的网页结构比较简单,所有的热搜数据是都在放在表格中,除了置顶的热搜(只有热搜内容和链接,没有热搜排名和热度值),其他的热搜都是相同的格式(热搜排名、热搜内容、热度值、链接)

  • <td class=”td-01 ranktop”><td>可以获取到热搜排名
  • <td class=”td-02″><td> 可以获取到热搜内容、热搜链接、热度值

2.先输出比较特殊的置顶内容,然后剩下的就是50个格式相同的内容,因为通过xpath获取的值是list类型,所以可以用list[起点:重点]来截取置顶内容个后50个内容。

3.xpath抓取的50个内容都是按顺序一一对应的相关内容,所以使用zip函数将相关内容为一组打包,并在打包的过程中输出。

代码

import requests
from lxml import etree

# 微博热搜url
url = "https://s.weibo.com/top/summary?cate=realtimehot"
# 获取网页源码
r = requests.get(url).text
# 调用HTML类对HTML文本进行初始化,成功构造XPath解析对象,同时可以自动修正HMTL文本(标签缺少闭合自动添加上)
result = etree.HTML(r)
# 通过td标签的class值定位,text()获取被td标签包围的值
# 因为置顶的热搜没有排名,所以hot_rank获取的值个数就是50个
hot_rank = result.xpath("//td[@class='td-01 ranktop']/text()")

# 获取所有热搜内容
# 因为置顶的热搜有热搜内容,所以hot_content_all获取的值个数就是51个
hot_content_all = result.xpath("//td[@class='td-02']/a/text()")
# 截取置顶热搜内容
hot_content_first = hot_content_all[0:1]
# 截取除去置顶的热搜内容
hot_content = hot_content_all[1:]

# 获取热度值
# 因为置顶的热搜没有热度值,所以hot_rank获取的值个数就是50个
hot_index = result.xpath("//td[@class='td-02']/span/text()")

# 获取所有内容url
# 因为置顶的热搜有url,所以hot_url_all获取的值个数就是51个
hot_url_all = result.xpath("//td[@class='td-02']/a/@href")
# 截取置顶url
hot_url_first = hot_url_all[0:1]
# 截取除去置顶的url
hot_url = hot_url_all[1:]

# 输出置顶的热搜
for hot_content_first1, hot_url_first1 in zip(hot_content_first, hot_url_first):
    print("{:<5}".format("置顶") + "{:<20}\t".format(hot_content_first1, chr(12288)) + "{:<}".format("https://s.weibo.com" + hot_url_first1))

# 输出除去置顶的热搜
for hot_rank1, hot_content1, hot_url1, hot_index1 in zip(hot_rank, hot_content, hot_url, hot_index):
    print("{:<5}".format(hot_rank1) + "{:<20}\t".format(hot_content1, chr(12288)) + "{:<8}".format(hot_index1) + "{:<}".format("https://s.weibo.com" + hot_url1))

chr(12288)是中文的空格,因为中英文所占据的空间是不一样大的,所以在输出的时候即使控制了输出的宽度,还是会不对齐,使用的chr(12288)的目的是让输出的内容相对的对齐,即使效果也不太好,但是聊胜于无。

效果

0 条回应