准备工作: 需要先安装chrome浏览器
其次,下载chromedriver驱动,下载方式可点击这里,下载完毕放置的位置没有要求,只需要在下面的代码中将地址改成你的chromedriver驱动放置的位置就可以啦。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
爬虫代码如下:
# -*- codeing = utf-8 -*- # Datatime:2020/12/5 5:04 # Filename:text3 .py # Toolby: PyCharm import time import ssl import xlwt from selenium import webdriver from bs4 import BeautifulSoup ssl._create_default_https_context = ssl._create_unverified_context #爬取网页,得到数据 def getData(): chrome_driver = "D:\Google\chromedriver_win32\chromedriver.exe" #chromedriver驱动文件的位置 browser = webdriver.ChromeOptions() browser.add_argument('user-agent=Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 87.0.4280.66 Safari / 537.36') browser.add_argument('--ignore-certificate-errors') ss = webdriver.Chrome(executable_path=chrome_driver,chrome_options=browser) ss.get('https://data.stats.gov.cn/easyquery.htm?cn=C01') time.sleep(30) #睡眠3秒,等待页面加载 ss.find_element_by_id('mySelect_sj').click() #点击时间的下拉列表框 time.sleep(2) #睡眠3秒,等待页面加载 ss.find_element_by_class_name('dtText').send_keys('1949-,last10') #在时间框里输入时间:1949-,last10 time.sleep(1) #睡眠1秒,等待页面加载 ss.find_element_by_class_name('dtTextBtn').click() #点击确定 time.sleep(1) #睡眠1秒,等待页面加载 ss.find_element_by_id('treeZhiBiao_4_a').click() #点击人口 time.sleep(3) #睡眠3秒,等待页面加载 ss.find_element_by_id('treeZhiBiao_30_a').click() #点击总人口 time.sleep(5) #睡眠5秒,等待页面加载 infos1 = ss.find_element_by_id('main-container') #定位到id=main-container的元素(标签) thead = infos1.find_element_by_tag_name('thead').get_attribute("innerHTML") #取得thead标签的html字符串,为str类型 tbody1 = infos1.find_element_by_tag_name('tbody').get_attribute("innerHTML") #取得tbody标签的html字符串,为str类型 ss.find_element_by_id('treeZhiBiao_31_a').click() #点击人口出生率、死亡率和自然增长率 time.sleep(5) #睡眠5秒,等待页面加载 infos2 = ss.find_element_by_id('main-container') #定位到id=main-container的元素(标签) tbody2 = infos2.find_element_by_tag_name('tbody').get_attribute("innerHTML") # 取得tbody标签的html字符串,为str类型 return thead, tbody1,tbody2 # 解析得到的数据 def analyseData(): thead,tbody1,tbody2 = getData() #保存爬取到的网页源码,thead,tbody为str类型 soup1 = BeautifulSoup(thead, "html.parser") #将thead赋值给soup1,soup1为bs4.BeautifulSoup类型 soup2 = BeautifulSoup(tbody1, "html.parser") #将tbody赋值给soup2,soup2为bs4.BeautifulSoup类型 soup3 = BeautifulSoup(tbody2, "html.parser") #将tbody赋值给soup2,soup2为bs4.BeautifulSoup类型 datalist = [] #声明一个存储所有数据的汇总列表 for item in soup1.find_all(name='tr'): #item为bs4.element.Tag类型 bb = [] #临时存储年份 for item2 in item.find_all(name='th'): #item2为bs4.element.Tag类型 bb.append(item2.text) #item2.text为str类型 bb.reverse() #将所有数据重新排列,若不排列,则为2019 2018 2017... ,排序后为1949,1950,1951... for i in range(1): #元素右移1位 bb.insert(0, bb.pop()) datalist.append(bb) #将年份数据存入汇总列表中 for item in soup2.find_all(name='tr'): #item为bs4.element.Tag类型 bb = [] #用于循环时,依次临时存储总人口、男性人口、女性人口、城镇人口、乡村人口 for item2 in item.find_all(name='td'): #item2为bs4.element.Tag类型 bb.append(item2.text) #item2.text为str类型 bb.reverse() #将所有数据重新排列 for i in range(1): #元素右移1位 bb.insert(0, bb.pop()) datalist.append(bb) #通过循环将总人口、男性人口、女性人口、城镇人口、乡村人口依次存入汇总列表中 for item in soup3.find_all(name='tr'): #item为bs4.element.Tag类型 bb = [] #用于循环时,依次临时存储人口出生率、人口死亡率、人口自然增长率 for item2 in item.find_all(name='td'): #item2为bs4.element.Tag类型 bb.append(item2.text) #item2.text为str类型 bb.reverse() #将所有数据重新排列 for i in range(1): #元素右移1位 bb.insert(0, bb.pop()) #通过循环将人口出生率、人口死亡率、人口自然增长率依次存入汇总列表中 datalist.append(bb) return datalist # 存储数据 def saveData(): datalist = analyseData() #获取数据解析好的数据 book = xlwt.Workbook(encoding="utf-8", style_compression=0) #新建工作本 sheet = book.add_sheet("1949-2019年人口数据",cell_overwrite_ok=True) #添加工作表 for item in datalist: for item1 in item: print(item1) sheet.write(item.index(item1),datalist.index(item),item1) #向工作表1949-2019年人口数据中写入数据 sheet.write(0,0,"年份") #将第一列的属性值改为‘年份’(爬虫得到是‘指标’ book.save("source.xlsx") #保存文件 print("end") #程序入口处 if __name__=='__main__': saveData()
可能会报如下错误:
这是由于加载页面太慢的原因,把代码中的睡眠时间改大一点就可以啦。
如果遇到编码问题,建议改用pycharm运行程序。
程序运行时会自动打开chrome浏览器,进行操作。
爬取成功!
可以看到得到了一个文件source.xlsx,只有这个文件是爬虫过程中生成的,其他文件都是我测试别的东西的时候的创建的。
打开可以看到得到的数据如下:
会有缺失,这在爬虫很正常,进行简单的数据清洗就可以啦。附上代码:
# -*- codeing = utf-8 -*- # Datatime:2020/12/5 21:22 # Filename:fillna .py # Toolby: PyCharm import pandas data = pandas.read_excel(r'source.xlsx',sheet_name=0) #缺失值填充 data= data.interpolate() #若前后都不为空时,用前后的均值填充,同时兼具向前填充的功能 data= data.fillna(method='bfill') #向后填充 data.to_excel("fillna.xlsx") #保存数据 print("保存成功")
结果如下:
缺失没有啦
至于增加了第一列,是由于用pandas进行数据清洗时自动生成的,不想要的话可手动删除。