from selenium import webdriver
import time
import re
from bs4 import BeautifulSoup

#************************************************************************
#定义login函数
def login(username,password):
driver = webdriver.Firefox(executable_path='C:/Program Files (x86)/Mozilla Firefox/firefox.exe')
driver.get('http://www.qixin.com/login')
time.sleep(2)
driver.maximize_window()
driver.find_element_by_link_text('QQ登录').click()
driver.switch_to_frame('ptlogin_iframe')#切换到iframe框架
driver.find_element_by_link_text('帐号密码登录').click()
driver.find_element_by_id('u').clear()
driver.find_element_by_id('u').send_keys(username)#需要更换的QQ账号
driver.find_element_by_id('p').send_keys(password)#对应QQ账号的密码密码
driver.find_element_by_class_name('login_button').click()
time.sleep(5)
return driver
#************************************************************************
#获得搜索结果页面
def search_ename(driver,i):
#搜索企业名称并抓取该url地址
url = 'http://www.qixin.com/search?key='+i+'&type=enterprise&method=all'
print('正在抓取:'+url)
driver.get(url)
return driver
#************************************************************************
#从搜索结果中提取出企业链接(只提取第一个)
def get_enameurl(driver):
#利用BeautifulSoup匹配公司名
soup = BeautifulSoup(driver.page_source)
sfa = soup.find_all(href=re.compile('/company/gongsi'))
if len(sfa)!=0:
eurl = 'http://www.qixin.com'+sfa[0]['href']
else:
eurl = '不存在'
return eurl
#************************************************************************
#定义匹配基本信息函数
def get_basic_info(soup):
#匹配工商基本信息########################
a = soup.find_all(class_="panel panel-default basic-info")
#s用来存储企业工商基本信息
s = ''
#将工商基本信息中各个字段的值匹配出来存储进s
for i in a[0].find_all('span')[1:]:
s = s+'\t'+i.string

#因为法人代表字段是链接,所以不能用以上方式匹配,下面是匹配法人代表的方式
#判断法人代表字段是否为空,不为空执行以下操作
if len(soup.find_all(href=re.compile('search')))!=0:
#匹配法人代表的值
faren = soup.find_all(href=re.compile('search'))[0].string
#判断法人代表的值类型是否是str(不是str就是NoneType类型,无法与s进行相加)
if isinstance(faren,str):
s = faren + s
else:
s = '-' + s
#法人代表字段如果为空,执行以下操作
else:
faren = '-'
s = fanren + s
#将企业名称存储进s(首先判断企业名称是否为空)
try:
qiyemingcheng = soup.title.string.split('|')[0]
except:
qiyemingcheng = '-'

s = qiyemingcheng + '\t' + s +'\n'

#匹配股东信息和主要人员信息
a = soup.find_all(class_='panel panel-default',style="margin-top:0")
#匹配股东信息########################
#不是链接的股东信息
gudonglist = a[0].find_all('span',class_=None)
if len(gudonglist)!=0:
for gudong in gudonglist:
s = s+gudong.string+'\t'
#是链接的股东信息
gudonglist2 = a[0].find_all('a')
if len(gudonglist2)!=0:
for gudong in gudonglist2:
s=s+gudong.string+'\t'

if len(gudonglist)==0 and len(gudonglist2)==0:
s=s+'-'
s=s+'\n'
#匹配主要人员信息########################
bosslist = a[1].find_all(class_='enterprise-employee-name')
if len(bosslist)!=0:
for boss in bosslist:
s=s+boss.string+'\t'
else:
s=s+'-'
s=s+'\n'
#将s写入文本文件
print('成功写入基本信息数据\n**************\n')
return s
#************************************************************************
#定义匹配风险信息函数
def get_risk_info(soup):
a=soup.find_all(class_="risk-list-item")
s=''
#匹配工商变更信息########################
changerecord = soup.find().click()
time.sleep(1)
soup = BeautifulSoup(driver.page_source)
s = s + get_risk_info(soup)
except:
s = s + '-\n-\n-\n-\n-\n-\n-\n'

#抓取对外投资信息,首先点击切换到对外投资信息栏
try:
driver.find_element_by_xpath("//a[@href='#investment']").click()
time.sleep(1)
soup = BeautifulSoup(driver.page_source)
s = s + get_investment_info(soup)
except:
s = s + '-\n'

#抓取企业年报信息,首先点击切换到企业年报信息栏
try:
driver.find_element_by_xpath("//a[@href='#report']").click()
time.sleep(1)
soup = BeautifulSoup(driver.page_source)
s = s + get_report_info(soup)
except:
s = s + '-\n-\n\n'

return s
#************************************************************************
def get_enterprise_data(driver,ename):
#获得搜索结果页面
driver = search_ename(driver,ename)
#从搜索结果中提取出企业链接
eurl = get_enameurl(driver)
#抓取企业链接(eurl)关联的网页,匹配出需要的字段
if eurl != '不存在':
data = get_evalue(driver,eurl)
else:
soup = BeautifulSoup(driver.page_source)
try:
qiyemingcheng = soup.title.string.split('|')[0]
except:
qiyemingcheng = '-'

data = qiyemingcheng+','+'该企业不存在\n\n'
print('成功写入数据\n**************\n')
sdata = data.split('\n')
endata = sdata[0].split('\t')

return endata
#************************************************************************

driver = login('QQ账号','QQ密码') #登录函数 只需要登录一次
data = get_enterprise_data(driver,'企业名称') #获得企业信息函数,登录之后可以多次调用