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 爬虫技术有所帮助。