您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 怎么用Python爬取美团旅游景点评论数据
在旅游行业大数据分析中,用户评论数据蕴含着巨大的商业价值。本文将详细介绍如何使用Python爬取美团旅游景点评论数据,包括技术选型、反爬策略和完整代码实现。
## 一、爬虫技术选型
### 1.1 核心工具
- **Requests**:处理HTTP请求
- **BeautifulSoup**/lxml:HTML解析
- **Selenium**:应对动态渲染页面
- **PyMySQL**:数据存储
### 1.2 辅助工具
```python
pip install requests beautifulsoup4 selenium pymysql
美团景点评论页典型URL格式:
https://www.meituan.com/meishi/123456/review/all/
其中123456为景点ID
import requests
def get_page(poi_id, page):
    url = f"https://www.meituan.com/meishi/{poi_id}/review/all/"
    params = {
        "pageno": page,
        "sortType": "default"
    }
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
        "Referer": "https://www.meituan.com/"
    }
    try:
        response = requests.get(url, params=params, headers=headers)
        response.raise_for_status()
        return response.text
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None
from bs4 import BeautifulSoup
def parse_comments(html):
    soup = BeautifulSoup(html, 'lxml')
    comments = []
    
    for item in soup.select('.reviews-list .review-item'):
        try:
            comment = {
                'username': item.select_one('.name').text.strip(),
                'score': int(item.select_one('.score').text),
                'content': item.select_one('.desc').text.strip(),
                'visit_time': item.select_one('.time').text.split(':')[-1],
                'like_count': int(item.select_one('.like').text or 0)
            }
            comments.append(comment)
        except Exception as e:
            print(f"解析出错: {e}")
    
    return comments
当发现直接请求无法获取数据时,需要使用Selenium:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_dynamic_page(poi_id, page):
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(options=chrome_options)
    
    url = f"https://www.meituan.com/meishi/{poi_id}/review/all/?pageno={page}"
    driver.get(url)
    driver.implicitly_wait(5)
    
    html = driver.page_source
    driver.quit()
    return html
import time
import random
def safe_request(url):
    time.sleep(random.uniform(1, 3))
    return requests.get(url)
CREATE TABLE `meituan_comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `poi_id` varchar(20) NOT NULL,
  `username` varchar(50) DEFAULT NULL,
  `score` tinyint(1) DEFAULT NULL,
  `content` text,
  `visit_time` varchar(50) DEFAULT NULL,
  `like_count` int(11) DEFAULT 0,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_poi` (`poi_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
import pymysql
def save_to_db(comments, poi_id):
    conn = pymysql.connect(
        host='localhost',
        user='root',
        password='yourpassword',
        db='spider_data',
        charset='utf8mb4'
    )
    
    try:
        with conn.cursor() as cursor:
            sql = """INSERT INTO meituan_comments 
                     (poi_id, username, score, content, visit_time, like_count) 
                     VALUES (%s, %s, %s, %s, %s, %s)"""
            for comment in comments:
                cursor.execute(sql, (
                    poi_id,
                    comment['username'],
                    comment['score'],
                    comment['content'],
                    comment['visit_time'],
                    comment['like_count']
                ))
        conn.commit()
    finally:
        conn.close()
def main():
    poi_id = "123456"  # 实际景点ID
    max_page = 10      # 最大爬取页数
    
    for page in range(1, max_page+1):
        print(f"正在爬取第{page}页...")
        
        # 优先尝试普通请求
        html = get_page(poi_id, page)
        if not html or "验证码" in html:
            html = get_dynamic_page(poi_id, page)
        
        if html:
            comments = parse_comments(html)
            save_to_db(comments, poi_id)
            print(f"成功保存{len(comments)}条评论")
        else:
            print(f"第{page}页爬取失败")
        
        time.sleep(random.uniform(2, 5))
if __name__ == "__main__":
    main()
通过以上方法,您可以有效获取美团旅游景点评论数据。建议单日爬取量控制在1000条以内,避免对目标网站造成负担。获取的数据可用于景点服务质量分析、用户偏好研究等商业智能场景。 “`
注:实际使用时需要根据美团网页结构变化调整CSS选择器,并确保遵守相关法律法规。建议在爬取前检查网站的服务条款。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。