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了!