python 抓取数据入库 mysql,使用 pymysql
目标:
- 对豆瓣top250,抓取排名,电影名,评分,评论人数,一句话精彩评论,然后保存到 mysql 中
第三方库:
- pymysql
1pip3 install PyMySQL
遇到的问题:
- 编码问题,sql 语句中有中文下,插入数据库报错,已知数据库创建时编码设置为 utf-8,但是为何报错?
1UnicodeEncodeError: 'latin-1' codec can't encode characters in position 70-75: ordinal not in range(256)
在使用 pymysql 连接数据库时,指定编码即可:charset=”utf8″
123import pymysqldb = pymysql.connect(host="127.0.0.1", user="root", passwd="yourpassword", db="python", charset="utf8")
- 执行 sql 语句后不生效?
- 对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。
-
12345678try:# 执行SQL语句cursor.execute(sql)# 向数据库提交db.commit()except:# 发生错误时回滚db.rollback()
由于创建的时 Innodb 类型的数据库,支持事务,需要在执行完 sql后,添加 db.commit() 来提交事务
- 对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
- 使用 pymysql 后报错?
1python-module 'pymysql' has no attribute 'connect'
经Google发现,这是因为 import pymysql,在之前已经导入了这个第三方包,新建的文件名就不能用 pymysql.py ,不能和 import 的包名重复,修改为 douban.py 即可,?,真是来搞笑的
新建 python 数据库,并创建了一个 douban 的表:
1 2 3 4 5 6 7 |
CREATE TABLE `douban` ( `rank` int(3) unsigned NOT NULL DEFAULT 0 COMMENT '排名', `movie_name` varchar(60) NOT NULL DEFAULT '' COMMENT '电影名', `star` float(3,1) unsigned NOT NULL DEFAULT 0.0 COMMENT '评分', `ratings` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '评论人数', `comment` varchar(255) NOT NULL DEFAULT '' COMMENT '一句话精彩评论' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='douban_top_250' |
完整代码:douban.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# -*- encoding: utf-8 -*- import requests from bs4 import BeautifulSoup import time import pymysql db = pymysql.connect(host="127.0.0.1", user="root", passwd="yourpassword", db="python", charset="utf8") cursor = db.cursor() # 抓取豆瓣电影TOP250 # https://movie.douban.com/top250?start=0 第1页 # https://movie.douban.com/top250?start=25 第2页 # ... # https://movie.douban.com/top250?start=225 第10页 print("开始抓取豆瓣电影TOP250") url = "https://movie.douban.com/top250" data = {} for i in range(10): start = i * 25 params = {"start": start} r = requests.get(url, params=params, timeout=2) html = r.text BeaObj = BeautifulSoup(html, "html.parser") flag = 0 for li in BeaObj.ol.find_all("li"): flag += 1 ranking = start + flag img = li.find('img') film = "第" + str(ranking) + "名:" + img['alt'] print(film) # 名次 data['rank'] = str(ranking) # 电影名 data['movie_name'] = img['alt'] # 评分 data['star'] = float(li.find('span', class_="rating_num").string) # 评论数 a = li.select('.star span')[-1].string ratings = a.replace("人评价", "") data['ratings'] = ratings # 精彩一句话评论 data['comment'] = li.select(".quote span")[0].string # sql 语句 sql = """INSERT INTO douban(rank,movie_name,star,ratings,comment) VALUES ("%s","%s",%s,"%s","%s")""" % ( data['rank'], data['movie_name'], data['star'], data['ratings'], data['comment']) print(sql) cursor.execute(sql) db.commit() time.sleep(1) db.close() |
效果图:
近期评论