Python爬取豆瓣Top250电影

2021-07-09  本文已影响0人  爱写代码的小王子

前言:
最近在学习python的过程中,收获很多,特别是爬取网页信息,用到了BeautifulSoup这个库,它的功能很强大,是本次爬取豆瓣电影必不可少的工具。

那么BeautifulSoup是什么呢?
BeautifulSoup是Python的一个库,主要用来在网页中抓取数据,当然也可以用来处理导航,搜索,修改分析树的功能。

那么如何安装BeautifulSoup这个库呢?
BeautifulSoup最新的版本是BeautifulSoup4,已经移植到了bs4这个库里了,所有我们只需要导入bs4这个库,由于爬取出来的数据需要写入表格,这里我们使用python专门使用表格的库openpyxl

#首先安装bs4,openpyxl库
!pip install bs4
!pip install openpyxl

然后导入我们需要的库,具体需要的库有用于发送网络请求的requests库,还有正则表达式等等

import requests
import re
import codecs
from bs4 import BeautifulSoup
from openpyxl import Workbook

然后我们创建一个工作表,用来写入我们爬取的结果

wb = Workbook()
dest_filename = '电影2.xlsx'
ws = wb.active
ws.title = "电影top250"

需要爬取的豆瓣网的地址

DOWNLOAD_URL = 'http://movie.douban.com/top250/'

获取url地址页面内容

def downlaod_page(url):
    """获取url地址页面内容"""
    headers = {'User-Agent':'Mozilla/5.0(Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}
    data = requests.get(url,headers=headers).content
    return data

获取每一页电影的信息,包括电影名字,评价人数,评分,短评等等信息

def get_li(doc):
    soup = BeautifulSoup(doc,'html.parser')
    ol = soup.find('ol',class_='grid_view')
    name=[] # 名字
    star_con = [] #评价人数
    score = [] #评分
    info_list = [] #短评
    for i in ol.find_all('li'):
        detail = i.find('div',attrs={'class':'hd'})
        movie_name = detail.find('span',attrs={'class':'title'}).get_text() #电影名字
        level_star = i.find('span',attrs={'class':'rating_num'}).get_text() #评分
        star = i.find('div',attrs={'class':'star'})
        star_num = star.find(text=re.compile('评价')) #评价
        
        info = i.find('span',attrs={'class':'inq'}) #短评
        if info: #判断是否有短评
            info_list.append(info.get_text())
        else:
            info_list.append('无')
            
        score.append(level_star)
        name.append(movie_name)
        star_con.append(star_num)
        
    page = soup.find('span',attrs={'class':'next'}).find('a') #获取下一页
    if page:
        print(DOWNLOAD_URL + page['href'])
        return name,star_con,score,info_list,DOWNLOAD_URL + page['href']
    return name,star_con,score,info_list,None

最后将所有数据写入工作表并保存

def main():
    url = DOWNLOAD_URL
    name = []
    star_con = []
    score = []
    info = []
    while url:
        doc = downlaod_page(url)
        movie,star,level_num,info_list,url = get_li(doc)
        name = name + movie
        star_con = star_con + star
        score = score + level_num
        info = info + info_list
    for(i,m,o,p) in zip(name,star_con,score,info):
        col_A = 'A%s' % (name.index(i) + 1)
        col_B = 'B%s' % (name.index(i) + 1)
        col_C = 'C%s' % (name.index(i) + 1)
        col_D=  'D%s' % (name.index(i) + 1)
        ws1[col_A] = i
        ws1[col_B] = m
        ws1[col_C] = o
        ws1[col_D] = p
    wb.save(filename=dest_filename)

最后在程序的入口调用mian函数

if __name__ == '__main__':
    main()
        

爬取结果:


image.png

总结:在本次爬取的过程中,也遇到了许多问题,好在都一一解决了,感觉还是蛮有趣的,下来还需要深入理解这个过程。

上一篇 下一篇

猜你喜欢

热点阅读