从百度贴吧中任找一个有多人留言的贴子,通过urllib库和正则表达式获取每个发帖用户名(用户名记录在一个img标签的username属性值中)或昵称、发帖内容和发帖时间,以字典形式存放在一个列表中。
时间: 2024-10-01 13:08:35 浏览: 75
从百度贴吧中获取用户信息和帖子内容涉及到网络爬虫的技巧,这里提供一个基本的步骤和Python代码示例。请注意,实际操作时可能会因为百度贴吧的网页结构变动、反爬机制等原因导致部分代码失效,因此需要根据实际情况调整。
首先,你需要安装`urllib`、`re`(正则表达式库)以及可能的第三方库如`BeautifulSoup`来辅助解析HTML。假设百度贴吧的帖子页URL类似`http://tieba.baidu.com/p/<post_id>`。
1. 发送HTTP GET请求:
```python
import urllib.request
def fetch_post(post_url):
with urllib.request.urlopen(post_url) as response:
page_content = response.read().decode('utf-8')
```
2. 解析HTML内容:
```python
from bs4 import BeautifulSoup
def parse_post_content(html_content):
soup = BeautifulSoup(html_content, 'html.parser')
# 查找帖子内容区域,这通常是`post_body`或类似ID的div
post_body = soup.find('div', {'id': 'post_body'})
# 获取发帖内容
content = post_body.get_text()
# 获取发帖时间和用户名
timestamp = soup.find('span', {'class': 'time'}).text
username = None
try:
# 根据你的经验或尝试,寻找username可能的位置,这里假设它在某个img标签内
img_tag = soup.find('img', attrs={'class': 'avatar small'})
if img_tag:
username = img_tag['alt']
# 或者检查img标签的其他属性,如"data-src",看是否包含用户名信息
except Exception as e:
print(f"获取用户名出错:{e}")
return {
"用户名": username,
"内容": content,
"时间": timestamp,
}, content
# 示例使用
post_url = f"http://tieba.baidu.com/p/<post_id>"
parsed_data, full_content = parse_post_content(fetch_post(post_url))
```
3. 存储结果:
```python
def store_data(parsed_list):
data_dict_list = []
for parsed_data, content in parsed_list:
data_dict = {
"用户名": parsed_data["用户名"],
"内容": content,
"时间": parsed_data["时间"]
}
data_dict_list.append(data_dict)
return data_dict_list
# 获取多页帖子
def get_posts(post_urls, max_pages):
posts_data = []
for i in range(max_pages):
post_url = post_urls[i]
parsed_data, _ = parse_post_content(fetch_post(post_url)) # 忽略full_content,因为我们只需要一次完整的抓取
posts_data.append(parsed_data)
return posts_data
# 示例使用
post_urls = ["http://tieba.baidu.com/p/<post_id_1>", "http://tieba.baidu.com/p/<post_id_2>"]
posts_dicts = get_posts(post_urls, num_pages)
```
在这个例子中,我们假设`<post_id>`是帖子的唯一标识符,并且用户名在图片的`alt`属性或`data-src`中。实际操作时可能需要多次尝试,甚至使用更复杂的方法(如Selenium或使用API,如果有的话)来获取精确的用户名。
阅读全文