程序的结构设计步骤1:提交商品搜索请求,循环获取页面步骤2:对于每

简介: 程序的结构设计步骤1:提交商品搜索请求,循环获取页面步骤2:对于每个页面提取网址、租金、小区名称、详细地理位置、户型、房间面积信息步骤3:将获取到的数据保存到电

咱们可以写个小爬虫,爬取过年前后的租房信息,分析对比前后数据便可得出结论,同时我们还可以利用爬取到的数据分析各个小区或者地铁站附近的租房信息,看看哪些地方相对房租较低,有没有漏网之鱼等等。

3、目标站点分析在小白学爬虫系列(4)-如何使用chrome浏览器分析想要爬取的目标网站中我们已经对目标网址进行了分析,分析的结果是我们可以用requests库对该网站进行直接爬取,现在需要补充的是对其url的分析,如下图所示在网站租房时可选择的条件有很多,如url中的“j2”代表租金范围为800-1200,“p1”是第1页,“kw雨花台”代表搜索关键字为雨花台,其他选项这里这里并未选择。

程序的结构设计步骤1:提交商品搜索请求,循环获取页面步骤2:对于每个页面提取网址、租金、小区名称、详细地理位置、户型、房间面积信息步骤3:将获取到的数据保存到电脑中基于以上步骤下面给出各步骤的代码:main()函数:主要作用配置url,循环获取页面,生成DataFrame类型变量来保存数据def main():# 主函数,调用get_page_html和parse_page完成爬取任务# 获取的关键字,这里是地点名 kw = '雨花台' # 给出爬取深度,这里爬前三页 page_num = range(1, 4) # 生成DataFrame类型变量,因为该类型数据可以直接保存为CSV格式文件 info_lists = pd.DataFrame({}) base = "http://nj.rent.house365.com/district/dl_j2-p{pagenum}-kw{kw}.html" for i in page_num: # 得到完整url url = base.format(pagenum=i, kw=kw) if url: # 获取HTML html = get_page_html(url) if html: # 获取租房信息的列表格式数据 info_list = parse_page(html=html) if info_list: # 将得到的数据添加到DataFrame类型变量中 info_lists = info_lists.append(info_list, ignore_index=True) print(info_lists) # 将获取到的数据保存起来 se_infos(info_lists, kw)get_page_html函数:主要作用:获取目标网站的HTMLdef get_page_html(url):try: r = requests.get(url) r.raise_for_status() # 该语句实在获取到的内容出现乱码时才加入到程序中的,这里没有出现乱码,反而加入后出现了乱码所以注释掉了 # r.encoding = r.apparent_encoding return r.text except Exception as e: print("爬取失败,错误为:" + str(e) + "/n出错的url:" + url) return Noneparse_page函数:主要作用:精确解析到的HTML,获得网址、租金、小区名称、详细地理位置、户型、房间面积信息def parse_page(html):# 分析页面内容的函数 # 由于每个网页有多条房屋出租的信息,每条信息用字典保存,整个网页信息用列表保存,所以下面先定义一个空字典和空列表 info_dict = {} info_list = [] try: # 首先把找到记录每条租房信息的HTML标签,findall函数可以以列表形式返回匹配到的所有内容,如何不成功返回None,中间用到了.*?非贪婪匹配模式 texts = re.findall(r'''

''', text, re.S) # if语句判断是否匹配成功,若未成功利用continue关键字跳过for循环内的其他语句,进入下一个循环中。

if url: info_dict['URL'] = url.group(1) else: continue # 注意[]和*号的用法,同时注意在.前加了一个转义符 price = re.search(r'([\d\.]*)', text, re.S) # print(price.groups()) if price: info_dict['租金'] = price.group(1) else: continue # [\u4e00-\u9fa5]*?之所以不写为.*?,是因为写为后者会匹配到其他内容,大家可尝试一下;(\d*).*?住房面积这里后面是面积单位解析出来是乱码,所以就用小括号内贪婪匹配,后面非贪婪匹配这样就可以只得到数字;\s*(.*?)记录户型的代码中有大量空格、制表符、换行符等空白字符,可以用\s*对其进行匹配; way_of_rents = re.search( r'''

''', text, re.S) # if语句判断是否匹配成功,若未成功利用continue关键字跳过for循环内的其他语句,进入下一个循环中。

if url: info_dict['URL'] = url.group(1) else: continue # 注意[]和*号的用法,同时注意在.前加了一个转义符 price = re.search(r'([\d\.]*)', text, re.S) # print(price.groups()) if price: info_dict['租金'] = price.group(1) else: continue # [\u4e00-\u9fa5]*?之所以不写为.*?,是因为写为后者会匹配到其他内容,大家可尝试一下;(\d*).*?住房面积这里后面是面积单位解析出来是乱码,所以就用小括号内贪婪匹配,后面非贪婪匹配这样就可以只得到数字;\s*(.*?)记录户型的代码中有大量空格、制表符、换行符等空白字符,可以用\s*对其进行匹配; way_of_rents = re.search( r'''