python3实战|python3爬取豆瓣top250备份到数据库

python3爬取豆瓣top250备份到数据库,由于这是一个经典的项目,学者所以打算练练手。备份到数据库是我感觉可以顺便练练MySQL

开始写代码前首先我们应该有一个流程,也就是完成项目的步骤(我自己的体会):

1:爬虫爬取豆瓣top250的网页,需要的信息返回

2:返回的信息分类,数据应该至少包括(排名,影名,人物,评论,评分)这五项,并以文本的形式存入本地

3 :创建数据库以及创建数据库中存放信息的表

4:将本地的数据存入数据库中


(首先说明,我也不是大神,你应该有一颗探求的心,都是一步步完成的,我的代码经一系列验证皆可用,但是你不能套用代码,参考代码自己编写可执行代码)

思路明朗,接下来就可以大干一场了,总体代码最后附上:






1:爬取并返回信息:

def get_html(web_url):       #爬虫获取网页没啥好说的
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.5.1.15355"}
    html = requests.get(url=web_url,headers=header).text
    Soup = BeautifulSoup(html,"lxml")
    data = Soup.find("ol").find_all("li")   #还是有一点要说,就是返回的信息最好只有你需要的那部分,所以这里进行了筛选
    return data


2:信息分类并保存至本地:

def get_info(all_move):
    for info in all_move:
        #    编号
        nums = re.findall(r'<em class="">\d+</em>',str(info),re.S|re.M) #编号我使用的是正则表达式来获取
        nums = re.findall(r'\d+',str(nums),re.S|re.M)
        num = nums[0]

        #    名字
        names = info.find("span")   #名字比较简单 偷了一下懒直接获取第一个span就是
        name = names.get_text()

        #    导演
        charactors = info.find("p")      #这段信息中有太多非法符号你需要替换掉
        charactor = charactors.get_text().replace(" ","").replace("\n","")   #使信息排列规律
        charactor = charactor.replace("\xa0","").replace("\xee","").replace("\xf6","").replace("\u0161","").replace("\xf4","").replace("\xfb","").replace("\u2027","")
        charactor = charactor[0:30]  #由于本人不才,数据库才入门所以需要控制信息长度,以免存入超范围  (大神忽略)

        #    评语
        remarks = info.find_all("span",{"class":"inq"})
        print(remarks)
        if remarks:          #这个判断是因为有的电影没有评语,你需要做判断
            remark = remarks[0].get_text().replace("\u22ef","")
            remark = remark[0:30]  #同上面一个
        else:
            remark = "此影片没有评价"

        #    评分
        scores = info.find_all("span",{"class":"rating_num"})   #没啥好说 匹配就行
        score = scores[0].get_text()


        f = open("F:\\Pythontest1\\douban.txt","a")   #将上面的信息每一行以按逗号分隔的规律存入本地
        f.write(num+",")
        f.write(name+",")
        f.write(charactor+",")
        f.write(remark+",")
        f.write(score)
        f.write("\n")
    f.close()         #记得关闭文件


3:创建数据库以及表:

connect = pymysql.connect(      #连接数据库
        user = "root",
        password = "root@123456",
        host = "127.0.0.1",
        db = "MYSQL",
        port = 3306,
        charset = ("utf8"),    #注意编码一定要设置,否则gbk你懂的
        use_unicode=True,
        )
    con = connect.cursor()    #设置游标
    # con.execute('SET NAMES UTF8')
    con.execute("drop database douban")       #以下7行表示删除原有的数据库和其中的表,新建数据库和表
    con.execute("create database douban")
    con.execute("use douban")                 #使用douban这个数据库
    con.execute("drop table if exists t_doubantop")
    sql = '''create table t_doubantop(num BIGINT,name VARCHAR(40) NOT NULL,charactor VARCHAR(40),remark VARCHAR(40),score VARCHAR(20))'''
    con.execute(sql)    #sql中的字符表示创建一个表 对应的信息有   num  name  charactor  remark  score


4:本地数据存放至数据库:

f = open("F:\\Pythontest1\\douban.txt","r")     #打开路径复制其中的数据,以便导入数据库
    while True:
        line = f.readline()
        if line:
            line = line.strip("\n")
            line = line.split(",")      #你写如.txt文件的数据用逗号分开,此时用逗号将他们转化为列表
            # print(line)
            num = line[0]               #将需要的几个量复制
            name = line[1]
            charactor = line[2]
            remark = line[3]
            score = line[4]
            con.execute("insert into t_doubantop(num,name,charactor,remark,score)values(%s,%s,%s,%s,%s)",[num, name, charactor, remark, score])
        else:                                #导入数据库
            break
    connect.commit()          #这句记得写上提交数据,否则导入为空(有的DDL是不需要导入的)


