要点:1.利用datatime构建 日期,设定格式
2.利用selenium 登录账号,input等待需要输入的验证码
3.可以利用scrapy的Selector,替代beautifysoup 得到想要的标签
4.selenium的操作,选定筛选条件、模拟键盘的enter
5.使用try语句,错误时用logging提示错误,没问题就继续else里面的语句
6.保存csv文件的具体写法!!
#步骤:
'''
1.登录,进入 ishijian页面,返回源代码
3.设定 天使论
循环35个行业
设定 行业跟 天使轮
循环365天
设定 时间, 返回筛选后的页面
下面是具体代码:
import time,os,csv,logging from selenium import webdriver from selenium.myfox import myfox from scrapy import Selector from selenium.webdriver.common.keys import Keys class qimingpian(object): def __init__(self): self.phone_number = '1888888888' #登录手机 self.login_url = 'http://auth.qimingpian.com/finos.html' #登录网址 self.url='http://vip.qimingpian.com/#/finos/investment/ishijian'#操作网址 self.driver = myfox().work() #启动浏览器 self.times=self.alltime() #一年日期组成的list self.csv_file = os.getcwd() + '\\' + 'data.csv' #csv文件路径 def alltime(self): '''得到以今天为止近一年的日期组成的list''' import datetime dateend = datetime.date.today() datestart = dateend - datetime.timedelta(days=365) alltime = [] while datestart < dateend: alltime.append(datestart.strftime('%Y.%m.%d')) datestart += datetime.timedelta(days=1) return alltime ##['2017.06.10', '2017.06.11', '2017.06.12', '2017.06.13',.....] def qimingpian_login(self, url): '''登录网页,然后输入账户,点击短信登录''' self.driver.maximize_window() self.driver.get(url) self.driver.implicitly_wait(3) self.driver.find_element_by_xpath('//div[@class="fl tab-phone hand"]').click() user = self.driver.find_element_by_xpath('//*[@class="form-con dib phone-input"]') user.send_keys(self.phone_number) self.driver.find_element_by_xpath('//*[@id="code-btn"]').click() time.sleep(2) code = input('请输入短信验证那个码') pwd = self.driver.find_element_by_xpath('//*[@class="form-con code-input fl"]') pwd.send_keys(code) time.sleep(0.5) self.driver.find_element_by_xpath('//*[@id="phone-login"]').click() time.sleep(20) #return self.driver def login(self): '''这是最开始需要登录的步骤,返回的还是 ishijian 的页面的源代码''' print('开始登陆!') self.qimingpian_login( self.login_url)#输入手机号,短信验证部分 self.driver.get(self.url) #进入具体操作的网址 self.driver.implicitly_wait(3) print('进入ishijian页面') time.sleep(3) print('登录的页面是: %s'% self.driver.title) content = self.driver.page_source.encode('utf-8') return content def test(self): '''#这是测试时,不需要登录了,返回的还是 ishijian 的页面的源代码''' print('进入ishijian页面') self.driver.maximize_window() self.driver.refresh() self.driver.implicitly_wait(3) time.sleep(3) content = self.driver.page_source.encode('utf-8') return content def hangye_list(self,content): ''' :param content: ishijian 的页面的源代码 :return: 得到行业领域的35个选项组成的list ''' response=Selector(text=content) hangye_list = response.xpath('//div[@class="tag-list"]')[3].xpath('./span/text()').extract()#这是行业领域的35个选项 print('得到行业领域') return hangye_list def set_hangye(self,hangye,lunci): ''' 设定行业领域跟投资轮次 :param hangye:选定行业 :param lunci:选定轮次 ''' self.driver.refresh() self.driver.get(self.url) self.driver.implicitly_wait(3) time.sleep(3) hangye1 = hangye.replace('\n', '').strip() lunci1 = lunci.replace('\n', '').strip() print('\n此时设定了:%s>>>%s' % (hangye1, lunci1)) try: #设定轮次 self.driver.find_element_by_xpath(r'//span[text()="%s"]' % lunci).click() time.sleep(4) #设定行业 self.driver.find_element_by_xpath('//i[@class="iconfont icon-xialashouqi"]').click() # 点击下拉 time.sleep(3) self.driver.find_element_by_xpath(r'//span[text()="%s"]' % hangye).click() # 点击不同的行业 self.driver.implicitly_wait(1) time.sleep(3) except Exception as e: logging.error('设定行业跟轮次有问题,/n,%s,/n'% e) logging.error('此时的条件是:%s'% hangye1+'---'+lunci1,) def set_time(self,the_time): ''' 行业跟轮次前面已经设置了,这里是设置时间,没问题的话就返回 筛选后的源代码 :param the_time:设定日期 :return:条件设定好此时的源代码 ''' try: #设定时间 print('此时设定时间为:%s' % the_time) end_time=self.driver.find_element_by_xpath('//input[@placeholder="结束日期"]') start_time=self.driver.find_element_by_xpath('//input[@placeholder="开始日期"]') self.put_time(the_time,end_time,start_time) #设定时间 tiaojian=self.driver.find_elements_by_xpath('//span[@class="el-tag filter-tag2 mr10 mb5"]') #筛选条件应该有4个 if len(tiaojian) < 4: #不够4个筛选条件,再输入日期一次 self.put_time(the_time, end_time, start_time) #tiaojian = ('--->').join([choice.text for choice in tiaojian]) #这就是筛选条件了 except Exception as e: logging.error('时间设定有问题,/n %s,/n'%e) logging.error('此时的时间是:%s'% the_time) else: #try部分没问题了,就返回筛选后的源代码 content = self.driver.page_source.encode('utf-8') return content def put_time(self,the_time,end_time,start_time): ''' 设定时间的具体操作 :param the_time: 需要设定的日期 :param end_time: 结束日期的文本框 :param start_time:开始日期的文本框 ''' end_time.clear() # time.sleep(1) # end_time.click() end_time.send_keys('%s' % the_time) end_time.send_keys(Keys.ENTER) #相当于键盘的enter time.sleep(3) self.driver.find_element_by_xpath('//span[text()="投资轮次"]').click() # 没作用,只是用来过渡 time.sleep(1) start_time.clear() # time.sleep(1) # start_time.click() start_time.send_keys('%s' % the_time) start_time.send_keys(Keys.ENTER) time.sleep(6) def save(self,page_source,hangye,lunci,the_time): ''' 先用try 尝试提取筛选后得到的企业投资信息,成功的话,具体提取每一条的数据,然后保存csv 没有想要的信息,那么就跳过 :param page_source: 筛选后的源代码 :param hangye: 行业领域 :param lunci: 投资轮次 :param the_time: 选定的日期 :return: ''' ###对返回的源代码提取投资信息,返回sep hangye1 = hangye.replace('\n', '').strip() lunci1 = lunci.replace('\n', '').strip() try: response = Selector(text=page_source) sep = response.xpath('//div[@style="position: static;"]//tbody/tr') except Exception as e: #logging.error('传入的page_source有问题/n',e) sep=[] ##提取的投资信息不为空时,保存 if sep != [] and sep != ['']: print('筛选条件:', hangye1 + '--->' + lunci1+'--->'+the_time, '*****符合条件的投资有%s条!'%len(sep)) for i in sep: name = i.xpath('.//span[@class ="f16 lh22 hand f-hblue b"]/text()').extract()[0] jianjie = i.xpath('.//div[@class="mt5"]/text()').extract()[0] hangye = i.xpath('./td[4]/text()').extract()[0].replace('\n', '').strip() diqu = i.xpath('./td[5]/text()').extract()[0].replace('\n', '').strip() lunci = i.xpath('./td[6]/text()').extract()[0].replace('\n', '').strip() time = i.xpath('./td[7]/text()').extract()[0].replace('\n', '').strip() money = i.xpath('./td[8]/text()').extract()[0].replace('\n', '').strip() touzifang = i.xpath('./td[9]//span/text()').extract()[:-1] # 会多一个'-'的符号,所以去掉最后一个 #打开csv文件,保存 with open(self.csv_file, 'a+', encoding='utf-8', newline='') as f: if os.path.getsize(self.csv_file) == 0: # 里面没有文件就把列名添加进去 csv.writer(f, dialect="excel").writerow( ('项目', '项目简介', '行业领域', '地区', '投资轮次', '投资时间', '投资金额', '投资方')) csv.writer(f, dialect="excel").writerow( (name, jianjie, hangye, diqu, lunci, time, money,touzifang)) else: csv.writer(f, dialect="excel").writerow( (name, jianjie, hangye, diqu, lunci, time, money,touzifang)) else: print('筛选条件:',hangye1+'--->'+lunci1+'--->'+the_time,'>>>没符合条件的投资') def work(self): #content=self.test() #这是测试时用的,返回页面源代码 content=self.login() #如果重新登录就用这个,返回页面源代码 hangye_list=self.hangye_list(content) #得到行业领域的35个选项的list print(hangye_list) #具体操作 #先是循环35个行业,然后每个行业内再循环365天,得到筛选后的源代码,处理后保存csv tianshilun='\n 天使轮\n ' #选择 天使论,循环 for hangye in hangye_list[:3]: #循环35个行业 self.set_hangye(hangye,tianshilun) #设定行业跟轮次 for the_time in self.times[:4]:#循环365天 page_source=self.set_time(the_time) #设定时间,返回源代码 self.save(page_source,hangye,tianshilun,the_time) #保存csv alun='\n Pre-A轮\n ' for hangye in hangye_list[:3]: #一共35个行业 #每个行业 self.set_hangye(hangye, alun) for the_time in self.times[:8]:#一共365天 #一年的每天 page_source = self.set_time(the_time) self.save(page_source, hangye, alun, the_time) do=qimingpian() do.work()
提示:
使用时需要修改下浏览器,我是用自己写的 火狐浏览器,可以不重启继续使用,代码见我前面的文章
还有需要提取注册,修改下手机号码