这篇博客本来是接第一篇的(关于如何抓取数据下来),但由于CSDN现在不能发布关于爬虫的博客,所以我来写写抓取的数据如何整理吧。
当我们抓取文件的时候,如果网络突然断开,这样不仅会中断抓取,而且还会让我们的数据全部丢失,那么此时我们就可以使用一种方法:即每隔20条数据自动创建一个Excel文件,就能减小风险。
import pandas as pd import urllib import requests from lxml import etree import urllib.request as req import re import requests from lxml import etree from bs4 import BeautifulSoup import urllib.request as req import requests import time import numpy as np import urllib # import urllib2 import os headers={'User-Agent':'.........'} skdfs=pd.DataFrame() for ski in range(0,30): skdf=pd.DataFrame() url='http://........com.cn/skygb/sk/index.php/index/seach/'+str(ski) reuqest=urllib.request.Request(url,headers=headers) content=urllib.request.urlopen(reuqest).read() soup=BeautifulSoup(content,'lxml') tables=soup.findAll('table') tab=tables[2] # 查找发现tables[2]是我们要的数据 skdata=pd.read_html(tab.prettify()) skdf=pd.DataFrame(skdata[0]) skdfs=skdfs.append(skdf) print('已经完成第'+str(ski)+'页') skdf.to_excel("skfiles/"+str(ski)+".xlsx",encoding='utf-8-sig') # 在skfiles文件夹下面 time.sleep(np.random.randint(5)) # skdfs.to_excel("skfiles.xlsx",encoding='utf-8-sig')
如图即为爬取的数据,会放到skfiles
文件夹下的Excel当中:
一个Excel当中有20条记录,那么如果是要让100条记录在一个Excel当中呢?
for ski in range(0,30): # 0-30页,我要每5页创建一个Excel文件 skdf=pd.DataFrame() url='http://fz.people.com.cn/skygb/sk/index.php/index/seach/'+str(ski) reuqest=urllib.request.Request(url,headers=headers) content=urllib.request.urlopen(reuqest).read() soup=BeautifulSoup(content,'lxml') tables=soup.findAll('table') tab=tables[2] # 查找发现tables[2]是我们要的数据 skdata=pd.read_html(tab.prettify()) skdf=pd.DataFrame(skdata[0]) skdfs=skdfs.append(skdf) print('已经完成第'+str(ski)+'页') if((ski%10)==0): skdf.to_excel("skfiles/"+str(ski)+".xlsx",encoding='utf-8-sig') # 在skfiles文件夹下面 time.sleep(np.random.randint(5)) # skdfs.to_excel("skfiles.xlsx",encoding='utf-8-sig')
每隔5页创建一个Excel文件:
数据合并(追加)
比如我们要把上面的5.xlsx到25.xlsx合并起来,应该如果做呢
方法一:Excel
调用查询编辑器power quer:
导入数据源:将10.xlsx与25.xlsx进行连接:
此时即追加成功
方法二:Python
我要将下图的两个Excel文件通过Python进行合并
注:不能直接写("skdf2810.xlsx",usecols=np.arange(1,21))
,要确保Python与Excel的文件路径一致。
import numpy as np import pandas as pd skdf1=pd.read_excel("skfiles/skdf2810.xlsx",usecols=np.arange(1,21)) skdf2=pd.read_excel("skfiles/skdf5020.xlsx",usecols=np.arange(1,21))
其中这句话的含义是:usecols=np.arange(1,21)
当读取表格的时候只从第一列开始读,第0列不用读,因为0列没有多大意义。
合并:
skdf=skdf1.append(skdf2) skdf.info
关于Python的merge:
如果我把数据分成两半,sheet1是原始数据,sheet2是sheet1的前3行,sheet3是sheet1的后三行,则是否可以使用merge将后两张表进行合并呢?
# 以stus为例 studf1=pd.read_excel("stus.xlsx","Sheet2") studf2=pd.read_excel("stus.xlsx","Sheet3") # df1与df2没有共同语言 stusdf=pd.read_excel("stus.xlsx")
但是仔细想想,studf1和studf2分别都和studf有共同语言啊!
stusdfm=pd.merge(studf1,stusdf,how="left") #merge是考虑关系型数据,两者此时有共同语言
此时在sheet2最下面加一行数据:
此时就添加了:
# stusdfapp=studf1.append(studf2) stusdfm=pd.merge(studf1,stusdf,how="left") #merge是考虑关系型数据
其中的how="left"
是merge当中的一个参数,表示按照左边为索引进行合并,只有左边有该数据,则才会和右边的一起合并。而省略该参数则默认how=inner。
当我们把学号列添加到是studf2的时候,此时两者有了联系:
那么如果把学号改成stuid是否还能成功呢:
此时则涉及到merge的另外两个参数left_on
和right_on
:
left_on='学号',right_on='stuid'
表示左边要合并的表的共同列为学号列,右边的为stuid列
stusdfm2=pd.merge(studf1,studf2,how="outer",left_on='学号',right_on='stuid') #可以对应,名称不重要,数据要相同
stusdfm3=pd.merge(studf1,studf2,on=suffixes=['_l','_r']) # 当两张表都有相同的学号数据 stusdfm3