求助:python爬取国家统计局多个列表数据时出错

求助:python爬取国家统计局多个列表数据时出错

本人python小白,最近迷上国家统计局,想将统计局上的数据爬取下下,放到mysql。
第一步,爬取年度数据(默认为2010-2019年)
首先,上网查了类似的帖子,照葫芦画瓢,东拼西凑,磕磕碰碰,最终把代码整合在一起。初步成功,能把国家统计局上的年度数据,大部分拷贝下来。如下图
共爬取1542张表,但不全
表中数据默认为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 = {
   }
    # 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值