python爬取豆瓣电影top250并保存至数据库

数据库准备

python爬取豆瓣电影top250并保存至数据库_第1张图片

net start mysql
mysql -u root -p

create database douabn char set = utf8;#创建douban数据库
use douabn ;
create table doubantop250(
    rank int unsigned primary key not null,
    movie_name varchar(200),#名字
    grade decimal(10,1), #评分
    quote varchar(500), #短评
    people int unsigened #评论人数 
);

python爬取豆瓣电影top250并保存至数据库_第2张图片

pymysql

from pymysql import *

    # 创建connection连接  连接对象
    conn = connect(host="localhost", user='root', password='', database='douban', charset='utf8')

    # 获取Cursor对象  游标对象
    cs1 = conn.cursor()
    
    # 执行SQL,并返回收影响行数
	cs1.execute(sql)
	print(cursor.fetchone()) 
	
	#提交,不然无法保存新建或者修改的数据
	conn.commit()

	# 关闭游标
	cs1.close()
	
	# 关闭连接
	conn.close()
	
	#获取查询的结果
    result = cs1.fetchone() #返回一个元组  fetchmany()和fetchall()返回的结果是元组套元组 
    # 如果想要或者字典类型的数据,即通过游标设定参数 
	cursor=pymysql.cursors.DictCursor:

python代码

import requests
from lxml import etree
from pymysql import *

def getdata():
    # 创建connection连接  连接对象
    conn = connect(host="localhost", user='root', password='', database='douban', charset='utf8')

    # 获取Cursor对象  游标对象
    cs1 = conn.cursor()

    #拼接网址,发起请求
    for x in range(0,226,25):
        #拼接出来每一页的地址
        url = "https://movie.douban.com/top250?start={}&filter=".format(x)
        print("正在爬取--{}--网址的数据".format(url))
        kv = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}  # 更改头部信息,对于要求较高的网站
        response = requests.get(url=url, headers=kv)
        # print(response.headers)
        html_obj = etree.HTML(response.text)
        div_list = html_obj.xpath('//div[@class="item"]')
        for div in div_list:
            rank = div.xpath('div[1]/em/text()')[0]
            movie_name = div.xpath('div[2]/div[1]/a/span/text()')[0]
            director = div.xpath('div[2]/div[2]/p/text()')[0]
            year_country = div.xpath('div[2]/div[2]/p/text()')[1]
            # country=div.xpath('div[2]/div[2]/p/text()')[1].split("/")[0]
            grade = div.xpath('div[2]/div[2]/div/span[2]/text()')[0]
            #replace():把**字符替换成**
            comment_num = div.xpath('div[2]/div[2]/div/span[4]/text()')[0].replace("人评价","")
            #因为有的电影没有短评,强行匹配短评会报错!
            try:
                short_comment = div.xpath('div[2]/div[2]/p[2]/span/text()')[0]
            except Exception as e:
                short_comment="没有短评"
            #定义一个字符串,存储清理过后的电影名称
            movie_name_string = ''
            for movie in movie_name:
                #把电影名称中的\xa0替换成空,然后把处理过后的电影名称拼接起来
                movie_name_string+=movie.replace("\xa0","") # \xa0 是不间断空白符  

            # 定义字符串,存储清理过后的年份及国家
            movie_year_string=str(year_country.replace('\n',"").replace("\xa0","").split("/")[0])
            movie_country_string=str(year_country.replace('\n',"").replace("\xa0","").split("/")[1])
            movie_category_string=str(year_country.replace('\n',"").replace("\xa0","").split("/")[2])

            # 演员表中会遇到不完整情况
            try:
                movie_director_string=str(director.replace('\n',"").split('\xa0\xa0\xa0')[0]).strip(' ') #strip()方法从字符串中去掉在其左侧和右侧的空格时,括号内单引号里应保留空格
                movie_actor_string = str(director.replace('\n', "").split('\xa0\xa0\xa0')[1])
            except Exception as e:
                movie_actor_string="..."

            movie_dict = {"电影排名": rank, "电影名称": movie_name_string, "年份": movie_year_string, "国家": movie_country_string,
                          "类型": movie_category_string, "导演": movie_director_string, "主演": movie_actor_string,
                          "电影评分": grade, "电影评论数": comment_num, "电影短评": short_comment}
            sql = 'insert into doubantop250(rank,movie_name,grade,quote,people) values (%d,"%s",%.1f,"%s",%d)' % (
                int(rank), str(movie_name_string), float(grade),short_comment, int(comment_num))
            cs1.execute(sql)
            conn.commit()

    cs1.close()
    conn.close()

if __name__ == '__main__':
    getdata()

结果

python爬取豆瓣电影top250并保存至数据库_第3张图片

你可能感兴趣的:(python爬取豆瓣电影top250并保存至数据库)