一数据持久化存储-csv文件

1.作用

将爬取的数据存放到本地的csv文件中

2.使用流程

1、导入模块2、打开csv文件3、初始化写入对象4、写入数据(参数为列表)importcsv

with open('film.csv','w') as f:

writer=csv.writer(f)

writer.writerow([])

writer.writerows([(),(),()])

3.示例代码

创建text.csv文件,在文件中写入数据

#单行写入(writerow([]))

importcsv

with open('test.csv','w',newline='') as f:

writer=csv.writer(f)

writer.writerow(['步惊云','36'])

writer.writerow(['聂风','36'])#多行写入(writerows([(),(),()]

importcsv

with open('test.csv','w') as f:

writer=csv.writer(f)

writer.writerows([('聂风','36'),('秦霜','25'),('孔慈','30')])

练习:猫眼电影数据存入本地 maoyanfilm.csv 文件 - 使用writerow方法实现

思考:使用 writerows()方法实现?

importcsvfrom urllib importrequest, parseimportreimporttimeimportrandomfrom useragents importua_listclassMaoyanSpider(object):def __init__(self):

self.url= 'https://maoyan.com/board/4?offset={}'

#计数

self.num =0defget_html(self, url):

headers={'User-Agent': random.choice(ua_list)

}

req= request.Request(url=url, headers=headers)

res=request.urlopen(req)

html= res.read().decode('utf-8')#直接调用解析函数

self.parse_html(html)defparse_html(self, html):#创建正则的编译对象

re_ = '

.*?title="(.*?)".*?

(.*?)

.*?

(.*?)

'pattern=re.compile(re_, re.S)#film_list:[('霸王别姬','张国荣','1993')]

film_list =pattern.findall(html)

self.write_html(film_list)#存入csv文件-writerrows

defwrite_html(self, film_list):

L=[]

with open('maoyanfilm.csv', 'a',newline='') as f:#初始化写入对象,注意参数f不能忘

writer =csv.writer(f)for film infilm_list:

t=(

film[0].strip(),

film[1].strip(),

film[2].strip()[5:15]

)

self.num+= 1L.append(t)#writerow()参数为列表

writer.writerows(L)print(L)#def write_html(self,film_list):

#with open('maoyanfilm.csv','a') as f:

##初始化写入对象,注意参数f不能忘

#writer=csv.writer(f)

#for film in film_list:

#L=[

#film[0].strip(),

#film[1].strip(),

#film[2].strip()[5:15]

#]

#self.num+=1

## writerow()参数为列表

#writer.writerow(L)

defmain(self):for offset in range(0, 91, 10):

url=self.url.format(offset)

self.get_html(url)

time.sleep(random.randint(1, 2))print('共抓取数据', self.num, "部")if __name__ == '__main__':

start=time.time()

spider=MaoyanSpider()

spider.main()

end=time.time()print('执行时间:%.2f' % (end - start))

writeow方法

ua_list =['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201','Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50',

]

useragents.py配置文件

二数据持久化存储 - MySQL数据库

1.在数据库中建库建表

#连接到mysql数据库

mysql -h127.0.0.1 -uroot -p123456#建库建表

create database maoyandb charset utf8;

use maoyandb;

create table filmtab(

name varchar(100),

star varchar(300),

time varchar(50)

)charset=utf8;

2.回顾pymysql基本使用

importpymysql#创建2个对象

db = pymysql.connect('localhost','root','123456','maoyandb',charset='utf8')

cursor=db.cursor()#执行SQL命令并提交到数据库执行#execute()方法第二个参数为列表传参补位

cursor.execute('insert into filmtab values(%s,%s,%s)',['霸王别姬','张国荣','1993'])

db.commit()#关闭

cursor.close()

db.close()

3.来试试高效的executemany()方法?

importpymysql#创建2个对象

db = pymysql.connect('192.168.153.137','tiger','123456','maoyandb',charset='utf8')

cursor=db.cursor()#抓取的数据

film_list = [('月光宝盒','周星驰','1994'),('大圣娶亲','周星驰','1994')]#执行SQL命令并提交到数据库执行#execute()方法第二个参数为列表传参补位

cursor.executemany('insert into filmtab values(%s,%s,%s)',film_list)

db.commit()#关闭

cursor.close()

db.close()

importpymysql#__init__(self):

