简单python爬虫完整代码 python爬虫案例讲解( 二 )


这张图上的基本属性和交易属性都可以拿下来作为房屋字段
最后是地图部分的数据:
这部分数据比较多,例如:最近的地铁站点、公交站点等
以及在地图插件中隐藏的房屋经纬度数据
因为以前的文章专门爬过地铁站点数据,所以我在这里只拿了经纬度数据
二、流程设计目标已经明确,总结一下上面我们需要注意的地方,大概如下:
首先,判断该城市的总数据是否超过 3000 条,若超过则需要设置筛选条件 。先通过区域进行筛选,其次通过居室进行筛选,最后通过朝向进行筛选
上述筛选过程中任一过程若存在数据小于 3000条,则停止往下筛选 。
其次,在确定筛选条件之后,通过解析每一页的二手房链接跳转到详情页 。翻页操作只需要根据页码重新构造 url 即可
最后,对二手房详情页进行解析,保存数据到本地文件中 。
为了方便对整个流程进行复现,我做了一个流程图,如下:
三、主要代码复现通过上面的流程图,可以完成整个爬虫的代码复现
因为涉及的代码较多,这里只贴核心代码,完整的代码可以在文末获取
首先是获取当前条件下的房屋数据个数:
defget_house_count(self):"""获取当前筛选条件下的房屋数据个数"""#爬取区域起始页面的数据response=requests.get(url=self.current_url,headers=self.headers)#通过BeautifulSoup进行页面解析soup=BeautifulSoup(response.text,'html.parser')#获取数据总条数count=soup.find('h2',class_='totalfl').find('span').string.lstrip()returnsoup,count其次是主页面的设计:
判断是否超过3000,若超过则进行第二级筛选,若未超过则直接获取数据
defget_main_page(self):#获取当前筛选条件下数据总条数soup,count_main=self.get_house_count()#如果当前当前筛选条件下的数据个数大于最大可查询个数,则设置第一次查询条件ifint(count_main)>self.page_size*self.max_pages:#获取当前地市的所有行政区域,当做第一个查询条件soup_uls=soup.find('div',attrs={'data-role':'ershoufang'}).div.find_all('a')self.area=self.get_area_list(soup_uls)#遍历行政区域,重新生成筛选条件forareainself.area:self.get_area_page(area)else:#直接获取数据self.get_pages(int(count_main),'','','')#保存数据到本地self.data_to_csv()对应的在确定区域的条件下,继续判断并筛选居室
在确定区域和居室的条件下,继续判断并筛选朝向
在确定区域、居室和朝向的条件下,直接获取 前3000条 数据
可以看到上面的流程十分类似,对应的代码大家注意看源码就行 。
如果在三级筛选下仍存在超过3000条数据,照葫芦画瓢就行
在代码执行的过程中,建议每获取到 10条 数据保存一次,避免中途程序出错而前功尽弃
对应的代码可以参考如下:
'''超过10条数据,保存到本地'''iflen(self.data_info)>=10:self.data_to_csv()在保存到本地 csv 的时候,建议采用追加的方式进行保存
也就是在 data_to_csv 函数中这样写:
defdata_to_csv(self):"""保存/追加数据到本地@return:"""df_data=https://www.520longzhigu.com/diannao/pd.DataFrame(self.data_info)ifos.path.exists(self.save_file_path)andos.path.getsize(self.save_file_path):#追加写入文件df_data.to_csv(self.save_file_path,mode='a',encoding='utf-8',header=False,index=False)else:#写入文件,带表头df_data.to_csv(self.save_file_path,mode='a',encoding='utf-8',index=False)#清空当前数据集self.data_info=[]另外,考虑到大多时候需要运行好几次程序才能获取到所有数据
在每次运行程序的时候先统计已经爬到的房屋数据,跳过已经爬到的数据
对应的代码可以这样写:
#所有已经保存的房屋id,用来验证去重self.house_id=self.get_exists_house_id()defget_exists_house_id(self):"""通过已经爬取到的房屋信息,并获取房屋id@return:"""ifos.path.exists(self.save_file_path):df_data=https://www.520longzhigu.com/diannao/pd.read_csv(self.save_file_path,encoding='utf-8',)df_data['house_id']=df_data['house_id'].astype(str)returndf_data['house_id'].to_list()else:return[]最后,在主函数中只需要设置城市名称和数据保存路径即可


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: