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

来源:互联网 发布:淘宝网2017女装冬装 编辑:程序博客网 时间:2024/05/03 00:51

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 BeautifulSoupimport pymysqlimport requestsimport reimport osdef 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 datadef 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了!








1 0