爬虫
主要介绍python3爬虫中requests库中的两种请求方式get与post,背刺主要介绍post请求如何配置参数。
- get请求
get请求比较简单,直接调用requests库中的get函数即可,即:
- post请求
在post请求中需要配置两种参数:请求头(不是必须的,get请求也可以添加,有些时候必须加),数据类型(不是返回的json数据结构,而是通过抓包得到的json数据)。
以湖南招标网的网址:
http://www.ccgphunan.gov.cn/page/notice/moreCityCounty.jsp?prcmMode=01为例。将该网址复制到浏览器,并打开,如下界面:
按F12进行抓包,是否存在返回json格式的数据接口,通过按下一页捕捉带有页面的接口,如下界面:
我们通过抓包发现,左下角第二网址
确定为post请求后,构建请求参数。
- Headers的构建
首先构建请求头header,如下图,点击右下角任务栏中的Headers,然后找到Requests Headers,将其下面的数据构建成字典,并命名为headers。
如上图,以Requests Headers下面的数据构建一个字典类型数据,如下:
如上图,有些参数是没有用的,可以删掉(通过请求测试);
- data的构建(请求中添加的json格式数据)
首先同样找到右下角任务栏中的Headers,点击,找到下面的Form Data,将Form Data中数据粘出来构建成json数据data(传入请求的必须为json格个式数据)。如下图Form Data:
(1)方式一:
将上图中的数据拷贝出来并构建json格式的数据如下:
其中为空的字段,以空字符为主,不能写成null,如上pType等;
(2)方法二 获取data
开始请求网页获取数据,如下:
点击后得到如下图所示的Data,类似于网址:
将上图中的form data拷贝出来作为字符串赋值给data,如下:
- 构建请求,并获取数据
得到如下的json数据:
[ {'RN': 37, 'NOTICE_NAME': '采购公告', 'NOTICE_CATEGORY_CODE': '02', 'PRCM_PLAN_ID': -1, 'PRCM_MODE_CODE': '01', 'PRCM_MODE_CODE1': '01', 'DEPT_ID': None, 'AREA_ID': 116, 'AREA_NAME': '会同县', 'NOTICE_ID': 1000619876, 'ORG_CODE': None, 'PRCM_MODE_NAME': '公开招标', 'NOTICE_TITLE': '会同县老旧小区改造项目标识标牌制作', 'NOTICE_TYPE_NAME': '公开招标公告', 'NEWWORK_DATE': '2020-05-15', 'NEWWORK_DATE_ALL': {'date': 15, 'day': 5, 'hours': 15, 'minutes': 26, 'month': 4, 'nanos': 0, 'seconds': 0, 'time': 1589527560000, 'timezoneOffset': -480, 'year': 120}, 'SRC_CODE': '2'},
{'RN': 38, 'NOTICE_NAME': '终止公告', 'NOTICE_CATEGORY_CODE': '05', 'PRCM_PLAN_ID': -1, 'PRCM_MODE_CODE': '01', 'PRCM_MODE_CODE1': None, 'DEPT_ID': None, 'AREA_ID': 34, 'AREA_NAME': '衡阳县', 'NOTICE_ID': 1000619864, 'ORG_CODE': None, 'PRCM_MODE_NAME': '公开招标', 'NOTICE_TITLE': '衡阳县人民医院布草洗涤租赁服务租赁服务租凭政府采购项目', 'NOTICE_TYPE_NAME': '终止公告', 'NEWWORK_DATE': '2020-05-15', 'NEWWORK_DATE_ALL': {'date': 15, 'day': 5, 'hours': 15, 'minutes': 25, 'month': 4, 'nanos': 0, 'seconds': 21, 'time': 1589527521000, 'timezoneOffset': -480, 'year': 120}, 'SRC_CODE': '2'},
。。。。
{'RN': 54, 'NOTICE_NAME': '更正公告', 'NOTICE_CATEGORY_CODE': '04', 'PRCM_PLAN_ID': -1, 'PRCM_MODE_CODE': '01', 'PRCM_MODE_CODE1': None, 'DEPT_ID': None, 'AREA_ID': 42, 'AREA_NAME': '双清区', 'NOTICE_ID': 1000618967, 'ORG_CODE': None, 'PRCM_MODE_NAME': '公开招标', 'NOTICE_TITLE': '邵阳市双清区教育系统技防建设项目', 'NOTICE_TYPE_NAME': '更正公告', 'NEWWORK_DATE': '2020-05-15', 'NEWWORK_DATE_ALL': {'date': 15, 'day': 5, 'hours': 11, 'minutes': 31, 'month': 4, 'nanos': 0, 'seconds': 20, 'time': 1589513480000, 'timezoneOffset': -480, 'year': 120}, 'SRC_CODE': '2'}
]
注:FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-form-urlencoded的话,则为formdata方式,如果是application/json或multipart/form-data的话,则为 request payload的方式。
- post请求转get请求
将post请求的接口与formData进行拼接; 如:
post接口:
http://www.ccgpyunnan.gov.cn/bulletin.do?method=moreListQuery
formData以字符串的形式拼接到网址后, 如:
current=2&rowCount=1000&searchPhrase=&query_sign=1
拼接后的get请求网址如下: