【Python爬虫】如何使用Python爬取微博上的热门话题?
微博是一个集微博、博客、相册、音乐等多种功能于一身的综合性互动娱乐平台,每天有海量的用户在上面分享各种各样的内容。其中,热门话题是用户们聚集的重要场所之一,因此本文将以Python爬虫为工具,教大家如何获取微博上的热门话题的相关信息。
1. 准备工作
在开展爬虫之前,我们需要准备以下工具和知识:
- Python开发环境
- requests库(用于发送HTTP请求和获取响应)
- BeautifulSoup库(用于解析HTML和XML文档)
- Chrome浏览器和ChromeDriver(用于模拟浏览器操作)
2. 获取热门话题首页URL
打开微博的官网 https://weibo.com/,我们可以看到页面上方有一个热门话题的入口,点击进入。在页面右侧可以看到不同分类的热门话题,选择任意一个分类后可以在页面中央看到相应的热门话题列表。这个列表就是我们需要爬取的目标。
在Chrome浏览器中右键单击这个页面中任意一个热门话题的链接,选择“检查”,在弹出的开发者工具中切换到“Network”标签页。接下来我们点击页面中的“加载更多”按钮,我们会发现在这个标签页中多了一个请求,点击该请求可以看到这个请求的URL和响应。
我们可以看到,这个请求的URL是 https://weibo.com/a/hot/realtime,而且在请求中还包含了一些参数,例如这个请求的HTTP方法是POST(即向服务器提交数据),并且也传了一些表单数据。这些请求参数都是客户端(浏览器)和服务器之间的通讯协议。
我们可以通过requests库和ChromeDriver模拟这个请求,获取热门话题列表的HTML代码。代码如下:
```python
import time
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
# 设置ChromeDriver路径
PATH = '/usr/local/bin/chromedriver'
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
# 模拟浏览器操作获取热门话题列表的HTML代码
def get_html():
# 初始化浏览器驱动
driver = webdriver.Chrome(PATH)
# 打开微博热门话题首页
driver.get('https://weibo.com/a/hot/realtime')
# 模拟点击“加载更多”
for i in range(3):
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(1)
# 获取当前页面的HTML代码
html = driver.page_source
# 关闭浏览器驱动
driver.quit()
return html
# 解析HTML代码并提取热门话题信息
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
topics = soup.find_all('div', class_='UG_list_b')
for topic in topics:
link = topic.find('a').get('href')
title = topic.find('a').text.strip()
print(link, title)
if __name__ == '__main__':
html = get_html()
parse_html(html)
```
运行以上代码可以看到在控制台中输出了微博热门话题的链接和标题。
3. 获取热门话题页面数据
在得到热门话题列表之后,我们需要进一步获取每个热门话题页面的相关数据。在第2步中我们已经获得了每个热门话题的URL,现在我们需要针对每个URL发送请求并获取响应,同时解析HTML代码获取页面数据。
代码如下:
```python
# 获取热门话题页面的HTML代码
def get_topic_html(topic_url):
resp = requests.get(topic_url, headers=headers)
html = resp.content.decode('utf-8')
return html
# 解析热门话题页面的HTML代码并提取相关数据
def parse_topic_html(html):
soup = BeautifulSoup(html, 'html.parser')
# 获取热门话题内容
content = soup.find('div', class_='WB_detail').find('div', class_='WB_text W_f14').text.strip()
# 获取热门话题相关微博数、讨论数、阅读数等信息
stats = soup.find('div', class_='WB_handle').find_all('li')
info = {}
for stat in stats:
title = stat.find('span', class_='title').text.strip()
value = stat.find('em').text.strip()
info[title] = value
return content, info
if __name__ == '__main__':
# 获取热门话题列表
html = get_html()
soup = BeautifulSoup(html, 'html.parser')
topics = soup.find_all('div', class_='UG_list_b')
# 遍历热门话题列表并获取每个热门话题页面的数据
for topic in topics:
link = topic.find('a').get('href')
title = topic.find('a').text.strip()
topic_url = 'https://weibo.com' + link
# 获取热门话题页面的HTML代码
topic_html = get_topic_html(topic_url)
# 解析热门话题页面的HTML代码并提取相关数据
content, info = parse_topic_html(topic_html)
print('##', title)
print('热门话题内容:', content)
print('微博数:', info.get('微博数', 0))
print('讨论数:', info.get('讨论数', 0))
print('阅读数:', info.get('阅读数', 0))
print()
```
运行以上代码可以看到在控制台中输出了每个热门话题的相关数据。
到此为止,我们已经成功使用Python爬虫获取了微博上热门话题的相关信息。通过这个练习,我们不仅学到了如何使用requests库发送HTTP请求和获取响应,也学习了如何使用BeautifulSoup库解析HTML和XML文档,以及如何使用ChromeDriver模拟浏览器操作。