type
status
date
slug
summary
tags
category
icon
password
爬取豆瓣筛选电影
1. 了解请求的参数
在开始爬取之前,首先需要了解访问豆瓣电影页面所需的请求参数。这通常包括查询字符串、分页信息、排序方式等。可以通过浏览器的开发者工具(F12)来查看具体的请求URL和参数。
- URL 和路径:找到目标页面的基本URL。
- 查询参数:如
start
(分页)、sort
(排序方式,比如按评分、按热度等)、genres
(类型)等。
- Headers:一些必要的头信息,如User-Agent、Cookies(如果需要登录的话)。
2. 分析请求的目标
明确你想要获取的信息,比如电影的标题、导演、主演、评分、评论数等。确定这些信息在网页中的位置,比如在HTML中的哪个标签或类名下。
3. 收集所需的信息或资源
编写代码以发送HTTP请求并收集数据。这通常使用Python库如requests获取网页源代码,然后用BeautifulSoup或lxml解析HTML。
import requests import json import brotli import pprint # 设置请求的URL for i in range(0, 200, 20): url = "<https://m.douban.com/rexxar/api/v2/movie/recommend>" # 设置查询参数 params = { 'refresh': '0', 'start': i, 'count': '20', 'selected_categories': '{"类型":"喜剧","地区":"华语"}', 'uncollect': 'false', 'tags': '喜剧,华语' } # 设置请求头 headers = { 'authority': 'm.douban.com', 'content-type': 'application/json;charset=UTF-8', 'method': 'GET', 'scheme': 'https', 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7', 'cookie': 'll="118249"; __utma=30149280.1322661629.1680093798.1693740274.1696601757.3; bid=xeizLvc9md8; viewed="5367706_3810699_36071759"; ap_v=0,6.0', 'origin': '<https://movie.douban.com>', 'priority': 'u=1, i', 'referer': '<https://movie.douban.com/explore>', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' } # 发送GET请求 response = requests.get(url, params=params, headers=headers) # 检查Content-Encoding是否是Brotli content_encoding = response.headers.get('Content-Encoding') if content_encoding == 'br': try: # 如果是Brotli编码,尝试解压缩 decompressed_data = brotli.decompress(response.content) response_text = decompressed_data.decode('utf-8') except brotli.error as e: # print(f"Brotli解压缩失败: {e}") response_text = response.content.decode('utf-8', errors='ignore') else: # 如果不是Brotli编码,使用 requests 自动推断编码 response.encoding = response.apparent_encoding response_text = response.text # 尝试解析为JSON try: response_json = json.loads(response_text)['items'] # 便利输出 for item in response_json: if item['rating']['value'] > 8.0: print(str(item['title']) + ":" + str(item['rating']['value'])) # pprint.pprint(response_json) except json.decoder.JSONDecodeError: print("响应内容不是有效的JSON格式")
4. 处理或分析收集到的信息
一旦成功收集到数据,你就可以进行处理和分析:
- 解析JSON或HTML:根据返回的数据格式解析信息。
- 提取所需字段:从数据中提取关键信息,如电影名称、评分等。
- 存储数据:将数据存入CSV文件、数据库或其他存储系统中,以便后续分析。
import csv import json import requests import brotli # 设置请求的URL url = "<https://m.douban.com/rexxar/api/v2/movie/recommend>" # 创建一个空列表来存储电影信息 movies_list = [] # 循环分页请求 for i in range(0, 200, 20): # 设置查询参数 params = { 'refresh': '0', 'start': i, 'count': '20', 'selected_categories': '{"类型":"喜剧","地区":"华语"}', 'uncollect': 'false', 'tags': '喜剧,华语' } # 设置请求头 headers = { 'authority': 'm.douban.com', 'content-type': 'application/json;charset=UTF-8', 'method': 'GET', 'scheme': 'https', 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7', 'cookie': 'll="118249"; __utma=30149280.1322661629.1680093798.1693740274.1696601757.3; bid=xeizLvc9md8; viewed="5367706_3810699_36071759"; ap_v=0,6.0', 'origin': '<https://movie.douban.com>', 'priority': 'u=1, i', 'referer': '<https://movie.douban.com/explore>', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' } # 发送GET请求 response = requests.get(url, params=params, headers=headers) # 检查Content-Encoding是否是Brotli content_encoding = response.headers.get('Content-Encoding') if content_encoding == 'br': try: # 如果是Brotli编码,尝试解压缩 decompressed_data = brotli.decompress(response.content) response_text = decompressed_data.decode('utf-8') except brotli.error as e: response_text = response.content.decode('utf-8', errors='ignore') else: response.encoding = response.apparent_encoding response_text = response.text # 尝试解析为JSON try: response_json = json.loads(response_text)['items'] # 筛选评分大于8.0的电影并添加到列表中 for item in response_json: if item['rating']['value'] > 8.0: movies_list.append({ 'title': item['title'], 'rating': item['rating']['value'], 'url': item['url'] }) except json.decoder.JSONDecodeError: print("响应内容不是有效的JSON格式") # 将收集到的电影信息写入CSV文件 with open('douban_movies.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) # 写入表头 writer.writerow(['Title', 'Rating', 'URL']) # 写入每部电影的信息 for movie in movies_list: writer.writerow([movie['title'], movie['rating'], movie['url']])
注意事项:
- 法律与道德:遵守网站的robots.txt规则和相关法律法规,不要进行过于频繁的抓取。
- 反爬机制:可能需要解决验证码或使用代理IP来防止被禁止访问。
- 隐私问题:不要抓取用户隐私信息,并确保合规地使用抓取的数据。
- 作者:悟然
- 链接:https://notion.zyqn.site/article/%E7%88%AC%E8%99%AB
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。