爬取猫眼 TOP100 电影并以 excel 格式存储

爬取目标

本文将提取猫眼电影 TOP100 排行榜的电影名称、时间、评分、图片等信息,URL 为http://maoyan.com/board/4,提取的结果我们以 excel 格式保存下来。

准备工作

保证电脑安装了 python3.6 和已经安装好了 requests 库、beautifulsoup 库和 openpyxl 库。
前期安装步骤可以参考:https://germey.gitbooks.io/python3webspider/1-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.html

爬取分析

打开http://maoyan.com/board/4我们会发现榜单主要显示 4 个数据:电影名、主演、上映时间和评分。
如图所示:榜单

网页下滑到最下方可以发现有分页的列表,我们点击一下第二页会发现页面的 URL 变成了http://maoyan.com/board/4?offset=10,比之前的页面多了一个 offset=10 的参数,而且页面显示的是排行 11-20 名的电影。

由此我们可以总结出规律,offset 代表了一个偏移量值,如果偏移量为 n,则显示的电影序号就是 n+1 到 n+10,每页显示 10 个。所以我们如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数设置为 0,10,20,…,90 即可,这样我们获取不同的页面结果之后再用正则表达式提取出相关信息就可以得到 TOP100 的所有电影信息了。

抓取首页

import requests

def get_one_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    return None

def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    print(html)

main()

这样我们就可以获取首页的源代码了,获取源代码之后我们要对页面进行解析,提取出我们想要的信息。

使用 BeautifulSoup 进行提取

接下来我们回到网页看一下页面的真实源码,在开发者工具中 Network 监听(建议使用谷歌浏览器,按 F12 即可查看网页信息),然后查看一下源代码。如图所示:

<think>好的,我现在需要帮助用户解决如何用Python爬取猫眼Top100榜单数据的问题。首先,我需要回顾用户提供的引用内容,确保回答符合他们的需求。用户之前提到了使用requests、re和openpyxl库,以及保存到excel和csv的方法,但现在的需求是获取方法或代码。首先,我得确定猫眼Top100的页面结构。猫眼可能有反爬措施,比如验证头或者动态加载数据。用户提到使用requests库,所以可能需要处理请求头和参数。同时,数据可能是动态加载的,但根据引用中的信息,用户之前的例子用了正则表达式,说明数据可能是静态HTML中的,不需要处理JavaScript渲染。 接下来,我需要考虑如何构造URL。猫眼Top100通常分页,每页10条,共10页。因此,需要循环生成10个URL,可能的形式是https://maoyan.com/board/4?offset=0,然后offset=10,依此类推。但需要验证这一点是否正确,或者是否有变化。 然后,解析HTML内容。用户之前使用re库,即正则表达式,可能因为页面结构简单,或者他们习惯用正则。但也可以考虑使用BeautifulSoup,不过用户示例中用了re,所以保持一致性可能更好。但需要确认正则表达式是否能正确提取数据。 数据存储方面,用户提到excel和csv,所以需要生成这两种格式的代码。可能需要使用openpyxl和csv模块。需要展示如何将数据写入这两种文件。 反爬机制方面,猫眼可能需要User-Agent和Cookie等请求头信息,否则可能返回403。所以在代码中需要添加headers,并提示用户替换自己的Cookie。 最后,代码的步骤需要分块解释:请求数据、解析数据、保存数据。同时,要提醒用户注意爬虫的伦理和法律问题,控制请求频率。现在,我需要检查是否有遗漏的部分。比如,分页处理是否正确,正则表达式是否能准确匹配电影名称、主演、上映时间等信息。例如,电影名称可能在<divclass="movie-item-info">中的<pclass="name">标签内,主演在<pclass="star">,上映时间在<p class="releasetime">。正则表达式需要匹配这些内容,并处理可能的空格或换行符。 测试代码是否能够正常运行,可能需要处理异常情况,比如网络错误或页面结构变化。但用户可能只需要基本的方法,所以代码示例可以简化,但需要注明注意事项。 总结步骤:构造分页URL,发送请求,解析响应,提取数据,存储数据。每一步用代码实现,并解释关键点。同时,提供两种存储方式的示例,excel和csv,供用户选择。现在,将这些思考整理成结构化的回答,确保代码正确,并符合用户的要求,比如使用中文,正确的LaTeX格式(虽然问题中没有数学内容,但需注意如果有变量的话),以及生成相关问题。</think>以下是通过Python爬取猫眼Top100榜单数据的完整方案: ### 一、技术实现步骤 1. **网页分析** 猫眼Top100榜单采用分页加载机制,URL格式为: `https://www.maoyan.com/board/4?offset={页码}` 每页展示10条数据,共需爬取10页(偏移量设置为0-90的等差数列) 2. **数据存储结构** 需要获取的字段包括: - 电影名称 - 主演名单 - 上映时间 - 评分 - 排名 3. **反爬机制处理** 需添加请求头信息,包含`User-Agent`和`Cookie`字段[^2] ### 二、完整代码实现 ```python import requests import re import csv from openpyxl import Workbook def get_data(): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Cookie": "替换为实际Cookie值" } all_data = [] for offset in range(0, 100, 10): url = f"https://www.maoyan.com/board/4?offset={offset}" response = requests.get(url, headers=headers) html = response.text # 正则表达式解析数据 pattern = re.compile( r'<p class="name">.*?>(.*?)</a>.*?' r'<p class="star">(.*?)</p>.*?' r'<p class="releasetime">(.*?)</p>.*?' r'<i class="integer">(.*?)</i>.*?' r'<i class="fraction">(.*?)</i>', re.S ) items = re.findall(pattern, html) for index, item in enumerate(items, start=offset+1): movie_data = { "排名": index, "名称": item[0].strip(), "主演": item[1].strip()[3:], # 去除"主演:"前缀 "上映时间": item[2].strip()[5:], # 去除"上映时间:" "评分": item[3].strip() + item[4].strip() } all_data.append(movie_data) return all_data # 保存到CSV def save_csv(data): with open("maoyan_top100.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=["排名","名称","主演","上映时间","评分"]) writer.writeheader() writer.writerows(data) # 保存到Excel def save_excel(data): wb = Workbook() ws = wb.active ws.append(["排名","名称","主演","上映时间","评分"]) for item in data: ws.append([item["排名"], item["名称"], item["主演"], item["上映时间"], item["评分"]]) wb.save("maoyan_top100.xlsx") if __name__ == "__main__": movie_data = get_data() save_csv(movie_data) save_excel(movie_data) ``` ### 三、关键注意事项 1. **Cookie获取** 需通过浏览器开发者工具(F12)获取当前有效Cookie,替换代码中的占位符 2. **请求频率控制** 建议添加`time.sleep(3)`避免触发反爬机制 3. **正则表达式更新** 若网站改版需调整匹配规则,推荐使用`BeautifulSoup`解析更稳定[^1] 4. **数据存储优化** - CSV格式适合快速查看 - Excel文件支持格式美化 - 可扩展数据库存储(MySQL/MongoDB)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值