self.db = pymysql.connect('IP',... ...)

self.cursor=self.db.cursor()#write_data(self):

self.cursor.execute('sql',[data1])

self.cursor.executemany('sql',[(data1),(data2),(data3)])

self.db.commit()#main(self):

self.cursor.close()

self.db.close()

4.将电影信息存入MySQL数据库(尽量使用executemany方法)

importpymysqlfrom urllib importrequest, parseimportreimporttimeimportrandomfrom useragents importua_listclassMaoyanSpider(object):def __init__(self):

self.url= 'https://maoyan.com/board/4?offset={}'

#计数

self.num =0

self.db=pymysql.connect('localhost', 'root', '123456', 'maoyandb', charset='utf8')

self.cursor=self.db.cursor()defget_html(self, url):

headers={'User-Agent': random.choice(ua_list)

}

req= request.Request(url=url, headers=headers)

res=request.urlopen(req)

html= res.read().decode('utf-8')#直接调用解析函数

self.parse_html(html)defparse_html(self, html):#创建正则的编译对象

re_ = '

.*?title="(.*?)".*?

(.*?)

.*?

(.*?)

'pattern=re.compile(re_, re.S)#film_list:[('霸王别姬','张国荣','1993')]

film_list =pattern.findall(html)

self.write_html(film_list)defwrite_html(self, film_list):

ins= 'insert into filmtab values(%s,%s,%s)'

for film infilm_list:

L=[

film[0].strip(),

film[1].strip(),

film[2].strip()[5:15]

]

self.num+=1

print('爬取成功',self.num,'部')

self.cursor.execute(ins, L)#提交到数据库执行

self.db.commit()defmain(self):for offset in range(0, 91, 10):

url=self.url.format(offset)

self.get_html(url)

time.sleep(random.randint(1, 2))print('共抓取数据', self.num, "部")#断开数据库

self.cursor.close()

self.db.close()if __name__ == '__main__':

start=time.time()

spider=MaoyanSpider()

spider.main()

end=time.time()print('执行时间:%.2f' % (end - start))

示例

importpymysqlfrom urllib importrequest, parseimportreimporttimeimportrandomfrom useragents importua_listclassMaoyanSpider(object):def __init__(self):

self.url= 'https://maoyan.com/board/4?offset={}'

#计数

self.num =0

self.db=pymysql.connect('localhost', 'root', '123456', 'maoyandb', charset='utf8')

self.cursor=self.db.cursor()defget_html(self, url):

headers={'User-Agent': random.choice(ua_list)

}

req= request.Request(url=url, headers=headers)

res=request.urlopen(req)

html= res.read().decode('utf-8')#直接调用解析函数

self.parse_html(html)defparse_html(self, html):#创建正则的编译对象

re_ = '

.*?title="(.*?)".*?

(.*?)

.*?

(.*?)

'pattern=re.compile(re_, re.S)#film_list:[('霸王别姬','张国荣','1993')]

film_list =pattern.findall(html)

self.write_html(film_list)#mysql-executemany

defwrite_html(self, film_list):

L=[]

ins= 'insert into filmtab values(%s,%s,%s)'

for film infilm_list:

t=[

film[0].strip(),

film[1].strip(),

film[2].strip()[5:15]

]

self.num+=1L.append(t)print('爬取成功',self.num,'部')

self.cursor.executemany(ins, L)#提交到数据库执行

self.db.commit()defmain(self):for offset in range(0, 91, 10):

url=self.url.format(offset)

self.get_html(url)

time.sleep(random.randint(1, 2))print('共抓取数据', self.num, "部")#断开数据库

self.cursor.close()

self.db.close()if __name__ == '__main__':

start=time.time()

spider=MaoyanSpider()

spider.main()

end=time.time()print('执行时间:%.2f' % (end - start))

executemany方法

5.做个SQL查询

1、查询20年以前的电影的名字和上映时间

select name,timefrom film where time<=(now()-interval 20year);2、查询1990-2000年的电影名字和上映时间

select name,timefrom film where time>='1990-01-01' and time<='2000-12-31';

三数据持久化存储-MongoDB数据库

(一)特点

1.非关系型数据库

2.库/集合(MySQL中表),文档(MySQL中表记录)

3.无须手动建库建集合

4.基本命令

#查看所有的库

>show dbs#切换库

>use 库名#查看库中所有的集合

