爬虫-豆瓣电影-一周口碑榜-爬取

本文介绍了一种使用Python和lxml库抓取豆瓣电影口碑排行榜数据的方法,通过分析网页结构并应用XPath表达式,成功获取了榜单上的电影名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# encoding: utf-8
"""
@version: 0.1
@author: 
@site: 
@software: PyCharm
@file: dpubanYizhouKoubei.py
@time: 2020-06-01 8:47
"""

from lxml import etree
import requests

urls = ['https://movie.douban.com/']
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'

session = requests.Session()

with session:
    for url in urls:
        response = session.get(url, headers={'User-Agent': ua})

        content = response.text.encode('utf-8')
        # print(content)

        # xpath //div[@class='billboard']//tr//td/a/text()
        html = etree.HTML(content)
        # titles = html.xpath("//div[@class='billboard-bd']//tr//td/a/text()")
        titles = html.xpath("//div[@class='billboard-bd']//tr")

        for title in titles:
            txt = title.xpath('.//text()')

            print(''.join(map(lambda x: x.strip(), txt)))
            print('-'*30)

爬取结果:

1隐秘的爱
------------------------------
2梦之城堡
------------------------------
3普拉吉布雷劳
------------------------------
4瘦身大作战
------------------------------
5你会在20岁时死去
------------------------------
6勒热夫战役
------------------------------
7圣·弗朗西斯
------------------------------
8杀不了的他与死不了的她
------------------------------
9闭锁病房
------------------------------
10兄弟会
------------------------------

需爬取内容截图:

路径分析:

### 使用 Python 爬虫获取豆瓣电影周口单的用户评价 为了实现这目标,可以采用 `requests` 库发送 HTTP 请求并接收响应,再利用 `BeautifulSoup` 解析 HTML 文档。考虑到反爬机制的存在,在构建爬虫时还需要注意设置合理的请求头以及适当的时间间隔。 #### 准备工作 安装必要的库: ```bash pip install requests beautifulsoup4 lxml ``` 导入所需模块,并定义些基本参数: ```python import time import random import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } base_url = "https://movie.douban.com/j/chart/top_list" params = {"type": "", "interval_id": "100:90", "action": ""} comments_base_url = "https://movie.douban.com/subject/{}/reviews?start={}" ``` #### 获取影片 ID 列表 由于直接从页面上抓取每部电影的具体链接较为复杂,这里可以通过 API 接口获得 Top 单中的电影 ID[^1]。 ```python def get_movie_ids(): movie_ids = [] params['limit'] = 20 # 假设每次最多返回20条记录 response = requests.get(base_url, headers=headers, params=params).json() while True: movies = response.get('data', []) if not movies or len(movies) < int(params['limit']): break for item in movies: movie_ids.append(str(item["id"])) start += int(params['limit']) params.update({"start": str(start)}) time.sleep(random.uniform(1, 3)) # 随机等待段时间防止被封禁IP return list(set(movie_ids)) ``` #### 抓取评论信息 对于每电影,构造其对应的短评 URL 并发起 GET 请求;解析得到的结果以提取有用的信息字段,如用户名、评分等级及时刻戳等。 ```python def fetch_comments(movie_id): comments = [] page_num = 0 per_page = 20 # 每页显示数量可根据实际情况调整 url_pattern = comments_base_url.format(movie_id, "{}") while True: try: resp = requests.get(url_pattern.format(page_num * per_page), headers=headers) soup = BeautifulSoup(resp.text, 'lxml') review_items = soup.select('.review-item') if not review_items: break for ri in review_items: user_name = ri.find(class_='name').text.strip() rating_star = ri.find(class_='main-title-rating')['class'][0][-2:] comment_time = ri.find(class_='main-meta').text.strip() single_comment = {'user': user_name, 'rating': rating_star, 'time': comment_time} comments.append(single_comment) page_num += 1 time.sleep(random.randint(2, 5)) except Exception as e: print(f'Error occurred when fetching {movie_id}\'s reviews:', repr(e)) continue return comments ``` #### 数据存储与展示 最后步就是将收集到的数据保存下来供后续分析使用,可以选择 JSON 文件格式以便于读写操作。 ```python if __name__ == '__main__': all_data = {} ids = get_movie_ids()[:10] # 只处理前十个ID用于测试目的 for mid in ids: result = fetch_comments(mid) all_data[mid] = result with open('./douban_weekly_top_reviews.json', mode='w+', encoding='utf-8') as f: json.dump(all_data, fp=f, ensure_ascii=False, indent=4) print("Data collection completed.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值