戰(zhàn):天眼查數(shù)據(jù)采集入門)
1. 項(xiàng)目概述AI輔助下的Python爬蟲入門實(shí)戰(zhàn)去年幫一位做企業(yè)征信分析的朋友處理數(shù)據(jù)時(shí)我意識(shí)到天眼查這類商業(yè)信息平臺(tái)的數(shù)據(jù)采集需求遠(yuǎn)比想象中普遍。但傳統(tǒng)爬蟲開發(fā)需要面對(duì)反爬機(jī)制、頁(yè)面解析等復(fù)雜問(wèn)題對(duì)新手極不友好。最近測(cè)試了幾款A(yù)I編程助手后發(fā)現(xiàn)它們能顯著降低學(xué)習(xí)門檻——即使零基礎(chǔ)用戶配合正確的工具鏈也能在2小時(shí)內(nèi)完成首個(gè)可用的企業(yè)信息采集腳本。這個(gè)項(xiàng)目將展示如何用AI輔助工具快速構(gòu)建天眼查爬蟲。不同于傳統(tǒng)教程我們會(huì)重點(diǎn)利用AI實(shí)時(shí)生成代碼、解釋邏輯、調(diào)試錯(cuò)誤的能力讓編程基礎(chǔ)薄弱的用戶也能理解每個(gè)環(huán)節(jié)。最終實(shí)現(xiàn)的腳本可以自動(dòng)獲取公司基本信息、股東構(gòu)成、法律訴訟等關(guān)鍵數(shù)據(jù)并以結(jié)構(gòu)化格式存儲(chǔ)。關(guān)鍵提示所有操作均在法律允許范圍內(nèi)進(jìn)行嚴(yán)格遵守天眼查robots.txt規(guī)定單次采集間隔設(shè)置為5秒以上僅用于個(gè)人學(xué)習(xí)目的2. 環(huán)境配置與工具選型2.1 Python環(huán)境快速搭建對(duì)于Windows用戶推薦使用Microsoft Store直接安裝Python 3.11打開Microsoft Store搜索Python 3.11點(diǎn)擊獲取默認(rèn)會(huì)勾選將Python添加到PATH安裝完成后在CMD輸入python --version驗(yàn)證Mac用戶建議通過(guò)Homebrew安裝brew install python3.11 echo export PATH/opt/homebrew/opt/python3.11/bin:$PATH ~/.zshrc2.2 開發(fā)工具配置VSCode作為首選IDE需要安裝以下擴(kuò)展Python官方擴(kuò)展代碼補(bǔ)全和調(diào)試Jupyter交互式執(zhí)行代碼片段GitHub CopilotAI輔助編程核心工具實(shí)測(cè)配置要點(diǎn)在設(shè)置中開啟Auto Complete和Inline Suggest調(diào)整Copilot的響應(yīng)速度為Balanced設(shè)置→Extensions→Copilot安裝后按CtrlShiftP輸入Copilot: Login完成身份驗(yàn)證2.3 必備Python庫(kù)安裝創(chuàng)建項(xiàng)目目錄后執(zhí)行pip install requests beautifulsoup4 pandas fake-useragent各庫(kù)作用說(shuō)明requests網(wǎng)絡(luò)請(qǐng)求核心庫(kù)比urllib更友好beautifulsoup4HTML解析神器pandas數(shù)據(jù)清洗與導(dǎo)出fake-useragent生成隨機(jī)請(qǐng)求頭規(guī)避基礎(chǔ)反爬3. 天眼查頁(yè)面結(jié)構(gòu)分析3.1 目標(biāo)數(shù)據(jù)定位以小米科技有限責(zé)任公司為例公司ID92040300710932208K我們需要采集工商基本信息注冊(cè)資本、成立日期等主要人員法人、股東等分支機(jī)構(gòu)風(fēng)險(xiǎn)信息法律訴訟、行政處罰等通過(guò)瀏覽器開發(fā)者工具F12分析發(fā)現(xiàn)關(guān)鍵數(shù)據(jù)通過(guò)異步接口加載XHR請(qǐng)求數(shù)據(jù)接口需要攜帶Cookie和Token認(rèn)證分頁(yè)數(shù)據(jù)采用動(dòng)態(tài)參數(shù)加密3.2 反爬機(jī)制破解方案天眼查采用的多層防護(hù)包括請(qǐng)求頭驗(yàn)證User-Agent、Referer行為檢測(cè)鼠標(biāo)軌跡、請(qǐng)求頻率參數(shù)簽名_token等動(dòng)態(tài)值應(yīng)對(duì)策略headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://www.tianyancha.com/, Cookie: 你的登錄Cookie # 通過(guò)手動(dòng)登錄后獲取 }重要提醒切勿使用多線程/異步請(qǐng)求單次采集間隔建議5-10秒每日采集量控制在100條以內(nèi)4. AI輔助開發(fā)實(shí)戰(zhàn)流程4.1 用自然語(yǔ)言描述需求在VSCode中新建.py文件直接輸入注釋# 我需要一個(gè)天眼查公司詳情采集腳本要求 # 1. 輸入公司ID獲取基本信息 # 2. 處理JSON格式的響應(yīng)數(shù)據(jù) # 3. 將結(jié)果保存到Excel # 4. 自動(dòng)處理網(wǎng)絡(luò)異常和反爬Copilot會(huì)自動(dòng)生成基礎(chǔ)代碼框架我們?cè)诖嘶A(chǔ)上修改import requests import pandas as pd from fake_useragent import UserAgent def get_company_info(company_id): ua UserAgent() headers { User-Agent: ua.random, Referer: fhttps://www.tianyancha.com/company/{company_id} } url fhttps://www.tianyancha.com/api/v4/company/baseinfo?id{company_id} try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() return response.json()[data] except Exception as e: print(fError fetching data: {e}) return None4.2 數(shù)據(jù)解析與清洗讓AI幫助處理嵌套的JSON結(jié)構(gòu)# 請(qǐng)幫我解析天眼查返回的JSON數(shù)據(jù)提取以下字段 # 公司名稱、注冊(cè)資本、成立日期、統(tǒng)一社會(huì)信用代碼 # 并轉(zhuǎn)換為Pandas DataFrame格式 def parse_company_data(json_data): if not json_data: return pd.DataFrame() base_info json_data.get(baseInfo, {}) result { 公司名稱: base_info.get(name), 注冊(cè)資本: f{base_info.get(regCapital)} {base_info.get(regCapitalCurrency, 人民幣)}, 成立日期: base_info.get(estiblishTime), 信用代碼: base_info.get(creditCode) } return pd.DataFrame([result])4.3 異常處理增強(qiáng)通過(guò)對(duì)話式交互讓AI補(bǔ)充健壯性代碼# 請(qǐng)為爬蟲添加以下異常處理 # 1. 代理失敗自動(dòng)重試 # 2. 驗(yàn)證碼觸發(fā)時(shí)暫停操作 # 3. 數(shù)據(jù)格式錯(cuò)誤時(shí)記錄日志 RETRY_MAX 3 PROXIES {http: http://你的代理IP:端口} def safe_request(url, headers, retry0): if retry RETRY_MAX: raise Exception(Max retries exceeded) try: response requests.get(url, headersheaders, proxiesPROXIES, timeout15) if 驗(yàn)證碼 in response.text: input(請(qǐng)手動(dòng)處理驗(yàn)證碼后按回車?yán)^續(xù)...) return safe_request(url, headers, retry1) return response except requests.exceptions.RequestException as e: print(fRequest failed (attempt {retry1}): {e}) time.sleep(5 * (retry 1)) return safe_request(url, headers, retry1)5. 完整腳本組裝與優(yōu)化5.1 主流程實(shí)現(xiàn)整合各功能模塊import time from tqdm import tqdm # 進(jìn)度條顯示 def main(): company_ids [92040300710932208K] # 示例公司ID all_data [] for cid in tqdm(company_ids): raw_data get_company_info(cid) df parse_company_data(raw_data) if not df.empty: all_data.append(df) time.sleep(8) # 遵守爬蟲禮儀 final_df pd.concat(all_data, ignore_indexTrue) final_df.to_excel(tianyancha_data.xlsx, indexFalse) print(f成功保存{len(all_data)}條數(shù)據(jù))5.2 參數(shù)調(diào)優(yōu)建議通過(guò)AI分析得到的性能優(yōu)化點(diǎn)請(qǐng)求超時(shí)設(shè)置為10-15秒兼顧成功率和效率隨機(jī)延遲區(qū)間設(shè)為5-10秒避免固定間隔被識(shí)別使用會(huì)話對(duì)象(Session)保持連接降低TCP握手開銷優(yōu)化后的請(qǐng)求代碼session requests.Session() adapter requests.adapters.HTTPAdapter( pool_connections10, pool_maxsize10, max_retries3 ) session.mount(http://, adapter) session.mount(https://, adapter) def optimized_request(url): delay random.uniform(5, 10) time.sleep(delay) return session.get(url, headersgenerate_headers())6. 常見(jiàn)問(wèn)題與解決方案6.1 驗(yàn)證碼觸發(fā)應(yīng)對(duì)當(dāng)出現(xiàn)verify.tianyancha.com重定向時(shí)立即暫停程序運(yùn)行手動(dòng)在瀏覽器完成驗(yàn)證碼驗(yàn)證更新Cookie后再繼續(xù)運(yùn)行考慮使用付費(fèi)代理IP建議選擇高匿住宅代理6.2 數(shù)據(jù)缺失處理典型場(chǎng)景及解決方法| 問(wèn)題現(xiàn)象 | 可能原因 | 解決方案 | |-------------------------|--------------------------|----------------------------| | 注冊(cè)資本顯示為null | 數(shù)據(jù)接口版本變更 | 檢查API路徑是否為v4最新版 | | 股東信息列表為空 | 需要調(diào)用單獨(dú)接口 | 查找/api/v4/holder類接口 | | 返回?cái)?shù)據(jù)包含HTML代碼 | 觸發(fā)反爬被重定向 | 更換UserAgent和IP |6.3 效率提升技巧使用concurrent.futures實(shí)現(xiàn)受限并發(fā)建議線程數(shù)≤3優(yōu)先采集必要字段避免全量數(shù)據(jù)請(qǐng)求對(duì)穩(wěn)定接口使用本地緩存示例代碼from diskcache import Cache cache Cache(tianyancha_cache) cache.memoize(expire86400) def cached_request(url): return requests.get(url).json()7. 法律合規(guī)與數(shù)據(jù)使用7.1 robots.txt檢查天眼查當(dāng)前robots.txt關(guān)鍵限制Disallow: /search/ Disallow: /company/ Disallow: /vip/解讀說(shuō)明禁止爬取搜索功能相關(guān)頁(yè)面公司詳情頁(yè)原則上不允許爬取實(shí)際可通過(guò)API接口獲取數(shù)據(jù)但需控制頻率7.2 數(shù)據(jù)使用建議合法使用邊界禁止商業(yè)性批量采集需購(gòu)買官方API允許少量數(shù)據(jù)用于學(xué)術(shù)研究個(gè)人學(xué)習(xí)用途需刪除敏感字段如聯(lián)系方式數(shù)據(jù)脫敏示例def anonymize_data(df): sensitive_cols [phone, email, idNumber] for col in sensitive_cols: if col in df.columns: df[col] REDACTED return df這個(gè)項(xiàng)目的核心價(jià)值在于展示AI如何降低編程學(xué)習(xí)曲線——當(dāng)遇到不懂的代碼時(shí)你可以直接選中代碼按CtrlI召喚Copilot解釋當(dāng)需要新功能時(shí)用自然語(yǔ)言描述就能生成可用代碼框架。這種即時(shí)反饋的學(xué)習(xí)方式讓零基礎(chǔ)用戶能在解決實(shí)際問(wèn)題的過(guò)程中掌握Python核心概念。