Python爬虫转移到Mysql数据库中最后汇总Excel表格

import requests
import pymysql
import pandas as pd

这个操作一共需要三个库 ,都可以在cmd以管理员身份pip install pymysql/requests/pandas下载

con=pymysql.connect(host='localhost',user='root',password='yourpwd',
db='python+mysql+excel',port=3306) #数据库连接
cur=con.cursor()#创建游标
def create():
    movie_sql='''
        create table movie(
            id int auto_increment primary key not null,
            title varchar(100) character set utf8 collate utf8_general_ci not null,
            url varchar(100) character set utf8 collate utf8_general_ci not null,
            rate float not null)
    '''
    cur.execute(movie_sql)
    con.commit()

 主键primary key作为约束也可以单独在最后指定。

在cur.execute(sql)获取结果,con.commit()提交事务

def get_data():

    url='https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=330&page_start=0%27'
    headers={
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'
    }
    json_data = requests.get(url,headers=headers).json()
    for i in json_data['subjects']:
        insert(i['title'],i['url'],i['rate'])

统一资源定位系统(uniform resource locator;URL

headers浏览器头部名是为了模拟浏览器向服务器发送请求,‘subjects’是‘title’、‘url’、‘rate’的上一层目录,字典存储,‘title’、‘url’、‘rate’是都是key。爬虫相关的知识很多,对此也比较感兴趣,后面也会记录我的学习过程。 

发布后补充:

因为response.text是类似“{'subjects': [{'episodes_info': '', 'rate': '7.8', 'cover_x': 8699, 'title': '瞬息全宇宙'}]}", 是字符串,不是字典。所以要把左右“”去掉,.json()和.text都可以处理requests.get()的内容,上面用json将其化为字典,方便后续分离处理。不会使用json的小伙伴也可以使用 .text之后 dict=eval(str)将字符串转化为字典。但eval方法在安全性方面有所问题,谨慎使用。

def get_data():   #另一种方法
    url='https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=330&page_start=0%27'
    headers={
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    data_str=response.text
    false = null = true = ''
    data_dict=eval(data_str)
    for i in data_dict['subjects']:
        insert(i['title'],i['url'],i['rate'])
        print(i['title'],i['url'],i['rate'])

def insert(title,url,rate):
    sql="insert into movie(title,url,rate) values('"+str(title)+"','"+str(url)+"','"+str(rate)+"')"
    cur.execute(sql)
    con.commit()

 insert中我有一个小疑问,为什么values后面是'"+str(title)+"'的形式,而‘str(title)’就会被完全认作字符串?希望有大神的点拨一二。

def select(movie_name):
    cur.execute(('select * from movie where title={}').format(movie_name))
    results=cur.fetchall()
    for row in results:
        Id=row[0]
        title=row[1]
        url=row[2]
        rate=row[3]
        print('id=%s,title=%s,url=%s,rate=%s' % (Id,title,url,rate))

fetchall() 函数返回多个元组,即返回多个记录(rows),如果没有结果 则返回 () 

遍历查到的结果后,将每一行的信息分开格式化表示。也可以用format函数格式化

print(('id={},title={},url={},rate={}').format(Id,title,url,rate))
print(('id={0},title={1},url={2},rate={3}').format(Id,title,url,rate))
def update(Id,rate1):
    sql='update movie set rate={1} where Id = {0}'.format(Id,rate1)
    cur.execute(sql)
    con.commit()

 调用函数时,传参修改电影的Id和修改的评分。

def delete(Id):
    sql='delete from movie where Id = {0}'.format(Id)
    cur.execute(sql)
    con.commit()
def query_data(sql,excel_name):
    df=pd.read_sql(sql, con=con)
    df.to_excel(excel_name)

用pandas库,将mysql数据库获取的数据, 存入excel表中(若没有excel表则自行建立)

执行代码示例如下:

create()
get_data()
insert('python','http://',9.9)
select('movie_name')
update(10,9.9)
delete(10)
query_data('''select * from movie''','电影推荐.xlsx')
con.close()#无论哪种操作,最后记得关闭python和mysql的连接


起初利用create()建表,mysql就会建立一个空表,这里用mysqlworkbench(数据库建模工具)做演示。在输入网址url和浏览器请求头User-Agent之后,get_data()就会把网站上的数据存到mysql中。利用insert()可以添加电影列表中添加信息;利用select()可以在表中选取电影展示到python中;利用update()可以修改表中电影的评分;利用delete()可以将表中指定电影行删去。利用pandas库调用query_data()函数(在query_data中写sql语句时,可以利用where 、group by 、having 、order by 、limit 5,10抑或是单表聚合查询、⼦查询、多表查询(包括内连接、外连接查询)满足输出数据的需求),使mysql的实时数据导入到同一文件夹的excel表中。

当网站的电影排行榜更新时,爬出来的数据也会改变。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值