当前位置: 首页 > 后端技术 > Python

Python如何使用BeautifulSoup解析二手房详情页信息并存储文件

时间:2023-03-26 16:24:24 Python

1.实战场景Python如何使用BeautifulSoup分析二手房详情页信息及店铺文件2.知识点Python基本语法Python文件读写BeautifulSoup解析网页请求发送网络请求3.菜鸟实战详情页数据采集importos.pathimportplatformfrombase_spiderimportBaseSpiderfrombs4importBeautifulSoupimportpandasaspdromtqdmimporttqdm#进度条库classTao365DetailSpider(BaseSpider):#收集365淘房二手房信息list_data_file='tao365_list.csv'#收集数据并保存文件detail_data_file='tao365_detail.csv'保存收集数据的文件url_items=[]#收集链接数组,取自列表文件中的每一行detail_df=[]#收集信息def__init__(self):#初始化logself.init_log()#从列表文件中读取得到等待收集的链接list_file_path=self.fileManger.get_data_file_path(self.list_data_file)list_df=pd.read_csv(list_file_path,encoding=self.encoding)self.url_items=list_df.values#初始化要收集的链接数组detail_file_path=self.fileManger.get_data_file_path(self.detail_data_file)ifos.path.isfile(detail_file_path):#从detail文件self.data_file中读取收集到的信息_exist=Truedetail_df=pd.read_csv(detail_file_path,encoding=self.encoding)self.detail_df=detail_dfdefcheck_url_crawled(self,url):#检查当前链接是否已经被爬取iflen(self.detail_df)==0:#如果没有detail文件,则不捕获returnFalseifurlinself.detail_df.iloc[:,1].values:#如果url在detail文件的第一列,则表示self.logger已被捕获。warning("urlhascaptured%s",url)returnTrue#默认不捕获returnFalsedefparse_page(self,content,url):#使用BeautifulSoup标准库解析页面信息soup=BeautifulSoup(content,'lxml')#初始化数组datalist=[]ifsoup.find("p",attrs={'class':'line1'}):#titletitle=soup.find("p",attrs={'class':'line1'}).text#pricepriceSplit=soup.find('span',attrs={'class':'f48prebold'}).text.strip()priceArr=priceSplit.split('')price=priceArr[0]+"10,000"#每平方价格squarePrice=soup.find('div',class_='headinfo').find('p').text.strip()#Residentialhousing=soup.find('div',attrs={'class':'infoDetail__itemlong'}).find('a',class_='line1').textarea=soup.find('div',attrs={'class':'infoDetail__itemlongline1'}).textareaArr=area.split('')#地址areaStr=''forareainareaArr:area=area.replace('\n','')area=area.replace('address:','')ifarea.replace('\n','')!='Address:':iflen(area)>0:areaStr=areaStr+(area.replace('\n',''))ul=soup.find("ul",attrs={'class':'detail__mainCotetn__infoBar'})lis=ul.find_all("li")#房屋类型house_type=lis[0].text.replace('房屋类型:','').replace('\n','').strip()#建筑面积acreage=lis[1].text.replace('建筑面积:','').replace('\n','').strip()#楼层=lis[2].text.replace('楼层:','').replace('楼层咨询','').replace('\n','').strip()#房屋朝向direction=lis[3].text.replace('房屋朝向:','').replace('\n','').strip()#建造年份year=lis[5].text.replace('建造年份:','').replace('\n','').strip()datalist.append([title,price,squarePrice,housing,areaStr,house_type,acreage,level,direction,year])returndatalistdefcrawl_data(self):#收集url_item中的数据tqdm(self.url_items):url=url_item[1]ifself.check_url_crawled(url):continueself.logger.debug("当前采集页面信息:%s",url)#发送请求,获取数据page_content=self.get_content_from_url(url)#解析数据page_data=self.parse_page(page_content,url)iflen(page_data)==0:#如果没有获取到数据,继续分析下continue#将数据保存到文件中cols=['title','price','priceper㎡','community','address','housetype','建筑面积','楼层','房屋朝向','建筑年龄']self.save_to_detail_file(page_data,cols)#防止反爬,随机休眠一段时间self.sleep_random()defrun(self):self.logger.debug("采集开始")self.crawl_data()self.logger.debug("采集结束")if__name__=='__main__':print("采集365淘房秒详情-handhousinginformation")spider=Tao365DetailSpider()spider.run()print("pythonversion",platform.python_version())将收集到的数据存储到文件defsave_to_file(self,data,cols):#保存到文件file_path=self.fileManger.get_data_file_path(self.list_data_file)#初始化dataframe=pd.DataFrame(data)ifnotself.data_file_exist:#第一次writewithlistheader,清空原文件frame.columns=colsframe.to_csv(file_path,encoding=self.encoding,index=None)self.data_file_exist=True#写入后更新数据文件状态else:#后面不写如listheader,appendtoframe.to_csv(file_path,mode="a",encoding=self.encoding,index=None,header=0)self.logger.debug("Filesave完成”)运行结果运行截图采集详情页运行截图采集365淘房二手房信息详情100%|██████████|222/222[08:37<00:00,2.33s/it]pythonVersion3.9.10进程结束,exitcode0结果文件菜鸟实战,继续学习!