python爬虫学习笔记(三)—— 实战爬取豆瓣TOP250电影


基于之前两篇的基础知识后


python爬虫学习笔记(一)——初识爬虫
python爬虫学习笔记(二)——解析内容


开始实战爬取豆瓣TOP250电影


首先还是重新复习下爬虫的基本流程:

  • 发起请求
  • 获取响应内容
  • 解析内容
  • 保存数据


1. 发起请求


首先观察豆瓣电影Top250首页
python爬虫学习笔记(三)—— 实战爬取豆瓣TOP250电影_第1张图片


话不多说,直接发起爬取请求


# 得到指定一个URL的网页内容
def GetHTML(url):
    try:
        headers = {                  # 模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
        }                            # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
        r = requests.get(url, headers=headers, timeout=30)
        r.raise_for_status                            # 若状态码不是200,抛出HTTPError异常
        r.encoding = r.apparent_encoding              # 保证页面编码正确
    except requests.exceptions.ConnectTimeout:
        print('爬虫超时!')
    except requests.exceptions.ConnectionError:
        print('无效地址!')

    return r.text


2. 获取响应内容


然而,我们发现一页只有25部电影信息,爬取Top250部一共需要10页
在这里插入图片描述

python爬虫学习笔记(三)—— 实战爬取豆瓣TOP250电影_第2张图片


当链接为https://movie.douban.com/top250?start=25时,我们可以发现此时正是电影的第二页,按照这个规律,利用一个for循环,我们就可以提取10页的网页数据了


for i in range(0, 10):         # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        response = GetHTML(url)                           


3.解析内容


获取完一堆网页数据后,此时就需要一步步解析出我们所需要的信息
按下F12,找出第一部电影的相关信息的对应关系


python爬虫学习笔记(三)—— 实战爬取豆瓣TOP250电影_第3张图片


然后通过正则表达式查找指定的字符串


# 获取影片排名
findrank = re.compile(r'(.*)')
 
# 获取影片名字的
findTitle = re.compile(r'(.*)')      

# 获取影片评分的
findRating = re.compile(r'(.*)')

# 获取影片评价人数的
findJudge = re.compile(r'(\d*)人评价')

# 获取影片概况的
findInq = re.compile(r'(.*)')

# 获取影片相关内容的
findBd = re.compile(r'

(.*?)

'
,re.S) # 获取详情的链接的 findLink = re.compile(r'') # 获取影片图片链接 findImgSrc = re.compile(r',re.S)


当学会第一部影片信息的提取后,此时便可举一反二五零


# 逐一解析数据
def SoupHTML(url):
    datalist = []
    for i in range(0, 10):                                      # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        response = GetHTML(url)                                 # 保存获取到的网页源码
        Soup = BeautifulSoup(response, "html.parser")
        for item in Soup.find_all('div', class_="item"):        # 查找符合要求的字符串,形成列表
            data = []                                           # 保存一部电影的所有信息
            item = str(item)
            
			# 影片排名的解析
            findrank = re.compile(r'(.*)')
            rank = re.findall(findrank, item)[0]
            data.append(rank)                                   # 添加排名
            
            # 影片名字的解析
            findtitle = re.compile(r'(.*)')
            title = re.findall(findtitle, item)
            if len(title) == 2:
                ctitle = title[0]
                data.append(ctitle)                             # 添加中文名
                otitle = title[1].replace("/", "")
                data.append(otitle)                             # 添加外国名
            else:
                data.append(title[0])
                data.append(" ")                                # 若无外国名字,则留空

            # 影片评分的解析
            findrating = re.compile(r'(.*)')
            rating = re.findall(findrating, item)[0]
            data.append(rating)                                 # 添加评分

            # 影片评价人数的解析
            findjudge = re.compile(r'(\d*)人评价')
            judgenum = re.findall(findjudge, item)[0]
            data.append(judgenum)                              # 添加评价人数

            # 影片概况的解析
            findinq = re.compile(r'(.*)')
            inq = re.findall(findinq, item)
            if len(inq) != 0:
                inq = inq[0].replace("。", "")
                data.append(inq)                               # 添加概述
            else:
                data.append(" ")

            # 影片相关内容的解析
            findbd = re.compile(r'

(.*?)

'
, re.S) bd = re.findall(findbd, item)[0] bd = re.sub('(\s+)?', " ", bd) bd = re.sub('/', " ", bd) data.append(bd.strip()) # 添加相关内容 # 影片详情的链接的解析 findlink = re.compile(r'
') link = re.findall(findlink, item)[0] data.append(link) # 添加链接 # 影片图片链接的解析 findimgsrc = re.compile(r', re.S) imgsrc = re.findall(findimgsrc, item)[0] data.append(imgsrc) # 添加图片链接 datalist.append(data) # 把解析好的一部电影信息放入datalist return datalist


4.保存数据


由于250部电影的数据比较庞大,直接print出来可能会显示不完整
于是我们选择保存到excel表格中便于观察和研究
首先我们需要了解一下Python-xlwt库的基本使用
然后就可以上手保存数据


def SaveHTML(datalist):
    print("Start saving……")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)            # 创建workbook对象
    sheet = book.add_sheet("电影TOP250", cell_overwrite_ok=True)           # 创建工作表
    col = ("排名","影片中文名", "影片外国名", "评分", "评价人数", "影片概述", "影片相关内容", "影片链接", "影片图片链接")
    for i in range(0, 9):
        sheet.write(0, i, col[i])                                          # 列名

    for i in range(0, 250):
        print("第%d条" % (i + 1))
        data = datalist[i]
        for j in range(0, 9):
            sheet.write(i + 1, j, data[j])                                 # 写入数据

    book.save("豆瓣电影TOP_250.xls")
    print("数据保存成功!")


最后的最后,稍稍调用一下上面的3个函数


if __name__ == "__main__":
    url = "https://movie.douban.com/top250?start="
    Datalist = SoupHTML(url)
    SaveHTML(Datalist)


最后实战成果如图:


你可能感兴趣的:(笔记)