跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib, bs, re, xlwt库)

出于督促自己学习以及未来回顾和分享的目的,记录一下自己的学习过程。

B站视频号:BV12E411A7ZQ

ep15-25. 完成爬取信息,处理数据,保存到Excel。具体流程为:

1. 找到目标网页的URL,如果存在多页,需要确定URL定位和页数的关系;

2. 引入所需要的库:Urllib,BS4,BeautifulSoup,Re,Xlwt;

3. 结构顺序为:爬取网页源代码→解析源代码→获得所需数据信息→整理并保存数据

代码实现:

# -*- coding = utf-8 -*-
# @Time : 10/11/21 3:11 pm
# @Author: YS
# @File : 爬取豆瓣电影TOP250.py
# @Software: PyCharm


# 爬取豆瓣电影TOP250:名称、豆瓣评分、评价数、电影概况、电影链接(https://movie.douban.com/top250)
# PS 爬虫实际上是爬取网页源代码
# 从网站获取信息,必须发送user-agent,读取cookie

# 1.获取目标URL
# 从网页浏览得到,每一页展示25个电影,共10页,每一页的URL对应(https://movie.douban.com/top250?start=X),期中X=开始编号-1

# 2.页面分析
# 开发者模式,查找elements,获得network访问详情

# 3.编码规范
# utf-8编码;多用函数;用main执行测试

# 4.引入模块
import bs4  # 网页解析
from bs4 import BeautifulSoup  # 将源码解析为html,即分层结构
import re  # 正则表达式,文字匹配
import urllib.request  # 获取URL网页源码
import urllib.error  # 检验访问错误
import xlwt  # excel操作
import sqlite3  # 进行SQL


def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 1.爬取网页
    askURL("https://movie.douban.com/top250?start=0")

    # 2.获得数据
    datalist = getData(baseurl)

    # 3.保存数据
    savepath = "/Users/zippoil/Desktop/豆瓣电影top250.xls"
    saveData(datalist, savepath)


# 电影详情链接匹配规则
findlink = re.compile(r'')  # 创建正则表达式规则,规则配合finall返回的是()中的内容
# 电影封面图匹配规则(链接)
findcover = re.compile(r'(.*?)')
# 电影评分匹配规则
findrating = re.compile(r'(.*?)')
# 电影评分人数匹配规则
findaudience = re.compile(r'(\d*)人评价')  # 此处锁定数字,贪婪匹配
# 电影概述匹配规则
findquote = re.compile(r'(.*?)')
# 演职员,年份,产地,类型匹配规则
findcast = re.compile(r'

(.*?)

', re.S) def getData(baseurl): datalist = [] for i in range(0, 10): # 调用askURL十次, url = baseurl + str(i * 25) html = askURL(url) # 执行十次,拿到10页全部250部电影数据,因为askURL的末尾是return,所以可以存为html # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") # 解析html, 应用html解析器 # 重点:先在浏览器的开发者模式elements下分析,得到每个电影在
  • ,具体信息在
    下 for item in soup.find_all('div', class_="item"): # 找到所有的div,且class="item",注意需要下划线_ # print(item) # 经过解析,在查找时会返回满足条件的内容及其所有下层内容 moviedata = [] # 保存一个电影的全部信息 item = str(item) # 获得电影详情链接 link = re.findall(findlink, item)[0] # 用re库通过正则表达式查找指定字符串,findall返回的是列表,限定0即储存第一个满足的链接 moviedata.append(link) # 获得电影封面图 cover = re.findall(findcover, item)[0] moviedata.append(cover) # 获得电影名 title = re.findall(findtitle, item) # 有时有外文名有时没有 if len(title) == 2: ctitle = title[0] ftitle = title[1].replace("/", "") # 去掉/符号 moviedata.append(ctitle) # 中文名 moviedata.append(ftitle) # 外文名 else: ctitle = title[0] moviedata.append(ctitle) moviedata.append("Null") # 没有外文名时,外文名列留空,保证最后导出效果 # 获得电影评分 rating = re.findall(findrating, item)[0] moviedata.append(rating) # 获得评分人数 audience = re.findall(findaudience, item)[0] moviedata.append(audience) # 获得电影概况 quote = re.findall(findquote, item) # 有的电影没有概述 if len(quote) != 0: quote = quote[0].replace("。", "") # 去掉句号 moviedata.append(quote) else: moviedata.append("Null") # 留空 # 获得演职员,年份,产地,类型 cast = re.findall(findcast, item)[0] cast = re.sub('(\s+)?', " ", cast) # 去掉
    cast = re.sub("/", " ", cast) # 去掉/ moviedata.append(cast.strip()) # 去掉空格 datalist.append(moviedata) print(datalist) return datalist # 得到指定一个URL的网页内容 def askURL(url): head = {} # 模拟浏览器头部 head["User-Agent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15") head["Cookie"] = ('"push_noty_num=0; _pk_id.100001.4cf6=efb4e3002bfde787.1614869431.12.1636645754.1636640031.; _pk_ses.100001.4cf6=*; push_doumail_num=0; __utma=30149280.1643107469.1614869431.1636640031.1636645556.13; __utmb=30149280.0.10.1636645556; __utmc=30149280; __utmz=30149280.1636645556.13.9.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ck=TgEX; __utma=223695111.1232125652.1614869431.1636640031.1636645556.11; __utmb=223695111.0.10.1636645556; __utmc=223695111; __utmz=223695111.1636645556.11.7.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1636645555%2C%22https%3A%2F%2Faccounts.douban.com%2F%22%5D; dbcl2="209250688:VZZbqQ9NL7M"; _vwo_uuid_v2=D1835B0D5A26110B33228387A3B3497D9|2102788b20e0c99e81d2963cb8bdb3fa; ct=y; __yadk_uid=torZWdjbSJlf3JWSODn5mmPq8OlrjQX1; douban-fav-remind=1; __gads=ID=8a8633abef7a1403-228e9d3403b90021:T=1614869431:RT=1614869431:S=ALNI_MZ_EI5P-8v7pmmlOjl6hZv5pH_7ng; bid=ua9QPwGvWYQ; ll="108296"') request = urllib.request.Request(url, headers=head) # 带着头部信息访问URL html = "" try: responce = urllib.request.urlopen(request) # 返回结果 html = responce.read().decode("utf-8") # print(html) except urllib.error.URLError as e: # 识别错误类型 if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html # 保存数据 def saveData(datalist, savepath): print("save...") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 建文件 sheet = book.add_sheet("豆瓣电影TOP250", cell_overwrite_ok=True) # 建工作簿 col = ("电影链接", "图片链接", "中文名", "外文名", "评分", "评价数", "概述", "相关信息") for i in range(0, 8, 1): sheet.write(0, i, col[i]) # 写入表头 for i in range(0, 250, 1): print("第%d条"%(i+1)) data = datalist[i] # 第i个电影信息整合的列表 for j in range(0, 8, 1): sheet.write(i+1, j, data[j]) print("yeah!!!") book.save(savepath) if __name__ == "__main__": # 当程序执行时 main()
  • 你可能感兴趣的:(python,爬虫,音视频)