匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python 爬虫实战:如何爬取豆瓣 Top 250 电影信息?

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