您的位置:首页

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

2016-05-11 17:32 281 查看
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

'''


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: