python3 使用selenium模擬登陸天眼查抓取資料
阿新 • • 發佈:2018-12-08
由於之前用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,還用了一下執行緒。