【Python爬虫】 电影Top250信息

1.需求

爬取某瓣电影Top250的基本信息

2.基本流程

2.1准备工作

#-*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  #网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作

def main():
    #基址
    baseurl="https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist=getData(baseurl)
    # 保存路径
    savepath='.\\豆瓣电影Top250.xls'
    #3.保存数据
    saveData(savepath)
    
# 爬取网页    
def getData(baseurl):
    datalist=[]
    #2.逐一解析数据
    return datalist

#保存数据
def saveData(savapath):
    print()

if __name__=="__main__":#当程序执行时
# 调用函数
    main()

2.2获取数据

2.2.1获取用户代理

  • User-Agent用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)【获取方法如下👇】
    在这里插入图片描述

2.2.2 得到制定一个URL的网页内容

def askURL(url):
    # head模拟浏览器头部信息,向豆瓣服务器发送消息
    head ={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
    # 携带头部信息访问url👇
    request=urllib.request.Request(url,headers=head)
    html=""
    # 👇看3.1对urllib的补充理解
    response=urllib.request.urlopen(request)
    html=response.read().decode("utf-8")
    print(html)

记得在main里面调用askURL哈

2.2.3 调用10次25份数据,解析网页

# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
    return datalist

2.3解析内容

解析影片详情链接为例,可用同样方式解析其它电影信息👇

#影片详情链接的规则
findlink=re.compile(r'<a href="(.*?)">') #创建正则表达式对象,表示规则(字符串的模式)
findImgSrc=re.compile(r'<img.*src="(.*?)>"',re.S) #re.S让换行符包含字符
# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #2.逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
        soup=BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
            # print(item)#测试:查看电影item全部信息
            data=[]# 保存一部电影的所有信息
            item=str(item)
            # print(item+'HHHHHH')
            #   break
            # 影片详情的链接
            link=re.findall(findlink,item)[0]# re库用来通过正则表达式查找指定的字符串
            print(link)
    return datalist

2.4保存数据

#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('司六',cell_overwrite_ok=True)  # 创建工作表
    col=("详情链接","图片链接","电影名称")
    for i in range(0,3):
        sheet.write(0,i,col[i])#列名
    for i in range(0,250):
        print("第%d条" %i)
        data=datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])#数据
    book.save(savepath)  # 保存数据表

3.补充

3.1 urllib

import urllib.request
# 获取一个get请求
response=urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8'))

在这里插入图片描述
httpbin–请求返回网站

3.2 BeautifulSoup

BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种

  • Tag
  • NavigableString
  • BeautifulSoup
  • comment
from bs4 import BeautifulSoup
file = open("./司六米希.html",'rb')
html=file.read()
bs=BeautifulSoup(html,"html.parser")
# 1.Tag   标签及其内容:拿到它找到的第一个内容
print(bs.title)
print(type(bs.title))

# 2.NavigableString  标签里的内容(字符串)
print(bs.title.string)
print(type(bs.title.string))

# 3.attrs 获得属性的键值对
print(bs.a.attrs)

# 4.BeautifulSoup表示整个文档
print(type(bs))
print(bs.name)

# 5.Comment  是一个特殊的NavigableString,输出的内容不包含注释符号

3.2.1 文档的遍历

print(bs.head.contents)
print(bs.head.contents[1])
  • 更多内容搜索BeautifulSoup文档

3.2.2 文档的搜索

# (1)find_all()  ()里面加入规则
# 字符串过滤:会查找与字符串完全匹配的内容
#eg: 与a字符串标签完全一样
# k_list=bs.find_all("a")

#正则表达式搜索:使用search()方法匹配内容
# 会找到所有含a的某一标签及其内容
# import re
# t_list=bs.find_all(re.compile('a'))

#方法: 传入一个函数(方法),根据函数的要求来搜索
# def name_is_exists(tag):
#     return tag.has_attr("name")
# t_list=bs.find_all(name_is_exists)
print(t_list)
for item in t_list:
    print(item)

3.3xlwt

import xlwt
workbook =xlwt.Workbook(encoding="utf-8")#创建workbook对象
worksheet=workbook.add_sheet('sheet1')#创建工作表
worksheet.write(0,0,'hello')#写入数据,第一行参数‘行’,第二个参数‘列’,第三个参数内容
workbook.save('司六米希.xls')#保存数据表

4.完整代码

#-*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  #网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作

def main():
    #基址
    baseurl="https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist=getData(baseurl)
    # 保存路径
    savepath='豆瓣电影Top250.xls'
    #3.保存数据
    saveData(datalist,savepath)
    # askURL("https://movie.douban.com/top250?start=0")
#影片详情链接的规则
findlink=re.compile(r'<a href="(.*?)">') #创建正则表达式对象,表示规则(字符串的模式)
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含字符
findTitle=re.compile(r'<span class="title">(.*?)</span>')
# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #2.逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
        soup=BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
            # print(item)#测试:查看电影item全部信息
            data=[]# 保存一部电影的所有信息
            item=str(item)
            # print(item+'HHHHHH')
            #   break
            # 影片详情的链接
            link=re.findall(findlink,item)[0]# re库用来通过正则表达式查找指定的字符串
            # print(link)
            data.append(link) #添加链接

            imgSrc=re.findall(findImgSrc,item)[0]
            data.append(imgSrc)#添加图片
            # print(imgSrc)

            titles=re.findall(findTitle,item)#片名可能只有一个中文名,没有外国名
            if(len(titles)==2):
                ctitle=titles[0]#添加中文名
                data.append(ctitle)
                otitle=titles[1].replace("/","")#去掉无关的符号
                data.append(otitle)#添加外国名
            else:
                data.append(titles[0])
                data.append('')#外国名字留空

            datalist.append(data)#把处理好的一部电影信息放入datalist
            # print(datalist)
    return datalist

# 得到制定一个URL的网页内容
def askURL(url):
    #User-Agent用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    # head模拟浏览器头部信息,向豆瓣服务器发送消息
    head ={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
    # 携带头部信息访问url👇
    request=urllib.request.Request(url,headers=head)
    html=""
    # 👇看urllib的补充理解
    response=urllib.request.urlopen(request)
    html=response.read().decode("utf-8")
    # print(html)
    return html



#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('司六',cell_overwrite_ok=True)  # 创建工作表
    col=("详情链接","图片链接","电影名称")
    for i in range(0,3):
        sheet.write(0,i,col[i])#列名
    for i in range(0,250):
        print("第%d条" %i)
        data=datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])#数据
    book.save(savepath)  # 保存数据表



if __name__=="__main__":#当程序执行时
# 调用函数
    main()

在这里插入图片描述
★,°:.☆( ̄▽ ̄)/$:.°★ 。撒花撒花👏

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司六米希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值