1. 程式人生 > 實用技巧 >Python爬蟲:輸入公司名稱,爬取企查查網站中的公司資訊

Python爬蟲:輸入公司名稱,爬取企查查網站中的公司資訊

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理。

以下文章來源於Python爬蟲資料分析挖掘 ,作者:李運辰

根據輸入的公司名稱來爬取企查查網站中公司的詳細資訊

  • 1、獲取headers
  • 2、登入成功後,可根據輸入的公司名稱進行查詢操作,得到所需要的內容。
  • 3、將獲取到的文字進行文字特殊化處理,並將其彙總成一個dataframe,方便後面儲存為csv
  • 4、輸入公司名稱
  • 5、最後執行此程式碼,查詢companys列表中所有公司名稱的詳細資訊並儲存為csv。

1、獲取headers

1、進入企查查官網進行註冊並登入。
2、然後按F12彈出開發者工具,點選Network,然後你會看到企查查這個網址,點選一下


然後可以找到我們需要複製的header,這是非常關鍵的步驟,切記這個header是自己註冊之後登入成功所獲取的header,這樣方便後面儲存一次之後就可以在一定時間內無限訪問網址進行查詢的操作。

from bs4 import BeautifulSoup
import requests
import time


# 保持會話
# 新建一個session物件
sess = requests.session()


# 新增headers(header為自己登入的企查查網址,輸入賬號密碼登入之後所顯示的header,此程式碼的上方介紹了獲取方法)
afterLogin_headers = {'
User-Agent': '此程式碼上方介紹了獲取的方法'} # post請求(代表著登入行為,登入一次即可儲存,方便後面執行查詢指令) login = {'user':'自己註冊的賬號','password':'密碼'} sess.post('https://www.qcc.com',data=login,headers=afterLogin_headers)

整段程式碼的含義為:偽裝成使用者進行登入行為(返回200狀態碼代表著登入成功)。

2、登入成功後,可根據輸入的公司名稱進行查詢操作,得到所需要的內容。

def get_company_message(company):
    # 獲取查詢到的網頁內容(全部)
search = sess.get('https://www.qcc.com/search?key={}'.format(company),headers=afterLogin_headers,timeout=10) search.raise_for_status() search.encoding = 'utf-8' #linux utf-8 soup = BeautifulSoup(search.text,features="html.parser") href = soup.find_all('a',{'class': 'title'})[0].get('href') time.sleep(4) # 獲取查詢到的網頁內容(全部) details = sess.get(href,headers=afterLogin_headers,timeout=10) details.raise_for_status() details.encoding = 'utf-8' #linux utf-8 details_soup = BeautifulSoup(details.text,features="html.parser") message = details_soup.text time.sleep(2) return message

上面的程式碼代表著執行了兩個步驟。

  • ①查詢某公司
  • ②點選進入第一位搜尋結果的新網站,並返回該網址的文字內容。

3、將獲取到的文字進行文字特殊化處理,並將其彙總成一個dataframe,方便後面儲存為csv

import pandas as pd


def message_to_df(message,company):
    list_companys = []
    Registration_status = []
    Date_of_Establishment = []
    registered_capital = []
    contributed_capital = []
    Approved_date = []
    Unified_social_credit_code = []
    Organization_Code = []
    companyNo = []
    Taxpayer_Identification_Number = []
    sub_Industry = []
    enterprise_type = []
    Business_Term = []
    Registration_Authority = []
    staff_size = []
    Number_of_participants = []
    sub_area = []
    company_adress = []
    Business_Scope = []


    list_companys.append(company)
    Registration_status.append(message.split('登記狀態')[1].split('\n')[1].split('成立日期')[0].replace(' ',''))
    Date_of_Establishment.append(message.split('成立日期')[1].split('\n')[1].replace(' ',''))
    registered_capital.append(message.split('註冊資本')[1].split('人民幣')[0].replace(' ',''))
    contributed_capital.append(message.split('實繳資本')[1].split('人民幣')[0].replace(' ',''))
    Approved_date.append(message.split('核准日期')[1].split('\n')[1].replace(' ',''))
    try:
        credit = message.split('統一社會信用程式碼')[1].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    except:
        credit = message.split('統一社會信用程式碼')[3].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    Organization_Code.append(message.split('組織機構程式碼')[1].split('\n')[1].replace(' ',''))
    companyNo.append(message.split('工商註冊號')[1].split('\n')[1].replace(' ',''))
    Taxpayer_Identification_Number.append(message.split('納稅人識別號')[1].split('\n')[1].replace(' ',''))
    try:
        sub = message.split('所屬行業')[1].split('\n')[1].replace(' ','')
        sub_Industry.append(sub)
    except:
        sub = message.split('所屬行業')[1].split('')[1].split('')[0]
        sub_Industry.append(sub)
    enterprise_type.append(message.split('企業型別')[1].split('\n')[1].replace(' ',''))
    Business_Term.append(message.split('營業期限')[1].split('登記機關')[0].split('\n')[-1].replace(' ',''))
    Registration_Authority.append(message.split('登記機關')[1].split('\n')[1].replace(' ',''))
    staff_size.append(message.split('人員規模')[1].split('')[0].split('\n')[-1].replace(' ',''))
    Number_of_participants.append(message.split('參保人數')[1].split('所屬地區')[0].replace(' ','').split('\n')[2])
    sub_area.append(message.split('所屬地區')[1].split('\n')[1].replace(' ',''))
    try:
        adress = message.split('經營範圍')[0].split('企業地址')[1].split('檢視地圖')[0].split('\n')[2].replace(' ','')
        company_adress.append(adress)
    except:
        adress = message.split('經營範圍')[1].split('企業地址')[1].split()[0]
        company_adress.append(adress)
    Business_Scope.append(message.split('經營範圍')[1].split('\n')[1].replace(' ',''))
    df = pd.DataFrame({'公司':company,\
                      '登記狀態':Registration_status,\
                      '成立日期':Date_of_Establishment,\
                      '註冊資本':registered_capital,\
                      '實繳資本':contributed_capital,\
                      '核准日期':Approved_date,\
                      '統一社會信用程式碼':Unified_social_credit_code,\
                      '組織機構程式碼':Organization_Code,\
                      '工商註冊號':companyNo,\
                      '納稅人識別號':Taxpayer_Identification_Number,\
                      '所屬行業':sub_Industry,\
                      '企業型別':enterprise_type,\
                      '營業期限':Business_Term,\
                      '登記機關':Registration_Authority,\
                      '人員規模':staff_size,\
                      '參保人數':Number_of_participants,\
                      '所屬地區':sub_area,\
                      '企業地址':company_adress,\
                      '經營範圍':Business_Scope})
    
    return df

這段程式碼是對獲取到的文字內容進行文字識別處理,只能處理大部分的內容,可能會有極個別的是空值,大家有興趣可以自己重寫。

4、輸入公司名稱

這裡只是寫個案例,所以隨便寫了個列表,一般跑自己程式碼的是讀取自己的csv檔案關於公司名稱的那一列,然後轉為列表)

