求助:python爬取国家统计局多个列表数据时出错
本人python小白,最近迷上国家统计局,想将统计局上的数据爬取下下,放到mysql。
第一步,爬取年度数据(默认为2010-2019年)
首先,上网查了类似的帖子,照葫芦画瓢,东拼西凑,磕磕碰碰,最终把代码整合在一起。初步成功,能把国家统计局上的年度数据,大部分拷贝下来。如下图
表中数据默认为2010-2019年,由于爬取列标题时,有“2019年”,但没有爬取到“2019年”对应的数据,估计为预留栏,故默认为0。
第二步,爬取年度数据(自定义LAST30)
由于统计局默认为前10年的数据,如需查看其它年份,需登录后通过手工选取年份查看。
再次上网东拼西凑后,貌似要加上session。
由于对session不了解,只能瞎猜,session是打开一个网页,然后模拟选取年份,查看相应的数据,理论上可行。
小试了一下,发现不对。爬了8个表,4个正常,4个异常。
A0101行政区划,爬取数据正常。
A0102人均主要工农业产品产量,爬取的数据居然是A0101行政区划的。
A010301也是显示A0101数据。
A010302数据正常。
A010303也是显示A0101数据。
A010401数据正常。
A010402也是显示A0101数据。
A010501数据正常。
完全搞不懂了,如果是代码问题,为什么隔一两个表又正常。
求助,session问题:
由于之前按照默认年份来爬取数据时,大部分数据都是正常的,因此问题应该出在选取年份的session上。
初步怀疑是后台没清理干净,一直存在爬取过的A0101表的数据。因此,选取年份操作时,对系统造成干扰,系统以为是基于A0101表的选取年份。
查了好多相关的帖子,但都是只爬取一个表(如A0101),不存在对下一表的的干扰问题,无法参考。
因此,发贴向各位大神求助。
附上爬取部分代码:
workbook=xlrd.open_workbook(r'D:\python\国家统计局列表清单V2.0.xlsx')
zb=workbook.sheet_by_name(u'sheet2')#打开"指标"表
rowsnum=zb.nrows#获取行数
colsnum=zb.ncols#获取行数
y=rowsnum
# 用来传递参数的
keyvalue = {}
# 用来自定义头部的
headers = {}
for x in range(3,y):#按列表循环爬数据
#print (x)
tablecode=zb.cell_value(x,10)
tablename=zb.cell_value(x,3)
result=zb.cell_value(x,14)#是否正常访问
if result=="false":
continue
keyvalue['m'] =zb.cell_value(x,4)#m
keyvalue['dbcode'] =zb.cell_value(x,5)#dbcode
keyvalue['rowcode'] =zb.cell_value(x,6)#rowcode
keyvalue['colcode'] =zb.cell_value(x,7)#colcode
keyvalue['wds'] = zb.cell_value(x,8)#wds
#keyvalue['h'] = 1#h
keyvalue['dfwds'] = zb.cell_value(x,13)#dfwds
keyvalue['k1'] = str(datetime.datetime.now())#keyvalue['k1'] = str(gettime()
#print (keyvalue)
# 目标网址(问号前面的东西)
url = 'http://data.stats.gov.cn/easyquery.htm?'
# 头部的填充
headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) ' \
'AppleWebKit/605.1.15 (KHTML, like Gecko) ' \
'Version/12.0 Safari/605.1.15'
# 发出请求,使用get方法,这里使用我们自定义的头部和参数
response = requests.get(url, headers=headers, params=keyvalue)
# 建立一个Session
s = requests.session()
# 在Session基础上进行一次请求
response = s.get(url, params=keyvalue, headers=headers)
# 打印返回过来的状态码
#print (response.status_code)
# 修改dfwds字段内容
#keyvalue['dfwds'] = zb.cell_value(x,15)#dfwds
#print (keyvalue)
keyvalue['dfwds'] = '[{"wdcode":"sj","valuecode":"LAST30"}]'
# 再次进行请求
response = s.get(url, params=keyvalue, headers=headers)
# 此时我们就能获取到我们搜索到的数据了
s.cookies.clear()
#s.close()#这个代码也试过,不行
if response=="Error":
print("爬取失败"+tablecode+tablename)
continue
AllData = json.loads(response.text) #获取总json数据
附上需爬取的列表,国家统计局列表清单V2.0.xlsx
(笨办法,自己上网一个个敲下来的)
第一次发帖子,不知道怎么加载程序文件,只好把全部代码粘贴进来。
import requests
import json
import time, datetime
import xlwt
import xlrd
from tkinter import *
from tkinter.messagebox import *
import threading
import os
import numpy as np
import pandas as pd
import math
# -*- coding: utf-8 -*-
# 导入模块
import pymysql
def doSth():
workbook=xlrd.open_workbook(r'D:\python\国家统计局列表清单V2.0.xlsx')
zb=workbook.sheet_by_name(u'sheet2')#打开"指标"表
rowsnum=zb.nrows#获取行数
colsnum=zb.ncols#获取行数
y=rowsnum
# 用来传递参数的
keyvalue = {
}
#