本文使用的语言为Python, 用到的几个模块有:BeautifulSoup(爬数据),pandas(数据处理),seaborn(可视化),部分图表由Tableau生成。
1. 数据获取
计划要抓取的字段包括:片名,导演,年份,国别,评分,评价数量,看过数量,想看数量,短评数量,长评数量。
需要抓取的影片信息有250条,每页25部影片,一共有10页。简单浏览网页不难发现,翻页的链接不需要从页面底端抓取,直接修改url参数即可。
例如,第二页的url只需要在base url后面加上?start={start}&filter=即可。因此,第一步的任务就是抓取榜单上的每一部电影的详细信息链接即可。同时,影片的排名信息也可以通过简单计数得到,不需要从页面中抓取。具体代码如下。
import requests
from bs4 import BeautifulSoup
from time import sleep
from csv import DictWriter
base_url = r'https://movie.douban.com/top250'
records = []
for start in [x*25 for x in range(10)]:
#Every single page
url = base_url+f'?start={start}&filter='
response = requests.get(url).text
soup = BeautifulSoup(response,'html.parser')
movies = soup.find(class_='grid_view').find_all('li')
rank=1+start
for movie in movies:
#Every single movie on the page
movie_link = movie.find(class_='info').find(class_='hd').find('a')['href']
movie_dict = {'rank':rank, 'link':movie_link}
records.append(movie_dict)
rank += 1
这样我们就得到了一个list, list中有250个dictionary,每个dictionary中有影片在榜单中的排名和影片详细信息页面链接。
下一步就是进一步从已经得到的链接中抓取影片的详细信息。具体代码如下,仔细分析html标签做简单的测试即可。注意,爬取数据的过程中要加上sleep(5),礼貌爬取,防止IP被封。
#Use the scapped link to further scrape movie details
for record in records:
rank = record.get('rank')
print(f'Scarpping rank {rank} of 250')
link = record.get('link')
response = requests.get(link).text
soup = Beau