爬虫目标
爬取房天下指定地区的所在小区
、小区链接
、小区地址
、户型
、总价
、单价
等
使用的模块:requests
、lxml
、re
、json
爬虫结构
以下结构可以很好的进行多线程
或者协程
的扩展。
参数类
class Tool(): # 需要爬取的城市 city = "成都" # 爬取页数 page = 2 # 城市列表 获取所以城市的URL的方法在文末,这里只截取了一部分 city_url = {'成都': 'https://cd.esf.fang.com', '郴州': 'https://chenzhou.esf.fang.com'}
解析网页获取信息
# 获取房子的信息 def get_fang_infor(url): # 信息 fang_list = list() # 获取网页信息 r = requests.get(url=url) r.encoding = r.apparent_encoding # 这里的错误处理是在爬取第二页之后,URL需要获取一个参数 try: href = re.search(r'//location.href="(.*?)";',r.text).group(1) except AttributeError: pass else: r = requests.get(url=href) r.encoding = r.apparent_encoding # 解析网页 html = etree.HTML(r.text) dl_html = html.xpath('//div[@class="shop_list shop_list_4"]/dl') for dl in dl_html: # 小区名称 house = dl.xpath('.//p[@class="add_shop"]/a/@title') if house == list(): continue # 小区链接 house_url = url + dl.xpath('.//p[@class="add_shop"]/a/@href')[0] # 小区地址 house_add = dl.xpath('.//p[@class="add_shop"]/span/text()') # 户型等 去除前后符号 house_types = [a.strip() for a in dl.xpath('.//p[@class="tel_shop"]/text()')] # 总价 all_price = dl.xpath('.//dd[@class="price_right"]/span[1]/b/text()')[0] + dl.xpath('.//dd[@class="price_right"]/span/text()')[0] # 单价 price = dl.xpath('.//dd[@class="price_right"]/span[2]/text()') # 组合数据 infor = { # 小区名称 "house":house[0], # 小区地址 "house_add":house_add[0], # 小区链接 "house_url":house_url, # 户型 "house_type":house_types[0], # 大小 "house_size":house_types[1][:-2], # 楼层 "floor":house_types[2], # 方向 "direction":house_types[3], # 修建日期 "xj_date" :house_types[4], # 总价 "all_price":all_price, # 单价 "price":price[0][:-3] } fang_list.append(infor) return fang_list
获取所有链接
返回一个所有链接的list()
# 获取页数连接 def get_pages(): url = Tool.city_url[Tool.city] pages_list = [url] for num in range(2,Tool.page + 1): pages_list.append(url + "/house/i3{}/".format(num)) return pages_list
主程序入口
if __name__ == '__main__': pages_list = get_pages() print(pages_list) # 打印链接列表 for page in pages_list: print(page) # 当前爬取的链接 fang_list = get_fang_infor(page) print(fang_list)
获取所有城市的URL
def get_city_url(): url = "https://esf.fang.com/esfcities.aspx" r = requests.get(url=url,timeout=5) r.encoding = r.apparent_encoding # 匹配 城市 & url city_url_lists = json.loads(re.search(r"var cityJson=(.*?),];",r.text).group(1)+ "]") # 重新组合格式 city_url_dic = dict() #{,...} for a in city_url_lists: city_url_dic = {**city_url_dic , **{a.get("name"):"https:" + a.get("url")}} print(city_url_dic)
版权声明:《 【爬虫项目】房天下二手房爬取 》为明非原创文章,转载请注明出处!
最后编辑:2020-3-13 15:03:58