企業認證數據采集爬蟲記錄
一、項目介紹:
1、爬取網站:認證認可業務信息統一查詢平臺
2、項目要求:企業認證數據采集需求說明書
3、項目部分完成代碼: github
二、項目思路:
1、爬蟲基本思路:
獲取爬蟲思路的方法順序:
直接在渲染的網頁源代碼中爬取
ajax異步請求方式獲取數據
js解密顯示
2、爬蟲基本方法:
-
Referer
、headers
參數:Referer
代表你正在從哪個瀏覽器瀏覽網頁
,headers
代表頭文件,可偽裝成瀏覽器訪問網頁:

處理網頁圖片驗證碼的方法:下載驗證碼的圖片,手動輸入驗證碼,并提交驗證碼至data數據
實例化對象儲存
session
和cookies
:讓網站始終認為是你在瀏覽網頁:
c = http.cookiejar.LWPCookieJar()
cookies = urllib.request.HTTPCookieProcessor(c)
創建不是一般的opener來實現對Cookie的設置:
opener = urllib.request.build_opener(cookies)
urllib.request.install_opener(opener)
三、項目詳細操作:
1、涉及到Python3.5的非標準庫:
urllib.request
、urllib.parse
、lxml
、http.cookiesjar
、json
2、爬取組織列表的信息:
- 首先進行抓包分析:打開
chrome
的network
模式,輸入組織名稱、驗證碼進行查詢,網頁顯示查詢到的組織列表:
- 查看
Network
上的顯示以下的加載文件:
- 打開
queryOrg.do?progld=10
文件,查看提交data
數據:
以及文件的提交方式和請求地址:
- 構造一個函數通過
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)