一、实战场景
Python 如何实现采集二手房列表信息并存储文件
二、知识点
python 根底语法
python 文件读写
BeautifulSoup
网页解析requests
发送网络申请tqdm 进度条
三、菜鸟实战
列表页数据采集
'''Description: 代码供参考学习应用'''from __future__ import annotationsimport osimport platformimport pandas as pdfrom bs4 import BeautifulSoupfrom tqdm import tqdm # 进度条库from base_spider import BaseSpiderfrom base_url_item import UrlItemclass Tao365Spider(BaseSpider):# 采集365淘房二手房信息target_url = "http://nj.sell.house365.com/district/p1.html" # 采集指标链接list_data_file = 'tao365_list.csv' # 采集数据保留的文件url_items: list[UrlItem] = [] # 采集链接数组PAGE_START = 1 # 采集开始页码PAGE_STEP = 5 # 采集步长def __init__(self):# 初始化日志self.init_log()# 默认采集的上一页为第 1 页start_page = self.PAGE_STARTlist_file_path = self.fileManger.get_data_file_path(self.list_data_file)if os.path.isfile(list_file_path):# 读取列表文件, 确定上一次采集的第几页, 以反对间断采集self.logger.info("数据文件存在")self.data_file_exist = True# 计算从第几页开始采集list_df = pd.read_csv(list_file_path, usecols=['第几页'], encoding=self.encoding)max_page = pd.DataFrame(list_df[2:]).max()start_page = int(max_page) + 1print("采集页面范畴: 第[%s]页至第[%s]页" % (start_page, start_page + self.PAGE_STEP - 1))for page in range(start_page, start_page + self.PAGE_STEP):# 初始化采集链接url = self.target_url.replace("p1", "p" + str(page))# 结构采集对象url_item = UrlItem(url=url, page=page)self.url_items.append(url_item)def crawl_data(self):for url_item in tqdm(self.url_items):# 采集数据url = url_item.urlself.logger.debug("以后采集页面信息: %s", url)# 发送申请, 获取数据page_content = self.get_content_from_url(url)# 解析数据page_data = self.parse_page(page_content, url_item)self.logger.debug("采集数据量: %s", len(page_data))# 保留数据到文件cols = ['题目', '题目链接', '房源id', '图片', '第几页']self.save_to_file(page_data, cols)# 避免反爬, 随机休眠一段时间self.sleep_random()def parse_page(self, content, url_item: UrlItem):# 利用BeautifulSoup规范库,解析页面信息soup = BeautifulSoup(content, 'lxml')# 初始化数组datalist = []for element in soup.find_all("div", attrs={'class': 'listItem'}):# 解析单条信息# 判断是否为无效数据if element.img.has_attr("data-original"):# 顺次解析, 题目, 题目链接, 房源id, 图片title = element.find("a", class_='listItem__title').text.strip()title_link = element.find("a", class_='listItem__title')['href']house_id = element.find("a", class_='listItem__title')['house-id']image = element.img["data-original"]datalist.append([title, title_link, house_id, image, url_item.page])return datalistdef run(self):self.logger.debug("采集开始")self.crawl_data()self.logger.debug("采集完结")if __name__ == '__main__':print("采集365淘房二手房信息")spider = Tao365Spider()spider.run()print("python 版本", platform.python_version())
存储采集数据到文件
def save_to_file(self, data, cols):# 保留到文件file_path = self.fileManger.get_data_file_path(self.list_data_file)# 初始化数据frame = pd.DataFrame(data)if not self.data_file_exist:# 第一次写入带上列表头,原文件清空frame.columns = colsframe.to_csv(file_path, encoding=self.encoding, index=None)self.data_file_exist = True # 写入后更新数据文件状态else:# 后续不写如列表头,追加写入frame.to_csv(file_path, mode="a", encoding=self.encoding, index=None, header=0)self.logger.debug("文件保留实现")
运行后果
运行截图
采集365淘房二手房信息
采集页面范畴: 第[1]页至第[5]页
100%|██████████| 5/5 [00:10<00:00, 2.12s/it]
python 版本 3.9.10
过程已完结,退出代码0
后果文件
资源链接
https://download.csdn.net/dow...
菜鸟实战,继续学习!