>show collections#查看集合中所有文档

>db.集合名.find().pretty()#统计集合中文档个数

>db.集合名.count()

(二)pymongo操作mongodb数据库

importpymongo#1.连接对象

conn =pymongo.MongoClient(

host='127.0.0.1',

port=27017)#2.库对象db= conn['maoyandb'] #第一种方法#db = conn.maoyandb #第二种方法#3.集合对象

myset = db['filmtab']#4.插入数据库#插入一个

myset.insert_one({'name':'赵敏'})#插入多个

myset.insert_many()

importpymongo#__init__(self):

self.conn = pymongo.MongoClient('IP',27017)

self.db= self.conn['db_name']

self.myset= self.db['set_name']#write_data(self):

self.myset.insert_one(dict)#MongoDB - Commmand

>show dbs>use db_name>show collections>db.collection_name.find().pretty()>db.collection_name.count()>db.collection_name.drop()>db.dropDatabase()

练习:将电影信息存入MongoDB数据库

importpymongofrom urllib importrequestimportreimporttimeimportrandomfrom useragents importua_listclassMaoyanSpider(object):def __init__(self):

self.url= 'https://maoyan.com/board/4?offset={}'

#计数

self.num =0#创建3个对象

self.conn = pymongo.MongoClient(host='127.0.0.1',port=27017)

self.db= self.conn['maoyandb']

self.myset= self.db['filmset']defget_html(self, url):

headers={'User-Agent': random.choice(ua_list)

}

req= request.Request(url=url, headers=headers)

res=request.urlopen(req)

html= res.read().decode('utf-8')#直接调用解析函数

self.parse_html(html)defparse_html(self, html):#创建正则的编译对象

re_ = '

.*?title="(.*?)".*?

(.*?)

.*?

(.*?)

'pattern=re.compile(re_, re.S)#film_list:[('霸王别姬','张国荣','1993')]

film_list =pattern.findall(html)

self.write_html(film_list)#mysql-executemany

defwrite_html(self, film_list):for film infilm_list:

film_dict={'name':film[0].strip(),'star':film[1].strip(),'time':film[2].strip()[5:15]

}

self.num+=1

#插入mongodb数据库

self.myset.insert_one(film_dict)print('爬取成功', self.num, '部')defmain(self):for offset in range(0, 91, 10):

url=self.url.format(offset)

self.get_html(url)

time.sleep(random.randint(1, 2))print('共抓取数据', self.num, "部")if __name__ == '__main__':

start=time.time()

spider=MaoyanSpider()

spider.main()

end=time.time()print('执行时间:%.2f' % (end - start))

代码

多级页面数据抓取

#整体思路

1、爬取一级页面,提取 所需数据+链接,继续跟进2、爬取二级页面,提取 所需数据+链接,继续跟进3、... ...#代码实现思路

1、所有数据最终都会在一级页面解析函数中拿到2、避免重复代码 - 请求、解析需定义函数

电影天堂案例 - 二级页面抓取

领取任务:

#地址

电影天堂 - 2019年新片精品 -更多#目标

电影名称、下载链接#分析

*********一级页面需抓取***********

1、电影名称2、电影链接*********二级页面需抓取***********

1、下载链接

实现步骤:

1、确定响应内容中是否存在所需抓取数据

2、找URL规律

第1页 :https://www.dytt8.net/html/gndy/dyzz/list_23_1.html

第2页 :https://www.dytt8.net/html/gndy/dyzz/list_23_2.html

第n页 :https://www.dytt8.net/html/gndy/dyzz/list_23_n.html

写正则表达式:

1、一级页面正则表达式

2、二级页面正则表达式

importcsvfrom urllib importrequestimportrefrom useragents importua_listimporttimeimportrandomclassFilmSkySpider(object):def __init__(self):

self.url= 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'

#获取相应内容

defget_html(self, url):

headers= {'User-Agent': random.choice(ua_list)}

req= request.Request(url=url, headers=headers)

res=request.urlopen(req)#通过网站查看网页远吗,查看网站charset='gb2312'

#如果遇到解码错误,识别不了一些字符,则 ignore

html = res.read().decode('gb2312','ignore')returnhtml#正则解析功能函数

defre_func(self, re_bds, html):

pattern=re.compile(re_bds, re.S)

