zoukankan      html  css  js  c++  java
  • 盖得化工--采集所有公司详细信息

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门

    https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6EmUbbW&id=564564604865

    错误很多,很明显。

    只能采集一级网址的信息:公司名,主要产品,地址
    二级网址格式乱的,采不了

    # -*- coding: utf-8 -*-
    """
    Created on Wed May 11 11:19:02 2016
    
    @author: Administrator
    """
    
    import requests,bs4,csv,time,random,os
    
    #存放所有二级网址
    fileName='combinedFile.csv'
    #存放二级网址目录
    thedir='C:/Users/Administrator/Desktop/盖得化工测试/二级链接/'
    dir_companyInformation="C:/Users/Administrator/Desktop/盖得化工测试/公司信息/"
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    rows=[]
    #os.mkdir("公司信息")
    #获取所有csv文件名
    def Get_csvFileNames():
        #获取路径下所有文件
        list_FileNames=os.listdir(thedir)
        #获取路径下所有csv文件
        list_csvFileNames=[fileName for fileName in list_FileNames if os.path.splitext(fileName)[1]==".csv"]
        return list_csvFileNames
    
    #获取所有二级网址一共20*31个
    def Get_second_links(fileName):
        file=open(fileName,'r')
        csv_reader=csv.reader(file)
        second_links=list(csv_reader)
        second_links1=[i[1] for i in second_links]
        return second_links1
    
    #功能:将list对象N等分  
    def div_list(ls,n):  
        if not isinstance(ls,list) or not isinstance(n,int):  
            return []  
        ls_len = len(ls)  
        if n<=0 or 0==ls_len:  
            return []  
        if n > ls_len:  
            return []  
        elif n == ls_len:  
            return [[i] for i in ls]  
        else:  
            j = int(ls_len/n)   
            ### j,j,j,...(前面有n-1个j),j+k  
            #步长j,次数n-1  
            ls_return = []  
            for i in range(0,(n-1)*j,j):  
                ls_return.append(ls[i:i+j])  
            #算上末尾的j+k  
            ls_return.append(ls[(n-1)*j:])  
            return ls_return  
    
    
    #获取一个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个row的列表中
    def Get_one_companeyInformation(secondLink):
        #row用于保存公司所有采集信息
        row=[]
        res=requests.get(secondLink)
        soup=bs4.BeautifulSoup(res.text,"lxml")
        #公司名字
        companyName_elem=soup.select(".cnname")
        companyName=companyName_elem[0].getText()
        #主要产品
        mainProduct_elem=soup.select(".main-product")
        mainProduct=mainProduct_elem[0].getText()
        #地址
        address_elem=soup.select(".public-ul")
        content=address_elem[1].getText()
        content1=content.split('
    ')
        address=content1[3]
        
        site_company=content1[6] 
        site_company1=site_company.strip('	')
        site_company2=site_company1.split("xa0")
        site_company3=site_company2[0:2] #最终结果
        row.append(secondLink)
        row.append(companyName)
        row.append(mainProduct)
        row.append(address)
        row.append(site_company3)
        return row    
    
    '''
    Get_companeyInformation(second_links[0])
    Out[83]: 
    ['湖北盛天恒创生物科技有限公司',
     "主营产品:维生素C棕榈酸酯、克拉霉素、他克莫司、磷酸西他列汀、盐酸依列替康、盐酸丁卡因、利福昔明、褪黑素、利凡诺、L-2-氨基丁酰胺盐酸盐、蹄甲多肽粉、枸橼酸铋钾、苯磺酸氨氯地平、异烟肼、呋塞米、4,4'-二甲氧基三苯基氯甲烷(DMT-CL)、4-(4-氨...",
     '地址:湖北省武汉市东湖开发区创业街1001号',
     ['http://www.hbsthcpharm.com ', ' http://show.guidechem.com/hbsthcsales ']]
    
    '''
    
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    def Get_oneCsv_companeyInformation(second_links):
        for secondLink in second_links:
            try:
                row=Get_one_companeyInformation(secondLink)
                rows.append(row)
                time.sleep(random.randint(10,15))
            except:
                print("error:"+secondLink)
                continue
            
        return rows
    
    #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
    def Write_table_to_csv(fileName,list_tableContent):
        #对列表格式修改,字符串写入的格式不对
        file=open(fileName,'w',newline='')
        writer1=csv.writer(file)
        writer1.writerows(list_tableContent)
        file.close()  
        
    #写入所有文件
    def Write_allTables_to_csvs():
        for i in range(n):
            #获取一个csv文件的公司的二级网址,一共二十个
            second_links=second_links_div[i]
            #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
            rows=Get_oneCsv_companeyInformation(second_links)
            #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
            fileName=dir_companyInformation+(str(i+1)+".csv")
            Write_table_to_csv(fileName,rows)
            
    #二级网址等分为31    
    n=31    
    #获取所有二级网址
    all_second_links=Get_second_links(fileName)
    #所有二级网址等分31分
    second_links_div=div_list(all_second_links,n)
    Write_allTables_to_csvs()
    
    
    
    '''
    #获取一个csv文件的公司的二级网址,一共二十个
    second_links=Get_second_links(list_csvFileNames[0])
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    rows=Get_oneCsv_companeyInformation(second_links)
    #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
    Write_table_to_csv(dir_companyInformation+fileName,rows)
    
    
    
    #获取公司的二级网址
    def Get_second_links(fileName):
        file=open(thedir+fileName,'r')
        csv_reader=csv.reader(file)
        second_links=list(csv_reader)
        second_links1=[i[1] for i in second_links]
        
        return second_links1
    
    '''
    

      

    改良版本2,还是有很多问题,主要字段就在一级采集,网址再想办法

    # -*- coding: utf-8 -*-
    """
    Created on Wed May 11 11:19:02 2016
    只能采集一级网址的信息:公司名,主要产品,地址
    二级网址格式乱的,采不了
    @author: Administrator
    """
    
    import requests,bs4,csv,time,random,os
    
    #存放所有二级网址
    fileName='combinedFile.csv'
    #存放二级网址目录
    thedir='C:/Users/Administrator/Desktop/盖得化工测试/二级链接/'
    dir_companyInformation="C:/Users/Administrator/Desktop/盖得化工测试/公司信息/"
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    rows=[]
    #os.mkdir("公司信息")
    #获取所有csv文件名
    def Get_csvFileNames():
        #获取路径下所有文件
        list_FileNames=os.listdir(thedir)
        #获取路径下所有csv文件
        list_csvFileNames=[fileName for fileName in list_FileNames if os.path.splitext(fileName)[1]==".csv"]
        return list_csvFileNames
    
    #获取所有二级网址一共20*31个
    def Get_second_links(fileName):
        file=open(fileName,'r')
        csv_reader=csv.reader(file)
        second_links=list(csv_reader)
        second_links1=[i[1] for i in second_links]
        return second_links1
    
    #功能:将list对象N等分  
    def div_list(ls,n):  
        if not isinstance(ls,list) or not isinstance(n,int):  
            return []  
        ls_len = len(ls)  
        if n<=0 or 0==ls_len:  
            return []  
        if n > ls_len:  
            return []  
        elif n == ls_len:  
            return [[i] for i in ls]  
        else:  
            j = int(ls_len/n)   
            ### j,j,j,...(前面有n-1个j),j+k  
            #步长j,次数n-1  
            ls_return = []  
            for i in range(0,(n-1)*j,j):  
                ls_return.append(ls[i:i+j])  
            #算上末尾的j+k  
            ls_return.append(ls[(n-1)*j:])  
            return ls_return  
    
    
    #获取一个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个row的列表中
    def Get_one_companeyInformation(secondLink):
        #row用于保存公司所有采集信息
        row=[]
        res=requests.get(secondLink)
        soup=bs4.BeautifulSoup(res.text,"lxml")
        #公司名字
        companyName_elem=soup.select("h1")
        companyName=companyName_elem[0].getText()
        #主要产品
        mainProduct_elem=soup.select(".main-product")
        mainProduct=mainProduct_elem[0].getText()
        #如果main-product为空,则用select另外元素
        if mainProduct==[]:
            elem_mainProduct=soup.select(".important_product dd")
            mainProduct=elem_mainProduct[0].getText()
            
        #地址
        address_elem=soup.select(".public-ul")
        content=address_elem[1].getText()
        if content=[]:
            address_elem=soup.select(".public1-ult li")
            address=address_elem[1].getText()
        content1=content.split('
    ')
        address=content1[3]
        
        site_company=content1[6] 
        site_company1=site_company.strip('	')
        site_company2=site_company1.split("xa0")
        site_company3=site_company2[0:2] #最终结果
        row.append(secondLink)
        row.append(companyName)
        row.append(mainProduct)
        row.append(address)
        row.append(site_company3)
        return row    
    
    '''
    Get_companeyInformation(second_links[0])
    Out[83]: 
    ['湖北盛天恒创生物科技有限公司',
     "主营产品:维生素C棕榈酸酯、克拉霉素、他克莫司、磷酸西他列汀、盐酸依列替康、盐酸丁卡因、利福昔明、褪黑素、利凡诺、L-2-氨基丁酰胺盐酸盐、蹄甲多肽粉、枸橼酸铋钾、苯磺酸氨氯地平、异烟肼、呋塞米、4,4'-二甲氧基三苯基氯甲烷(DMT-CL)、4-(4-氨...",
     '地址:湖北省武汉市东湖开发区创业街1001号',
     ['http://www.hbsthcpharm.com ', ' http://show.guidechem.com/hbsthcsales ']]
    
    '''
    
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    def Get_oneCsv_companeyInformation(second_links):
        for secondLink in second_links:
            try:
                row=Get_one_companeyInformation(secondLink)
                rows.append(row)
                time.sleep(random.randint(10,15))
            except:
                print("error:"+secondLink)
                continue
            
        return rows
    
    #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
    def Write_table_to_csv(fileName,list_tableContent):
        #对列表格式修改,字符串写入的格式不对
        file=open(fileName,'w',newline='')
        writer1=csv.writer(file)
        writer1.writerows(list_tableContent)
        file.close()  
        
    #写入所有文件
    def Write_allTables_to_csvs():
        for i in range(n):
            #获取一个csv文件的公司的二级网址,一共二十个
            second_links=second_links_div[i]
            #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
            rows=Get_oneCsv_companeyInformation(second_links)
            #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
            fileName=dir_companyInformation+(str(i+1)+".csv")
            Write_table_to_csv(fileName,rows)
            
    #二级网址等分为31    
    n=31    
    #获取所有二级网址
    all_second_links=Get_second_links(fileName)
    #所有二级网址等分31分
    second_links_div=div_list(all_second_links,n)
    #Write_allTables_to_csvs()
    
    
    
    
    '''
    #错误网址secondLink="http://show.guidechem.com/xinbaochem"
    #获取一个csv文件的公司的二级网址,一共二十个
    second_links=Get_second_links(list_csvFileNames[0])
    #获取一个csv文档二十个公司的信息:名字,主要产品,联系方式,地址 ,并保存到一个rows的列表中
    rows=Get_oneCsv_companeyInformation(second_links)
    #把一页内容写入csv文档 ,list_tableContent为二维列表[[a],[b],[c]]
    Write_table_to_csv(dir_companyInformation+fileName,rows)
    
    
    
    #获取公司的二级网址
    def Get_second_links(fileName):
        file=open(thedir+fileName,'r')
        csv_reader=csv.reader(file)
        second_links=list(csv_reader)
        second_links1=[i[1] for i in second_links]
        
        return second_links1
    
    '''
    

      

  • 相关阅读:
    常见面试测试要点
    怎样在 CentOS/RHEL 7/6 上安装和配置 Sendmail 服务器
    Cannot uninstall 'pyparsing'. It is a distutils installed project
    Linux下校验SHA1和MD5的方法
    Linux查看进程启动时间和运行多长时间
    sqlplus -S参数表示什么意思?
    dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'
    CentOS7中安装pip的方法
    四则运算中遇到的一个问题
    动手动脑
  • 原文地址:https://www.cnblogs.com/webRobot/p/5482746.html
Copyright © 2011-2022 走看看