requests + BeautifulSoup爬取豆瓣电影Top 250 数据
豆瓣电影Top 250网站: https:// movie.douban.com/top250
1、通过requests库获取网页源代码 ,关键代码如下:
def get_text_from_web(url):
print(url) # 打印当前访问的网址
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"} # 构建请求头
try: # 访问网络资源可能会抛出异常
res = requests.get(url, headers=header, timeout=10) # 发送请求
res.raise_for_status() # 如果状态码不是200则抛出异常
res.encoding = res.apparent_encoding # 设置编码格式,避免乱码
return res.text # 返回网页源代码
except Exception as e: # 捕获异常
print("抛出异常,", e) # 输出异常信息
关于requests库的详细介绍,可参考之前的文章: 网络爬虫之Requests库详解
2、对获取到的网页源代码进行解析,获取电影的相关信息 。例如电影名称、导演和演员、评分、评价人数、著名台词等。
这里主要是调用BeautifulSoup库中的相关方法,关键代码如下:
def parse_page_by_bs(text):
text = text.replace("<br>", "") # 删除<br>标签
soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象
movies = soup.select("div.info") # 获取所有的电影
res = [] # 保存所有电影信息
for movie in movies: # 依次遍历每一部电影
try:
titles = movie.select("span.title")
title_str = ""
for title in titles:
title_str = title_str + title.string
info = movie.select_one("div.bd").p.string.strip() # 获取电影信息
temp = movie.select("div.star span") # 获取评价信息
score = temp[1].string # 获取评分值
num = temp[3].string.replace("人评价", "") # 获取评价人数
quote = movie.select_one("span.inq") # 获取著名台词
if quote is not None: # 如果存在,则获取内容
quote = quote.string
else: # 否则,默认为空
quote = ""
res.append([title_str, info, score, num, quote]) # 一部电影一条记录
except Exception as e:
print(title_str, "抛出异常", e) # 输出异常信息
return res
关于BeautifulSoup库的详细介绍,可参考之前的文章: 网络爬虫之BeautifulSoup详解(含多个案例)
几个关键说明:
(1)电影基本信息即导演、主演、类型、国家等是整体放在一个段落中的,并且通过<br>标签进行换行,如果想完整的获取这些信息, 直接通过p.string是获取不到的 ,因为里面存在<br>标签,将文本分成了两部分,使得p标签存在多个子节点,此时通过p.string获取的内容为None。要想解决这个问题,可在解析之前将所有的<br>标签删除。
(2)在数据解析过程中,可能存在部分电影数据不完整,例如著名台词缺失,此时如果没有做相应的判断,将会导致程序出现异常,从而强制退出。因此 最好在数据解析的过程中添加异常处理 ,输出抛出异常的网页网址,这样可快速定位,同时程序不会强制退出,其他页面仍然能够正常访问。
3、抓取所有页面的电影数据,并保存到Excel文件中去 。通过单击页面下方的页码 3 、页码 4 和页码 1,观察网页地址的变化如下:
https:// movie.douban.com/top250? start=50 (第3页)
https:// movie.douban.com/top250? start=75 (第4页)
https:// movie.douban.com/top250? start=0 (第1页)
可知每页显示25条电影信息。因此只需要做一个循环改变start的传值即可访问所有的页面。关键代码如下:
base_url = "https://movie.douban.com/top250?start={}"
result = []
for i in range(0, 251, 25):
url = base_url.format(i)