Python网络爬虫实战:豆瓣电影Top250并保存到表格中-2021.6.8

目录

 

前言

版本及库

实战

以下代码展示的是思路

引入库

网页请求

封装头部信息

爬取网页

定义规则

保存数据

全部代码


前言

我看了其他前辈的一些爬取豆瓣的教程最早也在几个月以前的了,正好最近在B站学了爬取豆瓣,出于记录的目的吧,就写上一篇blog分享一下,如果效果好的话,我分享一些我学到的数据保存到数据库、做一个小网站,在网站上实现数据可视化。

版本及库

解释器是python3.9,用的pycharm来做得,如果想保存数据到数据库好像需要专业版的pycharm吧。反正我用社区版没找到。

库使用到了re,urllib, bs4 ,xlwt这四个,如果有安装库啥的问题欢迎评论讨论。

实战

以下代码展示的是思路

在前奏工作准备好以后,就可以开始操作了。

引入库


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

网页请求

封装头部信息

要的到网页信息我们需要封装一个头部信息,也就是模拟浏览器向服务器获取网页的请求。

在豆瓣网页:豆瓣电影 Top 250,按F12,再向下图把最长红框哪里复制下来。

Python网络爬虫实战:豆瓣电影Top250并保存到表格中-2021.6.8_第1张图片

注意,头部信息是字典,记住加引号,有些同学复制下来的User-Agent中间会有多余的空格,有可能会导致请求失败,注意删除。

def getUrl(url):

    head ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
    res = urllib.request.Request(url=url,headers=head) #封装头部信息
    html=""
    try:       #这里的try,是为了检测一些错误,例如我就遇到了418,403等
        response = urllib.request.urlopen(res) #向浏览器发出请求
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reson"):
            print(e.reason)
    #print(html)
    return html

爬取网页

其中通过re库:movie_link =re.findall(Movie_links,item)[0],Movie_links是一种规则,item是在前面规则下需要从item中提取出来的信息,规则是自己定义的。

def getdata(burl):
    datalist = []

    for i in range(0,10):
        url = burl + str(i*25)  #因为是需要爬取250部电影,而每个网页只有250部电影,大家可以去看看豆瓣从第一页到第25页的URL的规则,这里就懂了
        html = getUrl(url)  ##保存获取到的网页源码
        soup = BeautifulSoup(html,"html.parser")  #使用bs4进行解析
        for item in soup.find_all('div',class_="item"):  #查找符合要求的字符串,形成列表,可以按F12查看一下每个电影信息在哪个标签里面
            #print(item)
            data = []
            item = str(item)

            #保存电影链接
            movie_link =re.findall(Movie_links,item)[0]
            data.append(movie_link)

            #保存网页链接
            picture_links = re.findall(Picture_links,item)
            data.append(picture_links)

            #保存电影名字,电影有中国名和其他名字,有些特殊情况没有外国名
            name = re.findall(Name,item)
            if len(name)==2:
                cname = name[0]   #cname中国名,oname其他名字
                data.append(cname)
                oname = name[1].replace("/","")
                oname = oname.replace("\xa0", "")
                data.append(oname)
            else:
                data.append(name[0])
                data.append(" ")

             #添加评分
            ratings = re.findall(Ratings,item)
            data.append(ratings)
            
             #添加评价人数
            umber_of_people = re.findall(Umber_of_people,item)
            data.append(umber_of_people)

            # 添加概述
            profiles = re.findall(Profiles,item)  # 添加概述
            if len(profiles)!=0:
                profiles[0].replace("。","")  #去掉句号
                data.append(profiles)
            else:
                data.append(" ")   #留空
            datalist.append(data)
    return datalist

定义规则

提取规则需要用到re库,re库这里就不再介绍。

#使用正则表达式来制定一些提取网页信息的规则

#提取电影链接规则
Movie_links = re.compile(r'')

#提取图片链接规则
Picture_links = re.compile(r'img.*src="(.*?)"',re.S)

#提取电影名字规则
Name = re.compile(r'(.*)')

#提取评分规则
Ratings = re.compile(r'(.*)')

#提取评价人数规则
Umber_of_people = re.compile(r'(\d*)人评价')

#提取概况规则
Profiles = re.compile(r'(.*)')

保存数据

这里就用到了xlwt这个库。这个库具体使用方法就去查重就懂了,不难的。

def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding='utf-8',style_compression=0) #创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)   #创建工作表
    col = ["电影链接","图片链接","c电影名字","o电影名字","评分","评价人数","概况"]
    for i in range(0,7):
        sheet.write(0,i,col[i])  #列名
    for i in range(0,250):
        print("保存第 %d 条数据"%(i+1))
        data = datalist[i]
        for j in range(0,7):
            sheet.write(i+1,j,data[j])
    book.save(savepath)

全部代码

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

def main():
    burl = 'https://movie.douban.com/top250?start='
    datalist = getdata(burl)
    #print(datalist)
    savepath = '豆瓣Top250.xls'
    savedata(datalist,savepath)

#使用正则表达式来制定一些提取网页信息的规则
Movie_links = re.compile(r'')
Picture_links = re.compile(r'img.*src="(.*?)"',re.S)
Name = re.compile(r'(.*)')
Ratings = re.compile(r'(.*)')
Umber_of_people = re.compile(r'(\d*)人评价')
Profiles = re.compile(r'(.*)')


def getdata(burl):
    datalist = []
    for i in range(0,10):
        url = burl + str(i*25)
        html = getUrl(url)
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            #print(item)
            data = []
            item = str(item)
            movie_link =re.findall(Movie_links,item)[0]
            data.append(movie_link)

            picture_links = re.findall(Picture_links,item)
            data.append(picture_links)

            name = re.findall(Name,item)
            if len(name)==2:
                cname = name[0]
                data.append(cname)
                oname = name[1].replace("/","")
                oname = oname.replace("\xa0", "")
                data.append(oname)
            else:
                data.append(name[0])
                data.append(" ")


            ratings = re.findall(Ratings,item)
            data.append(ratings)

            umber_of_people = re.findall(Umber_of_people,item)
            data.append(umber_of_people)

            profiles = re.findall(Profiles,item)  # 添加概述
            if len(profiles)!=0:
                profiles[0].replace("。","")  #去掉句号
                data.append(profiles)
            else:
                data.append(" ")   #留空
            datalist.append(data)
    return datalist

def getUrl(url):

    head ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
    res = urllib.request.Request(url=url,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(res)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reson"):
            print(e.reason)
    #print(html)
    return html

def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding='utf-8',style_compression=0)
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
    col = ["电影链接","图片链接","c电影名字","o电影名字","评分","评价人数","概况"]
    for i in range(0,7):
        sheet.write(0,i,col[i])
    for i in range(0,250):
        print("保存第 %d 条数据"%(i+1))
        data = datalist[i]
        for j in range(0,7):
            sheet.write(i+1,j,data[j])
    book.save(savepath)


if __name__ == '__main__':
    main()
    print("爬取完毕")

一条数据代表一个电影信息

Pycharm背景图片设置

你可能感兴趣的:(Python,python,正则表达式,爬虫,大数据)