Python爬蟲---爬取數據(上)

又是女票,拿了3萬多條的13年某地區的公司信息,但是三年過去了,工商局的註冊信息發生了巨大變化,有的註冊資本增加了,有的公司老闆變多了,更有不少公司不存在了,因此,需要一份最新的信息以便於她進行使用。
  原先是想用工商局網站上進行爬取的,但是發現工商局網站好多驗證信息,畢竟我這Python初學咋練的,是在是怕怕啊!幸好,找到一個名爲XX查的網站,這個網站沒有驗證,可以直接查詢,因此就拿這個網站來吧。
  經過研究,發現必須要解析JavaScript才能拿到真實的數據,網上查找了下,發現使用phantomjs是比較簡單的一種方式,於是就他了。
  我的思路是這樣的,數據是在文件中,查詢後肯定有兩種結果,查找成功的和查找失敗的,這兩種各自寫在一個文件中,以便之後使用。對於成功的數據,繼續對其查找聯繫方式,註冊資金,開業狀態等等需要的數據。這一塊應該是一個類來進行的。另外一個類,打算使用Python內置的tkinter模塊,寫一個簡單的界面,配置這兩個文件,和顯示實時的查詢信息的。
以下是核心的爬蟲類:

   class TianYanCha(object):
	def __init__(self, sucPath, failedPath):
		super(TianYanCha, self).__init__()
		self.fileSuc = open(sucPath, 'a')
		self.fileFailed = open(failedPath, 'a')
		self.driver = webdriver.PhantomJS(executable_path = './phantomjs2.1.1/bin/phantomjs.exe')

	def __del__(self):
		print('dle phantomjs')
		self.fileSuc.close()
		self.fileFailed.close()
		self.driver.quit()
		
	def setOutput(self,text):
		self.text = text

	def getCompanyByName(self, company):
		url = 'http://www.tianyancha.com/search?key=%s&checkFrom=searchBox' % urllib.parse.quote(company)
		self.text.insert('end', '開始查找公司:' + company + ' ' + url + "\r\n")
		self.driver.get(url)
		self.driver.implicitly_wait(10)
		spans = self.driver.find_elements_by_css_selector('span[class=\"c9 ng-binding\"]')
		print(self.driver.page_source)
		if len(spans) > 0:
			href = self.driver.find_elements_by_css_selector('a[class=\"query_name\"]')
			if len(href) > 0:
				result = company
				url = href[0].get_attribute('href')
				self.text.insert('end', '找到公司%s,正在查詢詳細信息:%s\r\n' %(company, url))
				self.driver.get(url)
				self.driver.implicitly_wait(10)
				#獲取公司名稱
				name = self.driver.find_elements_by_css_selector('div[class=\"company_info_text\"]')
				if len(name) > 0:
					infos = name[0].text.split('\n')
					self.text.insert('end', infos)
				#獲取公司註冊資本
				regCapital = self.driver.find_elements_by_css_selector('td[class=\"td-regCapital-value\"]')
				if len(regCapital) > 0:
					result = result + " " + regCapital[0].text
				#獲取公司註冊狀態
				regStatus = self.driver.find_elements_by_css_selector('td[class=\"td-regStatus-value\"]')
				if len(regStatus) > 0:
					result = result + " " + regStatus[0].text
				self.fileSuc.write(result)
				self.fileSuc.write('\r')
				self.fileSuc.flush()
				self.text.insert('end', result + "\r\n")
				self.text.vbar.set(1, 1)
			else:
				self.text.insert('end', self.driver.page_source)
		else:
			spans = self.driver.find_elements_by_css_selector('span[class=\"c8\"]')
			if len(spans) > 0:
				self.text.insert('end', '未找到公司 %s 的相關信息\r\n' % company)
				self.fileFailed.write(company)
				self.fileFailed.write('\r')
			else:
				spans = self.driver.find_elements_by_css_selector('div[class=\"gt-input\"]')
				if len(spans) > 0:
					self.text.insert('end', '需要輸入驗證碼了!!!!' + '\r\n')
				else:
					self.text.insert('end', '查詢公司 %s 遇到錯誤\r\n' % company)
					self.fileFailed.write('               ' + company)
					self.fileFailed.write('\r')
			self.fileFailed.flush()

tkinter的界面,請見Python爬蟲—爬取數據(下)tkinter和exe打包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章