一个简单的爬虫,爬取豆瓣上某部电影的所有评论及计算评分

本文分享了使用Java爬取豆瓣网页数据的过程,包括解决503错误、模拟登录、计算评分的简易方法。通过分析网页特点,截取关键字,实现了对《云南虫谷》电影评分的自动获取。

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

1.一个狗血的背景:这几天都在盼望着《云南虫谷》上映,早就想去看(奈何这是一部大烂片)。在看电影之前习惯性的先在豆瓣上看看评分,以免被坑。可是迟迟的等不到豆瓣的评分结果,所以决定自己爬取页面,来计算一下。(感谢web端还没有完全退出历史舞台)。

2.过程:
2.1 想起前几天好像在鼓捣Linux的时候,无意间执行了一个命令,把百度的首页面的html全都下载下来了。那就好办了。用java的HttpURLConnection类去访问网站并且用流读取网页。然后将其看成一个字符串,截取关键字,不就ok了(反正也是玩玩,就不用那种按页面的标签去遍历和获取内容了,用python更合适的)。
2.2 StringBuffer html = new StringBuffer(); URL url = new URL(urlString);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(isr);
            String temp;
            while ((temp = br.readLine()) != null) {
                html.append(temp).append("/n");
            }
            br.close();
            isr.close();
            String eveyHtml = html.toString();

这是核心的代码了。可是在访问的时候却报错503,服务器被禁止了,没有登录的原因。
2.3 在访问网页的时候加上这几行代码

conn.setRequestProperty("User-Agent","xxxxxx")
conn.setRequestProperty("Cookie","xxxxx")

登录状态的,在浏览器中F12可以获取到以上的两个属性。
2.4 现在开始执行main方法,可是在执行一段时间以后,依然是503 并且,手动在浏览器登录,也被禁止访问豆瓣,自己的账号登录也被禁止了。(大概是被豆瓣封ip了),于是在每次的执行完一页的时候“休息”3秒钟

Thread.sleep(3000);

这样就好了。
2.5 接下来计算评分和评论,就要看豆瓣网页的特点了。
在这里插入图片描述

在这里插入图片描述
所以呢

 String[] chaArry = srcText.split("class=\"short\">");
        String comment = chaArry[1].substring(0, chaArry[1].indexOf("</"));

就得到了评论的内容和每页的各种得分了。

2.6 至于计算豆瓣的评分的规则,是早期看到豆瓣CEO的一篇文章的时候他的简单介绍,现在肯定有高级的算法过滤掉一些水军的评论。这里只是简单的计算了一下

 double oneStarPoint = (one / total) * oneInit;
            double twoStarPoint = (two / total) * twoInit;
            double threeStarPoint = (three / total) * threeInit;
            double fourStarPoint = (four / total) * fourInit;
            double fiveStarPoint = (five / total) * fiveInit;
            //假设每颗星相当于2分,则改电影的豆瓣评分
            double scoreTotal = (oneStarPoint + twoStarPoint + threeStarPoint + fourStarPoint + fiveStarPoint)
                    * twoInit;
            System.out.println("《云南虫谷》电影的豆瓣评分为:" + scoreTotal);
            return oneStarTotal;

2.7 最后开始运行
在这里插入图片描述

### 使用 Scrapy 抓取豆瓣电影的用户评论评分 要实现抓取豆瓣电影的用户评论评分,可以按照以下方法完成: #### 1. 创建 Scrapy 项目 首先需要创建一个新的 Scrapy 项目。打开终端并运行以下命令: ```bash scrapy startproject douban_movie ``` 这将在当前目录下生成一个名为 `douban_movie` 的项目文件夹。 #### 2. 制作爬虫文件 进入项目的 `spiders` 文件夹,并生成一个用于爬取豆瓣 Top 250 页面的爬虫文件: ```bash cd douban_movie/spiders/ scrapy genspider douban_spider https://movie.douban.com/top250 ``` 此操作会自动生成一个名为 `douban_spider.py` 的爬虫文件[^4]。 #### 3. 明确目标数据结构 (Items) 在 Scrapy 中,可以通过定义 Items 来指定需要提取的数据字段。编辑 `items.py` 文件,添加如下内容以保存电影名称、评分评论信息: ```python import scrapy class DoubanMovieItem(scrapy.Item): movie_name = scrapy.Field() # 电影名称 rating = scrapy.Field() # 用户评分 comment = scrapy.Field() # 用户评论 ``` #### 4. 编写爬虫逻辑 修改 `douban_spider.py` 文件中的爬虫类,使其能够解析页面并提取所需的信息。以下是完整的爬虫代码示例: ```python import scrapy from ..items import DoubanMovieItem class DoubanSpider(scrapy.Spider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): items = [] movies = response.css('div.item') # 提取每部电影的相关信息 for movie in movies: item = DoubanMovieItem() title = movie.css('.title::text').get().strip() # 获取电影名 rating = movie.css('.rating_num::text').get().strip() # 获取评分 comments_url = movie.css('a::attr(href)').get() # 进入详情页获取更多评论 yield scrapy.Request(comments_url, callback=self.parse_comments, meta={'item': item}) next_page = response.css('span.next a::attr(href)').get() # 处理分页 if next_page is not None: yield response.follow(next_page, self.parse) def parse_comments(self, response): item = response.meta['item'] # 继续填充 Item 数据 comments = response.css('#hot-comments span.short::text').extract()[:5] # 只提取前五条评论 item['comment'] = comments # 将评论存入 Item yield item # 返回最终结果 ``` 上述代码实现了两个主要功能:一是从首页提取电影基本信息;二是跳转至具体电影页面抓取热门评论[^2]。 #### 5. 存储抓取的内容 (Pipeline) 为了将抓取到的数据持久化存储,在 `pipelines.py` 文件中编写管道逻辑。例如将其保存为 JSON 文件: ```python import json class JsonWriterPipeline(object): def open_spider(self, spider): self.file = open('movies.json', 'w') def close_spider(self, spider): self.file.close() def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + "\n" self.file.write(line) return item ``` 最后记得激活该 Pipeline,在 `settings.py` 文件中找到 `ITEM_PIPELINES` 并配置: ```python ITEM_PIPELINES = {'douban_movie.pipelines.JsonWriterPipeline': 300} ``` #### 6. 执行爬虫 返回根目录执行以下命令启动爬虫: ```bash scrapy crawl douban -o output.csv ``` 以上流程涵盖了从初始化项目到实际部署整个过程[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值