python爬虫实战 | 爬取豆瓣TOP250排名信息

爬取目标

爬取豆瓣TOP250电影的评分、评价人数、短评等信息,并在其保存在txt文件中。

最终实现效果如图:
python爬虫实战 | 爬取豆瓣TOP250排名信息_第1张图片
注:这是在github上打开的效果,若用windows自带的记事本打开则会显示乱码。

确定爬取的URL

爬取的网页地址为:https://movie.douban.com/top250

打开网页后,可观察到:TOP250的电影被分成了10个页面来展示,每个页面有25个电影。

那么要爬取所有电影的信息,就需要知道另外9个页面的URL链接。

观察发现:
第2个页面的URL链接为:
python爬虫实战 | 爬取豆瓣TOP250排名信息_第2张图片
第三个页面的URL链接为:
python爬虫实战 | 爬取豆瓣TOP250排名信息_第3张图片
第4个URL链接为:
这里写图片描述
剩余的以此类推。

因此,出了第一个页面的链接是:https://movie.douban.com/top250外,其他页面的链接都是由相同的规律的。

观察网页源代码规律

以https://movie.douban.com/top250为例。
python爬虫实战 | 爬取豆瓣TOP250排名信息_第4张图片

观察可以发现:
所有电影信息在一个ol标签之内,该标签的 class属性值为grid_view;
每个电影在一个li标签里面;
每个电影的电影名称在:第一个 class属性值为hd 的div标签 下的 第一个 class属性值为title 的span标签里;
每个电影的评分在对应li标签里的(唯一)一个 class属性值为rating_num 的span标签里;
每个电影的评价人数在 对应li标签 里的一个 class属性值为star 的div标签中 的最后一个数字;
每个电影的短评在 对应li标签 里的一个 class属性值为inq 的span标签里。

python实现:

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import re
import time
import sys

def getHTMLText(url,k):
    try:
        if(k==0):kw={}
        else: kw={'start':k,'filter':''}
        r = requests.get(url,params=kw,headers={'User-Agent': 'Mozilla/4.0'})
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("Failed!")

def getData(html):
    soup = BeautifulSoup(html, "html.parser")
    movieList=soup.find('ol',attrs={'class':'grid_view'})#找到第一个class属性值为grid_view的ol标签
    moveInfo=[]
    for movieLi in movieList.find_all('li'):#找到所有li标签
        data = []
        #得到电影名字
        movieHd=movieLi.find('div',attrs={'class':'hd'})#找到第一个class属性值为hd的div标签
        movieName=movieHd.find('span',attrs={'class':'title'}).getText()#找到第一个class属性值为title的span标签
                                                                           #也可使用.string方法
        data.append(movieName)

        #得到电影的评分
        movieScore=movieLi.find('span',attrs={'class':'rating_num'}).getText()
        data.append(movieScore)

        #得到电影的评价人数
        movieEval=movieLi.find('div',attrs={'class':'star'})
        movieEvalNum=re.findall(r'\d+',str(movieEval))[-1]
        data.append(movieEvalNum)

        # 得到电影的短评
        movieQuote = movieLi.find('span', attrs={'class': 'inq'})
        if(movieQuote):
            data.append(movieQuote.getText())
        else:
            data.append("无")

        print(outputMode.format(data[0], data[1], data[2],data[3],chr(12288)))

#将输出重定向到txt文件
output=sys.stdout
outputfile=open("moviedata.txt",'w',encoding='utf-8')
sys.stdout=outputfile


outputMode= "{0:{4}^20}\t{1:^10}\t{2:^10}\t{3:{4}<10}"
print(outputMode.format('电影名称', '评分', '评论人数', '短评', chr(12288)))
basicUrl='https://movie.douban.com/top250'
k=0
while k<=225:
    html=getHTMLText(basicUrl,k)
    time.sleep(2)
    k+=25
    getData(html)


outputfile.close()
sys.stdout=output

注:

下面这些代码将输出重定向到txt文件

output=sys.stdout
outputfile=open("moviedata.txt",'w',encoding='utf-8')
sys.stdout=outputfile

#some code here 

outputfile.close()
sys.stdout=output

你可能感兴趣的:(python,豆瓣,爬虫,python)