爬取豆瓣电影尝试

        利用python爬取豆瓣电影,在学习了python基础后,一心想着快速入门爬虫,现找了个豆瓣电影来练手。

1.找到网页并分析网页结构



首先进入豆瓣电影Top250这个网页,按下f12打开开发者工具,如下图




1802039651.png




然后开始分析网页,点击开发者工具左上角的有个箭头的东西去找你需要找的数据,在这里我发现每个电影的信息都是在<li>的标签内,所以可以用正则表达式来先提取每一个电影,然后在分别提取每个电影中的数据。每个电影现在的数据都可以获取了,但是这个url只有25个电影,怎样获取下一页的呢?这里我们可以在每个页面获取下一页的链接,然后通过循环来继续获取下一页的电影数据即可




1802039785.png


我们可以先用开发者工具的箭头点一下后页,然后就显示右边的箭头数据出来,这里我们也可以用正则表达式来获取下一页的链接,然后接下来的工作就是循环了,好了分析结束,开始敲代码吧!



2.用面向对象的方法进行爬取数据



先用requests对网页进行请求,获取网页的html结构,在这里,为了防止网页的反爬虫技术,我加了个请求头

(记得使用requests库之前先导入,没有的可以在命令行通过 pip install requests 进行下载)


1802035432.png




请求头在开发者工具中查看,如下图所示




1802037188.png




接下用正则表达式进行获取数据



先匹配每一个电影和每一页数据(使用正则表达式的库是re)


1802033229.png


1802034633.png




接下来获取每个电影的数据
1802036920.png


1802034583.png




注意:获取到上面的数据,有的是空的,所以还需要进行判断是否为空,为了好看,我用了三元表达式进行判断,完成之后把他们存入字典
1802038436.png




接下来就是进行循环取下一页的数据了
1802039430.png




3.如果你有点数据库基础的话,还可以把他们存入数据库,在这里我把这些数据存入MySQL数据库,代码如下,需要自己先建好数据库好表格



这是操作数据库的类(使用的库为pymysql)
1802034586.png


1802036544.png




然后回到爬虫类进行把数据存入数据库


1802033864.png





4.成功后你就会在数据库中查到以下数据
1802032445.png




### 豆瓣电影Top300爬取方法 豆瓣电影Top250是一个固定的数据集合,而Top300并不是官方提供的一个独立分类。因此,要获取Top300的数据,可以通过扩展爬取逻辑来实现。以下是具体的方法和代码: #### 方法概述 由于豆瓣网站的结构限制,Top250页面仅提供前250部电影的信息。为了获取额外的50部电影信息,可以考虑以下两种方式: 1. **通过其他分类页面**:访问豆瓣的高分电影或其他热门电影分类页面,从中筛选符合条件的电影。 2. **模拟翻页行为**:利用Selenium等工具动态加载更多页面内容。 下面分别给出Scrapy框架和Selenium库的解决方案。 --- #### 使用Scrapy框架爬取Top300数据 ##### 修改入口URL 在`start_urls`中加入多个分类页面链接,以便覆盖更多的电影资源[^4]。 ```python import scrapy class DoubanSpider(scrapy.Spider): name = 'douban_top300' allowed_domains = ['movie.douban.com'] # 添加多个起始URL以扩大范围 start_urls = [ 'https://movie.douban.com/top250', 'https://movie.douban.com/subject_collection/movie_watched_by_most?sort=time&tag=%E7%83%AD%E9%97%A8&page_limit=100&page_start=0', 'https://movie.douban.com/tag/%E7%BE%BD%E7%BB%B4%E7%89%87?page=1&type=S' ] def parse(self, response): movies = response.css('.item') for movie in movies: title = movie.css('.hd a span::text').extract_first() rating = movie.css('.rating_num::text').extract_first() description = movie.css('.bd p::text').extract_first() yield { 'title': title, 'rating': rating, 'description': description } # 自动翻页功能 next_page = response.css('link.next::attr(href)').get() if next_page is not None: yield response.follow(next_page, callback=self.parse) ``` 此代码片段会从多个分类页面提取数据,并尝试自动跳转至下一页继续采集[^1]。 --- #### 使用Selenium动态加载Top300数据 当目标网页依赖JavaScript渲染时,推荐使用Selenium作为替代方案。以下是完整的代码示例: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class DouBanTop300: def __init__(self): options = webdriver.ChromeOptions() options.add_argument('--headless') # 隐藏浏览器窗口 self.driver = webdriver.Chrome(options=options) def fetch_data(self): base_url = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start={}' all_movies = [] for page in range(0, 15): # 假设每页20条记录,共需爬取15页 url = base_url.format(page * 20) self.driver.get(url) try: wait = WebDriverWait(self.driver, 10) elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'list-item'))) for element in elements: title = element.find_element(By.CSS_SELECTOR, '.title').text score = element.find_element(By.CSS_SELECTOR, '.rate').text all_movies.append({ 'title': title, 'score': float(score) if score else None }) except Exception as e: print(f"Error occurred on page {page}: {e}") return all_movies[:300] if __name__ == '__main__': crawler = DouBanTop300() data = crawler.fetch_data() print(len(data), "movies fetched.") ``` 这段代码通过遍历探索页面中的不同标签类别,逐步积累足够的电影数量直至达到300条[^5]。 --- #### 数据存储与可视化 完成数据收集后,可将其保存到CSV文件并绘制图表分析结果。例如统计评分分布情况: ```python import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame(data) ratings_distribution = df['score'].value_counts().sort_index() plt.bar(ratings_distribution.index, ratings_distribution.values, color='blue') plt.xlabel('Score') plt.ylabel('Number of Movies') plt.title('Distribution of Movie Ratings') plt.xticks(rotation=45) plt.tight_layout() plt.show() ``` 以上脚本能够直观展现所获数据的质量特征[^3]。 --- ### 注意事项 - 爬虫频率应适当降低以免触发反爬机制。 - 尊重目标站点的服务条款,合法合规地开展活动。 - 若涉及大量并发请求建议部署代理池减少IP封禁风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值