python selenium登录企名片,筛选各种条件,爬虫爬取融资信息,保存到csv文件

要点:1.利用datatime构建 日期,设定格式

         2.利用selenium 登录账号,input等待需要输入的验证码

         3.可以利用scrapy的Selector,替代beautifysoup 得到想要的标签

         4.selenium的操作,选定筛选条件、模拟键盘的enter

         5.使用try语句,错误时用logging提示错误,没问题就继续else里面的语句

         6.保存csv文件的具体写法!!


#步骤:
'''

1.登录,进入 ishijian页面,返回源代码




2.从源代码中,得到35个行业领域的list


3.设定 天使论
    循环35个行业
        设定  行业跟 天使轮
        循环365天

            设定 时间, 返回筛选后的页面


4.            对页面处理,保存



下面是具体代码:

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()

提示:

使用时需要修改下浏览器,我是用自己写的 火狐浏览器,可以不重启继续使用,代码见我前面的文章

还有需要提取注册,修改下手机号码




猜你喜欢

转载自blog.csdn.net/qq_38282706/article/details/80641433
今日推荐