r_list=pattern.findall(html)returnr_list#获取数据函数 html是一级页面相应内容

defparse_page(self, html):#想办法获取到 电影名称和下载链接

re_bds = r'

'

#one_page_list:[('/html/xxx','幸福猎人'),()]

one_page_list =self.re_func(re_bds, html)

with open('movefilm.csv', 'a', newline='') as f:#初始化写入对象,注意参数f不能忘

writer =csv.writer(f)

item={}for film inone_page_list:

item['name'] = film[1].strip()

link= 'https://www.dytt8.net' +film[0]

item['download'] =self.parse_two_page(link)

time.sleep(random.uniform(1, 3))print(item)

writer.writerows(item)#解析二级页面数据

defparse_two_page(self, link):

html=self.get_html(link)

re_bds= r'

mysql不能持久存储数据的是_数据持久化存储相关推荐

  1. 数据图表可视化_数据可视化如何选择正确的图表第1部分

    数据图表可视化 According to the World Economic Forum, the world produces 2.5 quintillion bytes of data ever ...

  2. mysql 数据割接_数据割接笔记

    --exprot date from oracle exp tbcy/123456@TestB1 file=OM_chetian.dmp log=20.log tables=chey indexes= ...

  3. 数据分析师入门_数据分析师入门基础指南

    数据分析师入门 Back in the summer of 2018, I was just starting my first internship as a Data Analyst. 早在201 ...

  4. 数据预处理工具_数据预处理

    数据预处理工具 As the title states this is the last project from Udacity Nanodegree. The goal of this proje ...

  5. 数据可视化工具_数据可视化

    数据可视化工具 Visualizations are a great way to show the story that data wants to tell. However, not all v ...

  6. 大数据平台蓝图_数据科学面试蓝图

    大数据平台蓝图 1.组织是关键 (1. Organisation is Key) I've interviewed at Google (and DeepMind), Uber, Facebook, ...

  7. etl数据抽取工具_数据同步工具ETL、ELT傻傻分不清楚?3分钟看懂两者区别

    什么是数据同步工具(ETL.ELT) 数据同步工具ETL或者ELT的作用是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决 ...

  8. 数据透视表和数据交叉表_数据透视表的数据提取

    数据透视表和数据交叉表 Consider the data of healthcare drugs as provided in the excel sheet. The concept of piv ...

  9. 鲜活数据数据可视化指南_数据可视化实用指南

    鲜活数据数据可视化指南 Exploratory data analysis (EDA) is an essential part of the data science or the machine ...

最新文章

  1. 深度学习 CNN trick 合集
  2. Gut:粪便病毒组移植减轻2型糖尿病和肥胖症模型小鼠的相关症状
  3. POJ 3982 序列 塔尔苏斯问题解决
  4. easy_runner一个简单的压测程序
  5. Spring系列之一 Spring MVC
  6. 如何通过putty软件远程登录并且控制linux平台
  7. 福利来啦!! - PostgreSQL9.5架构图与外存图
  8. sharepoint 弹出框
  9. SmartGit使用教程
  10. 多级指针和静动态内存的跨函数访问
  11. fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表
  12. python3兼容python2 print_python 字符串 r raw Python2 和 Python3 的区别及兼容技巧
  13. Linux报错:/etc/sudoers is world writable
  14. 面向车、路、城,华人运通“智路”示范项目开通试运行
  15. JavaScript43种常见的浏览器兼容性问题大汇总
  16. 更新mac自带的python
  17. 用 Webgoat 撬动地球,看安全测试的引路石!
  18. js判断用户是第一次点击还是第二次点击
  19. linux u盘 写保护,高手分享U盘被写保护的解决方案
  20. pta 7-2 jmu-python-组合数 (20 分) python函数练习

热门文章

  1. useEffect 清理副作用
  2. --i和i--的区别
  3. Android开发学习之探究服务
  4. python自学笔记
  5. 【Shell】mksh运行分析
  6. 【gensim问题记录】EOFError: unexpected end of input; is count incorrect or file otherwise damaged?
  7. SMBLoris windows拒绝服务漏洞
  8. HepcoMotion海普克_广州权硕 EeIE2019智博会深圳国际会展智造首秀
  9. 独家 | PHM数据竞赛首个中国夺冠团队经验分享(常用模型赛题详解PPT视频)...
  10. 漱口水的性别真的重要吗