好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

【爬虫实战】如何把抓取到的数据储存下来

如果只是把爬虫程序抓取到的数据用print打印在命令行中或者保存在内存中,那么如果下次还要获取这些数据,就得把这个程序重新跑一遍。浪费时间是其次的,如果网页结构发生了变化,或者API失效了,那么你肯定会后悔当初没有把抓到的数据保存在本地。下午时候在98看到这么一个帖子,试了一下不是很复杂,当作例子讲解一下。

98原帖

了解网站结构

网址:

 http://nappserv.app.yuchai测试数据/weixin-pages/stations/filter  

界面如下:

网页界面F12打开开发者工具,将省选择为“山西省”,此时出现这样一条请求:

点击 Preview 查看响应的预览,可以看出这里的响应为山西省内可查询的市。

类似地,选择市后,响应为该市内可查询的行政区名称,例如:

选中县/区后,点击查询,得到该地的数据:

明确需求

一番攀谈交心了解到,楼主的需求为获取每一个区/县中服务点的个数:需求是王道

抓取数据

刚才看到的 Preview 是浏览器渲染完成后的结果,查看响应还得看 Response 一栏:

返回的HTML可以看出,数据是直接写在html中的,没有加密、混淆等乱七八糟的东西。每个class为station的 div 标签内包含了一个服务点的信息。
 import?requests from?bs4?import?BeautifulSoup  provinces?=?['云南省',?'内蒙区',?'北京市',?'吉林省',?'四川省',?'天津市',?'宁夏省',?'安徽省',?'山东省',?'山西省',?'广西省',?'广东省',?'新疆省',?'江苏省',?'江西省',?'河北省',?'河南省',?'浙江省',?'海南省',?'湖北省',?'湖南省',?'甘肃省',?'福建省',?'西藏省',?'贵州省',?'辽宁省',?'重庆市',?'陕西省',?'青海省',?'黑龙江省']   for?province?in?provinces: ??#?选择省 ??r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/city-list/?province={}'.format(province)) ??for?city?in?r.json()['cities']: ????#?选择市 ????r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/county-list/?city={}'.format(city)) ????for?county?in?r.json()['counties']: ??????#?选择区/县 ??????r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/results/?county={}&city={}&province={}'.format(county,?city,?province)) ??????bs?=?BeautifulSoup(r.text,?'html.parser') ??????print(province,?city,?county,?len(bs.find_all('div',?class_="stations")))  
运行程序,打印出来的结果为:

保存数据

保存为txt

因为一般用Python读写的数据都是txt格式和json格式,我脑子一热就保存为data.txt了。
 with?open('data.txt',?'w')?as?f: ????#?省略爬虫代码 ????f.write(str(province)?+?'?'?+?str(city)?+?'?'?+?str(county)?+?':'?+?str(len(bs.find_all('div',?class_="stations")))?+?'\n')  
但是txt文件想批量处理的话还是得用程序来完成,对小白不是很友好。果不其然:

保存为csv

楼主要求保存为excel可以打开的格式,我的第一反应是保存为csv格式。可能是因为很多比赛的数据集都是json和csv格式,很少有xlsx格式的。CSV(comma-separated values,逗号分隔值)是储存表格数据的常用文件格式。CSV文件列与列之间用逗号隔开,行与行之间用一个换行符分割。Python的 csv库 可以很方便的读写csv文件:
 import?csv with?open("data.csv",?"a",?newline="")?as?cf: ????w?=?csv.writer(cf) ????#?省略爬虫代码? ????w.writerow([str(province)?+?'?'?+?str(city)?+?'?'?+?str(county),?str(len(bs.find_all('div',?class_="stations")))])  
保存下来的csv文件如果用mac自带的Numbers表格打开是可以正常显示的,虽然数据那一列有点问题:

但是如果用excel打开就会出现乱码。

乱码猜测是编码形式的原因,快该吃饭了就没有细究,我决定还是直接保存为xls格式的文件。

保存为xls

Python读写 xls/xlsx 文件需要用到两个第三方库: xlrd 和 xlwt ,因为这次的目的是写入文件,所以这里用的是 xlwt 。因为我是看文档 [1] 现学的,就不照着抄了到笔记里了,需要的可以直接去看文档,官方文档肯定是最准确的。
 import?xlwt ? #创建一个Workbook对象,相当于创建了一个Excel文件 book?=?xlwt.Workbook(encoding="utf-8",style_compression=0) ? sheet?=?book.add_sheet('sheet',?cell_overwrite_ok=True) sheet.write(0,?0,?'地区')??#?其中的'0-行,?0-列'指定表中的单元,'各省市'是向该单元写入的内容 sheet.write(0,?1,?'数量')  i?=?0 for?province?in?provinces: ????r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/city-list/?province={}'.format(province)) ????for?city?in?r.json()['cities']: ????????r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/county-list/?city={}'.format(city)) ????????for?county?in?r.json()['counties']: ????????????r?=?requests.get('http://nappserv.app.yuchai测试数据/weixin-pages/stations/results/?county={}&city={}&province={}'.format(county,?city,?province)) ????????????bs?=?BeautifulSoup(r.text,?'html.parser') ????????????print(province,?city,?county,?len(bs.find_all('div',?class_="stations"))) ????????????sheet.write(i+1,?0,?str(province)?+?'?'?+?str(city)?+?'?'?+?str(county)) ????????????sheet.write(i+1,?1,?len(bs.find_all('div',?class_="stations"))) ????????????i?+=?1 ???????????? book.save('data.xls')?  
终于交差了:

保存到数据库中

一般是用MySQL,《Web Scraping with Python, 2nd Edition》中有一整章都在讲这个,有机会用到了再仔细学。

O'reilly动物书,永远的神不要看国内的爬虫入门书,基本都是在翻译旧版本的文档,翻译的差,代码维护也差。基础知识掌握以后,有新的需求还是要去看文档。后台回复“入门书”,获得本书英文版的pdf下载链接,不过建议还是买一本支持一下作者,中文版的也算。

查看更多关于【爬虫实战】如何把抓取到的数据储存下来的详细内容...

  阅读:42次