企业认证数据采集爬虫记录
一、项目介绍:
1、爬取网站:认证认可业务信息统一查询平台
2、项目要求:企业认证数据采集需求说明书
3、项目部分完成代码: github
二、项目思路:
1、爬虫基本思路:
获取爬虫思路的方法顺序:
直接在渲染的网页源代码中爬取
ajax异步请求方式获取数据
js解密显示
2、爬虫基本方法:
-
Referer
、headers
参数:Referer
代表你正在从哪个浏览器浏览网页
,headers
代表头文件,可伪装成浏览器访问网页:
- 查看
Network
上的显示以下的加载文件:
- 打开
queryOrg.do?progld=10
文件,查看提交data
数据:
以及文件的提交方式和请求地址:
post.png- 构造一个函数通过
ajax
异步请求来获取组织列表的信息:
def get_orgaList_info():
#下载验证码进行手动输入:
with open('code.png','wb') as f:
f.write(opener.open('http://cx.cnca.cn/rjwcx/checkCode/rand.do?d=1507441665016').read())
#手动输入验证码:
code = input("请输入验证码:")
#构造提交的表单数据:
data = {
'certNumber':'',
'orgName':'漳州灿坤实业有限公司',
'queryType': 'public',
#输入的验证码信息
'checkCode': code
}
#提交表单数据和头文件:
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request('http://cx.cnca.cn/rjwcx/web/cert/queryOrg.do?progId=10')
#添加头文件
req.headers = headers
#得到的数据为bytes(字节)类型:
org_list = opener.open(req,data=data).read()
注意:这里得到的org_list
是Ascii
编码,对该数据进行解码成字符串后,通过json
模块的loads()
的方法将对json
数据进行解码,转换成可操作的字典格式:
org_list_json = json.loads(org_list.decode('ascii'))
将提取到以下信息,每一条这样的字典格式的信息代表每一个的组织的信息:
{'data': [
{'randomCheckCode': '3',
'checkC': '1247458294',
'orgCode': '000000000',
'orgDistrictName': '',
'orgName': '漳州灿坤实业有限公司'}]
}
3、对返回的org_list_json
循环,获取证书列表的信息:
- 点击任意组织名称,网页显示该组织的所有证书的列表:
此时,Network
上会再加载list.do?progld=10
文件:
分析提交的表单的数据:orgName
、orgCode
、checkC
每个组织都是不相同的,所以要从get_orgaList_info()
返回的参数中继承,以及继承之前输入的验证码randomCheckCode
- 创建一个获取证书列表的信息,通过传入之前获得的
json
数据里的参数,以及获取的验证码:
def get_certList_info(orgName,orgCode,checkC,code):
req = urllib.request.Request('http://cx.cnca.cn/rjwcx/web/cert/list.do?progId=10')
req.headers = headers
#构造提交的data数据
data = {
'orgName': orgName,
'orgCode': orgCode,
'method': 'queryCertByOrg',
'needCheck': 'false',
'checkC': checkC,
'randomCheckCode': code,
'queryType': 'public',
'page': '1',
'rows': '10',
'checkCode':''
}
#转换成查询字符串(bytes):
data = urllib.parse.urlencode(data).encode('utf-8')
#获得提交data数据后的json信息
cert_list_bytes = opener.open(req,data=data).read()
cert_list_json = json.loads(cert_list_bytes.decode('ascii'))
return cert_list_json['rows']
- 将爬取到一下的信息:每一个信息代表每一个证书的信息:
{'authProjCodeName':
'电子信息产品污染控制自愿性认证',
'certiStatusName': '有效',
'rzjgId': 'CNCA-RF-2002-07',
'certiEDate': '2021-08-31',
'showtemp': '4',
'rzjgIdName': '上海天祥质量技术服务有限公司',
'zersda': '20160929',
'certNumber': 'R2_130800590SHA-001',
'certiStatus': '01',
'row': 1,
'orgName': '漳州灿坤实业有限公司',
'checkC': -536800051,
'authProjCode': 'B0331'
}
4、对返回的cert_list_json
循环,获取每一个证书的内容:
- 点击一个证书网页,打开
Network
,刷新后查看加载的文件,找到showZyx...
文件:
- 网页采取GET请求方式,请求的参数显示在网页的
URL
上:
分析网页的URL
:http://cx.cnca.cn/rjwcx/web/cert/showZyxGy.do?rzjgId={}&certNo={}&checkC={}
请求的三个参数都位于每一个cert_list_json
中,不同的参数对应不同的url
,也对应不同的证书页面的内容
- 创建一个传入从
get_certList_info
返回的rajgid
、certNo
、checkC
的参数,获得证书页面的内容:
def get_cert_info(rajgid,certNo,checkC):
#构造和传入参数结合的url
url = 'http://cx.cnca.cn/rjwcx/web/cert/showZyxGy.do?''rzjgId={}&certNo={}&checkC={}'.format(rajgid,certNo,checkC)
req = urllib.request.Request(url)
req.headers = headers
html = opener.open(req).read().decode('utf-8')
print(html)
网友评论