Python爬蟲實戰系列4:天眼查公司工商資訊採集

Python魔法师發表於2024-03-20

Python爬蟲實戰系列1:部落格園cnblogs熱門新聞採集
Python爬蟲實戰系列2:虎嗅網24小時熱門新聞採集
Python爬蟲實戰系列3:今日BBNews程式設計新聞採集
Python爬蟲實戰系列4:天眼查公司工商資訊採集

一、分析頁面

開啟天眼查網址 https://www.tianyancha.com/ ,隨便搜尋一個公司【比亞迪】

檢視位址列URL變化,由https://www.tianyancha.com變成https://www.tianyancha.com/search?key=比亞迪&sessionNo=1710895900.05751652

然後分析cookie情況,當不登陸,直接訪問首頁https://www.tianyancha.com時,網站會自動生成一堆cookie

接下來檢視公司詳情頁面,每個公司詳情頁都會有天眼查自己的公司id拼接出來的URL

例如:https://www.tianyancha.com/company/11807506

這個詳情頁面就是我們真正需要資料的頁面

1.1、分析請求

開始分析請求,F12開啟開發者模式,點選Network,然後重新整理頁面

由於公司詳情頁都是新標籤頁開啟的,所以請求地址也就是當前頁面地址https://www.tianyancha.com/company/11807506並且該請求Response的是HTML原始碼,我們只需要分析該HTML程式碼解析處理資料即可。

右鍵請求=》copy curl=》

curl程式碼如下

curl 'https://www.tianyancha.com/company/11807506' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8' \
  -H 'Accept-Language: zh-CN,zh;q=0.5' \
  -H 'Cache-Control: max-age=0' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: HWWAFSESID=887e67d267788860d6c; HWWAFSESTIME=1710896046122; csrfToken=lvLMtLSm9xmfByFFdDTlcT4s; TYCID=5d1c2130e65411ee9a9db554e7c53ded; CUID=5c33b832f027276cc2e6ab5cee5b1d8b; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218e5959f4c817-057ed755c136264-1d525637-855961-18e5959f4c913dd%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThlNTk1OWY0YzgxNy0wNTdlZDc1NWMxMzYyNjQtMWQ1MjU2MzctODU1OTYxLTE4ZTU5NTlmNGM5MTNkZCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218e5959f4c817-057ed755c136264-1d525637-855961-18e5959f4c913dd%22%7D; sajssdk_2015_cross_new_user=1; bannerFlag=true; searchSessionId=1710896089.33230042' \
  -H 'Referer: https://www.tianyancha.com/search?key=%E6%AF%94%E4%BA%9A%E8%BF%AA&sessionNo=1710896089.33230042' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-GPC: 1' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36' \
  -H 'sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Brave";v="122"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"'

然後逐個測試哪些是請求必要引數

大部分情況下,一個請求必要引數是如下這些

  1. User-Agent:標識傳送請求的客戶端
  2. Content-Type:內容型別
  3. cookie或者Authorization

所以可以刪除不必要引數進行測試,經過測試,其他不重要引數可以刪除,但是刪除cookie不可行,說明介面需要cookie資訊

但是這個cookie怎麼來的呢?

還記得上面說過,我們觀察得到當我們訪問首頁時會自動注入一些cookie嗎?

我們截止目前也沒有登入,所以直接對比首頁cookie和詳情頁cookie是否有區別即可。

分析結論:

  1. 詳情頁面請求需要cookie資訊,但是該cookie可以從首頁獲取到
  2. 詳情頁面有反爬策略,同ip多次訪問會提示需要登入,但是一個ip第一次請求時無需登入也可以請求到結果

二、程式碼實現

分析完請求後,我們開始程式碼實現,由於需要先從訪問一次首頁後拿到cookie才能再請求詳情頁

所以我們採用Python的requests的session功能,利用該session發起get和post請求,這樣每次session發起請求時都會攜帶cookie,那我們只需要在獲取session前先請求一次首頁即可。


def new_session():
    """
    獲取session
    :return:
    """
    session = requests.session()
    while True:
        try:
            session.get(url='https://www.tianyancha.com', headers=headers, timeout=(2, 2), proxies=proxies)
            return session
        except Exception as e:
            Print.print("異常,重試...", e)
            update_proxies()

注意這裡我演示使用了代理proxies,當出現異常無法訪問時需要更新一下代理update_proxies()

拿到session後就可以請求詳情頁面了

def get_co_detail(url):
    """
    公司詳情
    :param url:
    :return:
    """
    session = new_session()
    response = session.get(url=url, headers=headers, timeout=(2, 2), proxies=proxies)
    restext = response.content.decode('utf-8', errors='ignore')

    tree = etree.HTML(restext)
    title = str(tree.xpath('//title/text()'))
    # 公司名稱
    coName = tree.xpath("//h1[@class='index_company-name__LqKlo']/text()")

注意詳情頁面這裡是先獲取session,然後get請求時同樣增加代理

本次學習演示只獲取頁面中的公司名稱資訊,如需請求資訊可自行分析頁面原始碼然後xpath獲取

總結

  1. 分析請求時多注意cookie資訊,分析cookie是後端生成還是前端js生成
  2. 如遇需要攜帶cookie請求時,可以採用requests.session()建立一個session來請求

本文章程式碼只做學習交流使用,作者不負責任何由此引起的任何法律責任。

由於資訊保安問題,這裡不放原始碼。

各位看官,如對你有幫助歡迎點贊,收藏,轉發,關注公眾號【Python魔法師】獲取更多Python魔法~

qrcode.jpg

相關文章