以上便是每个步骤的思路代码,下面附上完整代码:

from bs4 import BeautifulSoup
import pymysql
import requests
import re
import os

def get_html(web_url):       #爬虫获取网页没啥好说的
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.5.1.15355"}
    html = requests.get(url=web_url,headers=header).text
    Soup = BeautifulSoup(html,"lxml")
    data = Soup.find("ol").find_all("li")   #还是有一点要说,就是返回的信息最好只有你需要的那部分,所以这里进行了筛选
    return data

def get_info(all_move):
    for info in all_move:
        #    编号
        nums = re.findall(r'<em class="">\d+</em>',str(info),re.S|re.M) #编号我使用的是正则表达式来获取
        nums = re.findall(r'\d+',str(nums),re.S|re.M)
        num = nums[0]

        #    名字
        names = info.find("span")   #名字比较简单 偷了一下懒直接获取第一个span就是
        name = names.get_text()

        #    导演
        charactors = info.find("p")      #这段信息中有太多非法符号你需要替换掉
        charactor = charactors.get_text().replace(" ","").replace("\n","")   #使信息排列规律
        charactor = charactor.replace("\xa0","").replace("\xee","").replace("\xf6","").replace("\u0161","").replace("\xf4","").replace("\xfb","").replace("\u2027","")
        charactor = charactor[0:30]  #由于本人不才,数据库才入门所以需要控制信息长度,以免存入超范围  (大神忽略)

        #    评语
        remarks = info.find_all("span",{"class":"inq"})
        print(remarks)
        if remarks:          #这个判断是因为有的电影没有评语,你需要做判断
            remark = remarks[0].get_text().replace("\u22ef","")
            remark = remark[0:30]  #同上面一个
        else:
            remark = "此影片没有评价"

        #    评分
        scores = info.find_all("span",{"class":"rating_num"})   #没啥好说 匹配就行
        score = scores[0].get_text()


        f = open("F:\\Pythontest1\\douban.txt","a")   #将上面的信息每一行以按逗号分隔的规律存入本地
        f.write(num+",")
        f.write(name+",")
        f.write(charactor+",")
        f.write(remark+",")
        f.write(score)
        f.write("\n")
    f.close()         #记得关闭文件

if __name__=="__main__":
    if os.path.exists("F:\\Pythontest1") == False:            #两个if来判断是否文件路径存在 新建文件夹 删除文件
        os.mkdir("F:\\Pythontest1")
    if os.path.exists("F:\\Pythontest1\\douban.txt") == True:
            os.remove("F:\\Pythontest1\\douban.txt")

    page = 0       #初始化页数,TOP一共有250部   每页25部
    while page<=225:
        web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
        all_move = get_html(web_url)     #返回每一页的网页
        get_info(all_move)          #匹配对应信息存入本地
        page += 25
    
    connect = pymysql.connect(      #连接数据库
        user = "root",
        password = "xxxxx",
        host = "127.0.0.1",
        db = "MYSQL",
        port = 3306,
        charset = ("utf8"),    #注意编码一定要设置,否则gbk你懂的
        use_unicode=True,
        )
    con = connect.cursor()    #设置游标
    # con.execute('SET NAMES UTF8')
    con.execute("drop database douban")       #以下7行表示删除原有的数据库和其中的表,新建数据库和表
    con.execute("create database douban")
    con.execute("use douban")                 #使用douban这个数据库
    con.execute("drop table if exists t_doubantop")
    sql = '''create table t_doubantop(num BIGINT,name VARCHAR(40) NOT NULL,charactor VARCHAR(40),remark VARCHAR(40),score VARCHAR(20))'''
    con.execute(sql)    #sql中的字符表示创建一个表 对应的信息有   num  name  charactor  remark  score

    f = open("F:\\Pythontest1\\douban.txt","r")     #打开路径复制其中的数据,以便导入数据库
    while True:
        line = f.readline()
        if line:
            line = line.strip("\n")
            line = line.split(",")      #你写如.txt文件的数据用逗号分开,此时用逗号将他们转化为列表
            # print(line)
            num = line[0]               #将需要的几个量复制
            name = line[1]
            charactor = line[2]
            remark = line[3]
            score = line[4]
            con.execute("insert into t_doubantop(num,name,charactor,remark,score)values(%s,%s,%s,%s,%s)",[num, name, charactor, remark, score])
        else:                                #导入数据库
            break
    connect.commit()          #这句记得写上提交数据,否则导入为空(有的DDL是不需要导入的)
    con.close()          #最后记得关掉连接
    connect.close()


许多细节自己多注意,自己的数据自己添加就ok了!








  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值