盖得化工--采集所有公司详细信息

本教程旨在通过Python语言,带领初学者从零开始,掌握Scrapy爬虫框架,深入理解如何采集网页数据,包括获取公司信息如名称、主要产品、地址等。教程覆盖了从基础概念到实际应用的全过程,通过实例演示如何处理不同格式的网址,确保学习者能够灵活应对各类网页结构。

 

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('\n')
    address=content1[3]
    
    site_company=content1[6] 
    site_company1=site_company.strip('\t')
    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('\n')
    address=content1[3]
    
    site_company=content1[6] 
    site_company1=site_company.strip('\t')
    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

'''

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值