用Python编写的电影网站爬虫项目

首先,我们来看一下源码。

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="
    #爬取网页
    datalist = getData(baseurl)
    #保存数据
    savepath = "豆瓣电影Top250.xls"
    saveData(datalist,savepath)
    dbpath = "douban250.db"
    saveData_db(datalist,dbpath)

findLink = re.compile(r'<a href="(.*?)">')  # compile创建正则表达式对象,表示规则(字符串模式)
#封面图片
findImgSrc = re.compile(r'<img.*src="(.*?)".*>',re.S) # re.S 忽略换行符
#电影名称
findTitle = re.compile(r'<span class="title">(.*)</span>')
#评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>') # \d表示数字 * 多个
#概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#电影详细内容
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)

#爬取网页
def getData(baseurl):
    datalist = [] # 获取地址中的数据列表,并返回
    for i in range(0,10): # 调用获取页面信息的函数10次,一次25条
        url = baseurl + str(i*25)
        html = askURL(url) # 保存获取到的网页源码
        # 2.逐一解析数据
        soup = BeautifulSoup(html,"html.parser") # html.parser网页解析器
        # find_all()是按照一定的标准,将符合要求的字符串一次性查找出来形成列表
        for item in soup.find_all('div',class_="item"):  # class后的 _ 表示属性值
            #print(item)
            data = [] # 保存一部电影的所有信息
            item = str(item) # 将其转为字符串
            # 提取超链接 re库用来通过正则表达式找到指定的字符串 findLink是自定义的全局变量
            Link = re.findall(findLink,item)[0] # [0]第一个
            data.append(Link) # 将连接追加到列表中

            ImgSrc = re.findall(findImgSrc,item)[0]
            data.append(ImgSrc)

            Title = re.findall(findTitle,item) # 片名可能只有一个中文名没有外文名
            if len(Title)==2: # 判断有几个titles
                ctitle = Title[0] # 添加中文名
                data.append(ctitle)
                otitle = Title[1].replace("/","") # 去掉/
                data.append(otitle) # 添加外文名
            else:
                data.append(Title[0])
                data.append(' ') # 第二个留空

            Rating = re.findall(findRating,item)[0]
            data.append(Rating) # 添加评分

            Judge = re.findall(findJudge,item)[0]
            data.append(Judge) # 添加人数

            Inq = re.findall(findInq,item)
            if len(Inq) !=0: # 有概述
                Inq = Inq[0].replace("。","") # 替换。
                data.append(Inq)
            else:  # 没有概述
                data.append(" ")

            Bd = re.findall(findBd,item)[0]
            # 将bd中的 <br(\s+)?/>(\s+)? 替换
            Bd = re.sub('<br(\s+)?/>(\s+)?'," ",Bd)
            data.append(Bd.strip()) # strip去掉前后空格

            datalist.append(data)    #把处理好的一个电影信息存储到datalist中
    #解析网页
    return datalist

#获取指定一个网页内容
def askURL(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36"
    } #伪装成网页的形式,请求网页信息
    request = urllib.request.Request(url,headers=head)
    html = "" # 存放到html中
    try: # 防止出现意外
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")  # 读取response
        #print(html)
    except urllib.error.URLError as e:  # 捕获404 500 等浏览器错误
        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)  # style_compression样式压缩效果
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True) #cell_overwrite_ok单元格覆盖
    col = ("电影详情链接","封面链接","影片中文名","影片外国名","评分","评价数","概况","相关信息","") # 列属性
    for i in range(0,8): # 写列名
        sheet.write(0,i,col[i])
    for i in range(0,250):
        print("第%d条"%(i+1))
        data = datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j]) #
    book.save('豆瓣电影Top250.xls')

