目标网站及需求
网站:安徽省公共资源交易监管网
需求:爬取安徽省各地市近N年每月交易统计数据。
数据接口解析
数据接口
点击查询按钮,观察Network返回资源,点开预览,发现想要的数据
从headers中可以确定url为:
http://ggzy.ah.gov.cn/jyxx/tongji/allProjectCountAndAmountProportion
选择参数传递
在查询时一些条件供我们选择,其中包括时间区间及查询范围即层级(市县),观察Payload发现表单数据中有选择参数的传递,包括起始时间、结束时间级层级。
爬取代码
导入工具库
import requests
import json
import pandas as pd
import calendar
import itertools
爬取代码
#url
url_sxdata = 'http://ggzy.ah.gov.cn/jyxx/tongji/allProjectCountAndAmountProportion'
#请求头,此处复制原网页的headers,可自己另行设置。
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '80',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'td_cookie=4264047000; X-LB=1.1.1a.f7579fcd; Hm_lvt_e2329777c4106c325d471eec6259333f=1649916212,1650267626; Hm_lpvt_e2329777c4106c325d471eec6259333f=1650275552; JSESSIONID=B2AC162AE978906897B536108764C0BB',
'Host': 'ggzy.ah.gov.cn',
'Origin': 'http://ggzy.ah.gov.cn',
'Referer': 'http://ggzy.ah.gov.cn/jyxx/tongji/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
#主体代码
#设置年份及月份范围
years = [2022]
months = [1,2,3]
#设置容器,此处因爬取后需分析处理,用的pandas工具。可自行设置文件读取
#sx_data = pd.DataFrame(columns=['count', 'amount', 'regionCode', 'regionName','month','year'])
sx_data = pd.DataFrame()
for ym in itertools.product(years,months):
#取出每月最后一天
lastDay = calendar.monthrange(ym[0],ym[1])[1]
#拼接起止时间
month_ = '0'+str(ym[1]) if ym[1]<10 else str(ym[1])
startTime = str(ym[0])+'-'+month_+'-'+'01'
endTime = str(ym[0])+'-'+month_+'-'+str(lastDay)
#print(startTime,endTime)
#设置参数,其他参数可自行观察,不一一详述
params = {'startTime':startTime,'endTime':endTime,'level':2,'projectType':'','projectWay':'','source':2}
#请求数据并解析json
sxdata = pd.DataFrame(json.loads(requests.post(url_sxdata,headers=headers,data=params).text))
sxdata['month'] = ym[1]
sxdata['year'] = ym[0]
sx_data = pd.concat([sx_data,sxdata])
#请求各项目类型交易数及成交额代码
snumdata = pd.DataFrame(json.loads(requests.post(url_snumdata,headers=headers,data=params).text)['shuju'])
snumdata['month'] = ym[1]
snumdata['year'] = ym[0]
smoneydata = pd.DataFrame(json.loads(requests.post(url_smoneydata,headers=headers,data=params).text)['shuju'])
mergedata = pd.merge(snumdata,smoneydata,how='left',on='name')
snum_data = pd.concat([snum_data,mergedata])