# 測試所用
companys = ['深圳市騰訊計算機系統有限公司','阿里巴巴(中國)有限公司']


# 實際所用
# df_companys = pd.read_csv('自己目錄的絕對路徑/某某.csv')
# companys = df_companys['公司名稱'].tolist()

5、最後執行此程式碼,查詢companys列表中所有公司名稱的詳細資訊並儲存為csv。

for company in companys:
    try:
        messages = get_company_message(company)
    except:
        pass
    else:
        df = message_to_df(messages,company)
        if(company==companys[0]):
            df.to_csv('自己目錄的絕對路徑/某某.csv',index=False,header=True)
        else:
            df.to_csv('自己目錄的絕對路徑/某某.csv',mode='a+',index=False,header=False)
    time.sleep(1)

至此,就可以得到這兩家公司的一些詳細資訊。

ps:如果大家在 soup.find_all(‘a’,{‘class’: ‘title’})[0].get(‘href’)這裡遇到點錯誤,可能是天眼查那邊更新了網頁程式碼,大家可以根據這個操作來更新程式碼。

①按F12進入開發者除錯頁面


②就點選“深圳市騰訊計算機系統有限公司”這個點選操作而言,右擊,然後選擇“檢查”選項,然後就可以看到開發者除錯頁面那裡也自動跳轉到了相關的位置。


③我們可以看到,這是一個a標籤,class為title的html程式碼,所以,如果報錯,可根據這個操作更換。比如,class改為了company_title,那程式碼也可對應的改為:soup.find_all(‘a’,{‘class’: ‘company_title’})[0].get(‘href’)


最後,大家需要注意的是,爬取的時候需要適當的設定一下睡眠時間,不然會被檢測到是爬蟲機器人在操作,可能會彈出彈窗讓你驗證,這樣會導致迴圈被中斷。第二個就是某個時間段爬取量儘量不要太大,不然也是會被檢測到的。

此處貼上完整程式碼,大家可參考著學習BeautifuSoup的妙用哦。

from bs4 import BeautifulSoup
import requests
import time
# 保持會話
# 新建一個session物件
sess = requests.session()


# 新增headers(header為自己登入的企查查網址,輸入賬號密碼登入之後所顯示的header,此程式碼的上方介紹了獲取方法)
afterLogin_headers = {'User-Agent': '此程式碼上方介紹了獲取的方法'}


# post請求(代表著登入行為,登入一次即可儲存,方便後面執行查詢指令)
login = {'user':'自己註冊的賬號','password':'密碼'}
sess.post('https://www.qcc.com',data=login,headers=afterLogin_headers)


