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 '''