Python 爬虫实战:如何爬取豆瓣 Top 250 电影信息? 随着互联网的发展,爬虫技术已经逐渐渗透到我们的生活中。本文将介绍如何使用 Python 爬虫技术爬取豆瓣 Top 250 电影信息。 一、简介 豆瓣是一个国内知名的社交化媒体电影评价网站,旗下有一个叫做 Top 250 的排行榜,其中收录了 250 部经典电影。我们可以通过爬虫技术将这些电影的信息收集下来,供我们学习和参考。 二、准备工作 在开始之前,我们需要安装几个必要的库: 1. requests:用于发送 HTTP 请求和处理响应。 2. BeautifulSoup:用于解析 HTML 文档。 可以使用 pip 命令进行安装: ``` pip install requests beautifulsoup4 ``` 除了以上两个库,我们还需要准备一个代理 IP 池。因为如果我们在短时间内过多地请求豆瓣服务器,豆瓣服务器就会认为我们是恶意爬虫,从而封禁我们的 IP。所以我们需要自己编写代码,从某些网站上获取代理 IP,并将其设置为 requests 库的代理 IP。 三、代码实现 1. 获取代理 IP 考虑到豆瓣的反爬虫机制,我们需要先获取代理 IP,并将其设置为 requests 库的代理 IP。在这个过程中,我们需要访问以下两个网站,从中获取代理 IP:https://www.xicidaili.com/ 和 https://www.kuaidaili.com/ 。 下面是获取代理 IP 的代码: ``` import requests import time from bs4 import BeautifulSoup # 获取代理IP def get_proxy_ip(): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} url = 'https://www.xicidaili.com/nn/' r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') table = soup.find_all('table')[0] trs = table.find_all('tr')[1:] proxies = [] for tr in trs: tds = tr.find_all('td') ip = tds[1].text.strip() port = tds[2].text.strip() protocol = tds[5].text.strip() proxy = {'protocol': protocol, 'ip': ip, 'port': port} proxies.append(proxy) return proxies ``` 其中,我们使用 requests 库发送 HTTP 请求,并使用 BeautifulSoup 库解析 HTML 文档。在解析过程中,我们使用了 CSS 选择器语法来定位到代理 IP 的位置。最终,我们将获取到的代理 IP 存储在列表 proxies 中,并返回该列表。 2. 爬取 Top 250 电影信息 下面是爬取 Top 250 电影信息的代码: ``` import requests import time from bs4 import BeautifulSoup # 获取代理IP def get_proxy_ip(): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} url = 'https://www.xicidaili.com/nn/' r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') table = soup.find_all('table')[0] trs = table.find_all('tr')[1:] proxies = [] for tr in trs: tds = tr.find_all('td') ip = tds[1].text.strip() port = tds[2].text.strip() protocol = tds[5].text.strip() proxy = {'protocol': protocol, 'ip': ip, 'port': port} proxies.append(proxy) return proxies # 获取电影信息 def get_movie_info(url, proxies): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} proxy = proxies[0] protocol = proxy.get('protocol') ip = proxy.get('ip') port = proxy.get('port') proxy_url = protocol + '://' + ip + ':' + port proxies = {'http': proxy_url, 'https': proxy_url} try: r = requests.get(url, headers=headers, proxies=proxies, timeout=10) if r.status_code == 200: soup = BeautifulSoup(r.text, 'html.parser') item = {} item['rank'] = soup.find_all('span', {'class': 'top250-no'})[0].text.strip() item['title'] = soup.find_all('span', {'property': 'v:itemreviewed'})[0].text.strip() item['director'] = soup.find_all('span', {'class': 'attrs'})[0].text.strip() item['actors'] = soup.find_all('span', {'class': 'actor'})[0].text.strip() item['country'] = soup.find_all('span', {'class': 'pl'}, text='制片国家/地区:')[0].next_sibling.strip() item['year'] = soup.find_all('span', {'class': 'year'})[0].text.strip() item['score'] = soup.find_all('strong', {'class': 'rating_num'})[0].text.strip() return item except: return None # 获取所有电影信息 def get_all_movie_info(): proxies = get_proxy_ip() movies = [] for i in range(10): url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter=' item = get_movie_info(url, proxies) if item is not None: movies.append(item) else: proxies.pop(0) return movies # 输出结果 def output_result(movies): for movie in movies: print('排名:', movie['rank']) print('名称:', movie['title']) print('导演:', movie['director']) print('主演:', movie['actors']) print('制片国家/地区:', movie['country']) print('上映年份:', movie['year']) print('评分:', movie['score']) print() if __name__ == '__main__': movies = get_all_movie_info() output_result(movies) ``` 在爬取电影信息的过程中,我们使用了代理 IP,防止被豆瓣的反爬虫机制封禁。我们在发送 HTTP 请求时将代理 IP 设置为 requests 库的代理 IP。如果在爬取的过程中发生异常,我们就将代理 IP 列表中的第一个代理 IP 删除,并重新发送请求。此外,我们还针对每一个电影信息,使用 BeautifulSoup 库解析 HTML 文档,并使用 CSS 选择器语法定位到需要爬取的信息。 最终,我们将获取到的电影信息存储在一个列表 movies 中,并调用 output_result 函数输出结果。 四、总结 本文介绍了如何使用 Python 爬虫技术爬取豆瓣 Top 250 电影信息。我们使用了 requests 和 BeautifulSoup 库,在爬取的过程中使用了代理 IP,防止被豆瓣的反爬虫机制封禁。希望这篇文章能够对大家学习 Python 爬虫技术有所帮助。