def get_company_message(company):
    # 獲取查詢到的網頁內容(全部)
    search = sess.get('https://www.qcc.com/search?key={}'.format(company),headers=afterLogin_headers,timeout=10)
    search.raise_for_status()
    search.encoding = 'utf-8' #linux utf-8
    soup = BeautifulSoup(search.text,features="html.parser")
    href = soup.find_all('a',{'class': 'title'})[0].get('href')
    time.sleep(4)
    # 獲取查詢到的網頁內容(全部)
    details = sess.get(href,headers=afterLogin_headers,timeout=10)
    details.raise_for_status()
    details.encoding = 'utf-8' #linux utf-8
    details_soup = BeautifulSoup(details.text,features="html.parser")
    message = details_soup.text
    time.sleep(2)
    return message


import pandas as pd


def message_to_df(message,company):
    list_companys = []
    Registration_status = []
    Date_of_Establishment = []
    registered_capital = []
    contributed_capital = []
    Approved_date = []
    Unified_social_credit_code = []
    Organization_Code = []
    companyNo = []
    Taxpayer_Identification_Number = []
    sub_Industry = []
    enterprise_type = []
    Business_Term = []
    Registration_Authority = []
    staff_size = []
    Number_of_participants = []
    sub_area = []
    company_adress = []
    Business_Scope = []


    list_companys.append(company)
    Registration_status.append(message.split('登記狀態')[1].split('\n')[1].split('成立日期')[0].replace(' ',''))
    Date_of_Establishment.append(message.split('成立日期')[1].split('\n')[1].replace(' ',''))
    registered_capital.append(message.split('註冊資本')[1].split('人民幣')[0].replace(' ',''))
    contributed_capital.append(message.split('實繳資本')[1].split('人民幣')[0].replace(' ',''))
    Approved_date.append(message.split('核准日期')[1].split('\n')[1].replace(' ',''))
    try:
        credit = message.split('統一社會信用程式碼')[1].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    except:
        credit = message.split('統一社會信用程式碼')[3].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    Organization_Code.append(message.split('組織機構程式碼')[1].split('\n')[1].replace(' ',''))
    companyNo.append(message.split('工商註冊號')[1].split('\n')[1].replace(' ',''))
    Taxpayer_Identification_Number.append(message.split('納稅人識別號')[1].split('\n')[1].replace(' ',''))
    try:
        sub = message.split('所屬行業')[1].split('\n')[1].replace(' ','')
        sub_Industry.append(sub)
    except:
        sub = message.split('所屬行業')[1].split('')[1].split('')[0]
        sub_Industry.append(sub)
    enterprise_type.append(message.split('企業型別')[1].split('\n')[1].replace(' ',''))
    Business_Term.append(message.split('營業期限')[1].split('登記機關')[0].split('\n')[-1].replace(' ',''))
    Registration_Authority.append(message.split('登記機關')[1].split('\n')[1].replace(' ',''))
    staff_size.append(message.split('人員規模')[1].split('')[0].split('\n')[-1].replace(' ',''))
    Number_of_participants.append(message.split('參保人數')[1].split('所屬地區')[0].replace(' ','').split('\n')[2])
    sub_area.append(message.split('所屬地區')[1].split('\n')[1].replace(' ',''))
    try:
        adress = message.split('經營範圍')[0].split('企業地址')[1].split('檢視地圖')[0].split('\n')[2].replace(' ','')
        company_adress.append(adress)
    except:
        adress = message.split('經營範圍')[1].split('企業地址')[1].split()[0]
        company_adress.append(adress)
    Business_Scope.append(message.split('經營範圍')[1].split('\n')[1].replace(' ',''))
    df = pd.DataFrame({'公司':company,\
                      '登記狀態':Registration_status,\
                      '成立日期':Date_of_Establishment,\
                      '註冊資本':registered_capital,\
                      '實繳資本':contributed_capital,\
                      '核准日期':Approved_date,\
                      '統一社會信用程式碼':Unified_social_credit_code,\
                      '組織機構程式碼':Organization_Code,\
                      '工商註冊號':companyNo,\
                      '納稅人識別號':Taxpayer_Identification_Number,\
                      '所屬行業':sub_Industry,\
                      '企業型別':enterprise_type,\
                      '營業期限':Business_Term,\
                      '登記機關':Registration_Authority,\
                      '人員規模':staff_size,\
                      '參保人數':Number_of_participants,\
                      '所屬地區':sub_area,\
                      '企業地址':company_adress,\
                      '經營範圍':Business_Scope})
    
    return df


# 測試所用
companys = ['深圳市騰訊計算機系統有限公司','阿里巴巴(中國)有限公司']


# 實際所用
# df_companys = pd.read_csv('自己目錄的絕對路徑/某某.csv')
# companys = df_companys['公司名稱'].tolist()


for company in companys:
    try:
        messages = get_company_message(company)
    except:
        pass
    else:
        df = message_to_df(messages,company)
        if(company==companys[0]):
            df.to_csv('自己目錄的絕對路徑/某某.csv',index=False,header=True)
        else:
            df.to_csv('自己目錄的絕對路徑/某某.csv',mode='a+',index=False,header=False)
    time.sleep(1)

文章源

https://blog.csdn.net/qq_40694671/article/details/110671900