def saveData_db(datalist,dbpath):
    init_db(dbpath)
    conn = sqlite3.connect(dbpath)
    cur = conn.cursor() #获取游标。获取操作的数据库对象
    for data in datalist:
        for index in range(len(data)):
            if index == 4 or index == 5:
                continue
            data[index] = '"'+data[index]+'"'
        sql = '''
            insert into movie250 (
               info_link, pic_link,cname,ename,score,rated,introduction,info)
               values(%s) '''%",".join(data)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()

def init_db(dbpath):
    sql = '''
        create table movie250
        (
            id integer primary key autoincrement,
            info_link text,
            pic_link text,
            cname varchar,
            ename varchar,
            score numeric,
            rated numeric,
            introduction text,
            info text
        )
    '''
    conn = sqlite3.connect(dbpath) # 创建数据库
    cursor = conn.cursor() # 获取游标。获取操作的数据库对象
    cursor.execute(sql) #执行sql语句
    conn.commit() # 提交
    conn.close() #关闭数据库文件

main()
print("爬取完毕")

然后运行代码

save....
第1条
第2条
第3条
第4条
第5条
第6条
第7条
第8条
第9条
第10条
第11条
第12条
第13条
第14条
第15条
第16条
第17条
第18条
第19条
第20条
第21条
第22条
第23条
第24条
第25条
第26条
第27条
第28条
第29条
第30条
第31条
第32条
第33条
第34条
第35条
第36条
第37条
第38条
第39条
第40条
第41条
第42条
第43条
第44条
第45条
第46条
第47条
第48条
第49条
第50条
第51条
第52条
第53条
第54条
第55条
第56条
第57条
第58条
第59条
第60条
第61条
第62条
第63条
第64条
第65条
第66条
第67条
第68条
第69条
第70条
第71条
第72条
第73条
第74条
第75条
第76条
第77条
第78条
第79条
第80条
第81条
第82条
第83条
第84条
第85条
第86条
第87条
第88条
第89条
第90条
第91条
第92条
第93条
第94条
第95条
第96条
第97条
第98条
第99条
第100条
第101条
第102条
第103条
第104条
第105条
第106条
第107条
第108条
第109条
第110条
第111条
第112条
第113条
第114条
第115条
第116条
第117条
第118条
第119条
第120条
第121条
第122条
第123条
第124条
第125条
第126条
第127条
第128条
第129条
第130条
第131条
第132条
第133条
第134条
第135条
第136条
第137条
第138条
第139条
第140条
第141条
第142条
第143条
第144条
第145条
第146条
第147条
第148条
第149条
第150条
第151条
第152条
第153条
第154条
第155条
第156条
第157条
第158条
第159条
第160条
第161条
第162条
第163条
第164条
第165条
第166条
第167条
第168条
第169条
第170条
第171条
第172条
第173条
第174条
第175条
第176条
第177条
第178条
第179条
第180条
第181条
第182条
第183条
第184条
第185条
第186条
第187条
第188条
第189条
第190条
第191条
第192条
第193条
第194条
第195条
第196条
第197条
第198条
第199条
第200条
第201条
第202条
第203条
第204条
第205条
第206条
第207条
第208条
第209条
第210条
第211条
第212条
第213条
第214条
第215条
第216条
第217条
第218条
第219条
第220条
第221条
第222条
第223条
第224条
第225条
第226条
第227条
第228条
第229条
第230条
第231条
第232条
第233条
第234条
第235条
第236条
第237条
第238条
第239条
第240条
第241条
第242条
第243条
第244条
第245条
第246条
第247条
第248条
第249条
第250条
爬取完毕

Process finished with exit code 0

因为我抓取的是豆瓣前250项 一页25个 一共十页

运行后在此项目中会出现一个.db文件 一个Excle文件

 先点开Excle表格看一下

一共有250行  有8列

然后点开db文件看一下  是一些乱码

这时候打开命令行 输入所学过的指令

然后会出现一个.sql文件

 

 到此就结束啦~

物联沃分享整理
物联沃-IOTWORD物联网 » 用Python编写的电影网站爬虫项目

发表评论