python3 使用selenium模擬登陸天眼查抓取數據


  由於之前用Scrapy 抓了一些公司的名稱,但是沒有准確的聯系方式,所以就自己就學習了一下使用selenium自動化工具,速度比較慢,網上也有很多這方面的代碼,但是大部分的網頁解析部分都出錯了,可能是這種網站定時會更改一下網頁的固定幾個標簽。

  網上也有很多說如果遇到一些防爬蟲特別強的網站,比如企查查...使用了滑動驗證和圖像驗證碼選擇,實在是逆天,對於剛接觸爬蟲還是不要去選擇攻破,可以考慮通過selenium打開窗口,用time模塊延時,然后手動登錄,然后獲取當前登錄的cookie,之后再通過其他模塊或者框架,利用cookie免登錄進去爬取。這個思路倒是很不錯,過段時間去學習一下。

  這個小項目還是有很多缺點的,比如訪問時間太快,訪問的時間統一。如果連續點擊大概40多個公司后就會檢測到,懷疑是機器人,然后就要進行圖像驗證。不過應該可以用random個隨機時間用time模塊,這樣子來模擬更真實的人操作。

 

# -*- coding: UTF-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By  #引用網頁選擇器
from selenium.webdriver.support.ui import WebDriverWait  #引用設定顯示等待時間
from selenium.webdriver.support import expected_conditions as EC  #引用等待條件
import time
import threading

#————————————天眼查大類————————————————
class Tianyan():

    def __init__(self,user,pwd):
        self.browser=webdriver.Firefox()  #實例化瀏覽器對象,並命名為 browser
        self.user=user
        self.pwd=pwd
        self.wait=WebDriverWait(self.browser,5) #設定瀏覽器最大等待時間為5秒鍾,超過就報錯
        self.get_url()


#————————————觸發瀏覽器對象————————————
    def get_url(self):

        self.browser.get("https://www.tianyancha.com/") #打開天眼查瀏覽器
        button=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,"link-white"))) #等待目標可以點擊
        button.click()
        button2=self.wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="login-warp"]/div[1]/div[3]/div[1]/div[2]')))
        button2.click()


#———————————公司文本————————————
    def write(self):
        with open(doc_company,"rb") as f:
            for i in f :
                yield i.decode(encoding='utf-8')


#———————————登錄——————————————————
    def check_login(self):
        try:
            input_user = self.browser.find_element_by_xpath('//div[@class="login-warp"]/div[1]/div[3]/div[2]/div[2]/input')
            input_psw = self.browser.find_element_by_xpath('//div[@class="login-warp"]/div[1]/div[3]/div[2]/div[3]/input')
            input_user.send_keys(self.user) #發送登錄賬號
            input_psw.send_keys(self.pwd)
            time.sleep(1)  #等待 一秒 方式被識別為機器人
            login=self.wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="login-warp"]/div[1]/div[3]/div[2]/div[5]')))
            login.click()
            return True
        except Exception:
            return False

# ———————————發送要查詢公司的名稱——————————————————
    def check_company(self,company):
        company_input = self.browser.find_element_by_id("home-main-search")
        company_click = self.wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="input-group-btn btn -hg"]')))
        company_input.send_keys(company)
        time.sleep(0.2)
        company_click.click()

# ————————————獲取要查詢的公司的名稱、法人、電話信息—————————————————
    def get_news(self):
        name = self.browser.find_element_by_xpath('//div[@class="header"]/a/em').text
        faren = self.browser.find_element_by_xpath('//div[@class="info"]/div[1]/a').text
        phone = self.browser.find_element_by_xpath('//div[@class="contact"]/div[1]/span[2]').text
        company_list = "公司名稱:|%s |法人:| %s|電話:| %s" % (name, faren, phone)

        self.downlode_company(company_list) #存儲信息
        print(company_list)

#———————————存儲需要時保存的信息——————————————————
    def downlode_company(self,data):
        with open(doc_check_company, "a", encoding="utf-8") as f:
            f.write(data)
            f.write("\n")

# ———————————主要運行邏輯——————————————————
    def main(self):
        if self.check_login(): #
            f=self.write()
            for company in f:
                try:
                    self.check_company(company)
                    get_thread=threading.Thread(target=self.get_news()) #使用線程來存儲信息
                    get_thread.start()
                    self.browser.back()
                except:
                    message = '公司名稱:|%s|該公司電話法人資料不齊全,無法抓取' % company
                    print(message)
                    self.downlode_company(message)
                    self.browser.back()
            
        else:
            print("賬號密碼不正確,請重新核對")


#———————————主體參數———————————————————————
if __name__ == '__main__':
    user=                 #賬號
    pwd=''                #密碼
    doc_check_company='check_company.txt'  #查詢之后的公司名稱
    doc_company='company.txt'   #需要查詢的公司列表
    time1=time.time()   
    window=Tianyan(user,pwd)
    window.main()
    time2=time.time()
    print(time2-time1)

  

  剛學了下生成器的概念,在這里就用了一下yield,還用了一下線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM