1. 引言
爬取租房信息,具体要求如下
2. 分析
- 网页地址: http://bj.xiaozhu.com/search-duanzufang-p2-0/, 页数增加时
p
后的数字随之增加 - 每个导航页面有多个详情页的link
- 男女房东性别判断, 通过有无
member_girl_ico
来区分 - 从详情页中抓取的第一张房屋图片发现打开无效, 所以直接从导航页中抓取第一张图片
3. 开工
# vim spider_xiaozhu.py //新建文件
#!/usr/bin/env python3
# -*- conding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
# 定义获取详情页租房信息函数
def get_data_member(sub_url, preview_img):
sub_data = requests.get(sub_url)
sub_soup = BeautifulSoup(sub_data.text, 'html5lib')
house_titles = sub_soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em')
house_addrs = sub_soup.select("body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > p")
# house_imgs = sub_soup.select('body > div > div > #detailImageBox > div.pho_show_l > div > div:nth-of-type(2) > img')
house_prices = sub_soup.select('body > div > div > #floatRightBox > #pricePart > div.day_l > span')
landlord_jpgs = sub_soup.select('body > div > div > #floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
landlord_names = sub_soup.select('body > div > div > #floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
landlord_genders = sub_soup.select('body > div > div > #floatRightBox > div.js_box.clearfix > div.w_240 > h6 > span')
# for house_title, house_addr, house_img, house_price, landlord_jpg, landlord_name, landlord_gender in zip(house_titles, house_ad
for house_title, house_addr, house_price, landlord_jpg, landlord_name, landlord_gender in zip(
house_titles, house_addrs, house_prices, landlord_jpgs, landlord_names, landlord_genders):
data = {
'info_web': sub_url,
'house_title': house_title.get_text(),
'house_addr': house_addr.get('title'),
'house_img': preview_img,
'house_price': house_price.get_text(),
'landlord_jpg': landlord_jpg.get('src'),
'landlord_name': landlord_name.get_text(),
# 判断性别,有member_girl_ico属性即为女,否则为男
'landlord_gender': ('MM' if (landlord_gender.get('class')[0] == 'member_girl_ico') else 'FM'),
}
# 打印下,起码知道有数据输出,而不是干等
print(data)
# 返回列表数据,方便和下个详情页信息组合
return data
'''
# 定义获取全部详情页链接函数,也就是先取得全部的详情页链接
def get_url_list(url):
url_all = []
for ur in urls:
wb_data = requests.get(ur)
soup = BeautifulSoup(wb_data.text, 'html5lib')
url_total = soup.find_all('a', class_="resule_img_a")
for u in url_total:
sub_url = u.get('href')
url_all.append(sub_url)
return url_all
'''
# 定义获取详情页链接函数
def get_data_list(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'html5lib')
url_total = soup.select('#page_list > ul > li > a')
# url_total = soup.find_all('a', class_="resule_img_a")
# 定义一个空列表,存放一个导航页中所有详情页的link
d_list = []
for u in url_total:
link = u.get('href')
# 获取图片, 以便传入get_data_member函数
image = u.find('img').get('lazy_src')
datas = get_data_member(link, image)
d_list.append(datas)
# print('len of datas', len(datas), 'type of datas', type(datas), 'len of L', len(L), 'type of L', type(L))
return d_list
# 定义要爬取多少页的信息,由range中的最后一个数字控制,由于这里没有判断页面是否存在,所以数字就还要填太大
urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(i) for i in range(1, 14)]
'''
url_list = get_url_list(urls)
'''
# 定义一个空列表用来存储详情页中的信息,存入数据后这下列表就可以被引用了
data_list = []
# 循环获取导航页中详情页的link
for url_member in urls:
# 获取详情页信息,因为get_data_list返回的是一个列表,可以相加存入列表data_list
data_list += get_data_list(url_member)
# 看下获取到了多少条数据
print(len(data_list))
运行结果如下:
# python3 spider_xiaozhu.py // 运行文件, 部分结果如下
{'house_title': '望京华彩十四号线精美豪华大一居', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,39,2965,1800,1200,f17d1a3e.jpg', 'landlord_gender': 'FM', 'landlord_name': '想要', 'house_price': '395', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'house_addr': '北京市朝阳区望京利泽西园', 'info_web': 'http://bj.xiaozhu.com/fangzi/3213812130.html'}
{'house_title': '积水潭地铁近后海北师大西直门温馨一居整租', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,64,3967,1800,1200,fb028f16.jpg', 'landlord_gender': 'MM', 'landlord_name': '天天Tinny', 'house_price': '298', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,36,1268,375,376,560d399f.jpg', 'house_addr': '北京市西城区志强南园9号楼', 'info_web': 'http://bj.xiaozhu.com/fangzi/2704933663.html'}
{'house_title': '国贸CBD 百子湾 1号线四惠地铁站8分钟', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,18,2496,1800,1200,4bc1de28.jpg', 'landlord_gender': 'MM', 'landlord_name': '不勤', 'house_price': '425', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,10,2403,363,364,d729c792.jpg', 'house_addr': '北京市朝阳区朝阳路八里庄十里堡', 'info_web': 'http://bj.xiaozhu.com/fangzi/2952536363.html'}
{'house_title': '独立卫浴邻798、望京、酒仙桥更多优惠房源。', 'house_img': 'http://image.xiaozhustatic1.com/12/2,0,71,458,1800,1200,a9c5ea82.jpg', 'landlord_gender': 'FM', 'landlord_name': '暖阳洋Sunny', 'house_price': '268', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/2,0,86,206,375,375,d46c51ef.jpg', 'house_addr': '北京市朝阳区彩虹路', 'info_web': 'http://bj.xiaozhu.com/fangzi/860516339.html'}
{'house_title': '望京商圈,毗邻地铁5分钟,漫威主题大两居', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,66,803,1800,1200,38a4c686.jpg', 'landlord_gender': 'FM', 'landlord_name': '想要', 'house_price': '395', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'house_addr': '北京市朝阳区广顺北大街利泽西园', 'info_web': 'http://bj.xiaozhu.com/fangzi/2896441162.html'}
{'house_title': '宋家庄0距离地铁5、10号线 ,拎包入住', 'house_img': 'http://image.xiaozhustatic1.com/12/5,0,94,2458,1800,1200,5648e989.jpg', 'landlord_gender': 'MM', 'landlord_name': 'sara房', 'house_price': '308', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,91,1393,375,376,e2190513.jpg', 'house_addr': '北京市丰台区宋家庄万科红', 'info_web': 'http://bj.xiaozhu.com/fangzi/2652262063.html'}
{'house_title': '天坛前门地铁5,10号线大型交通枢纽暖心公寓', 'house_img': 'http://image.xiaozhustatic1.com/12/3,0,44,3940,1800,1200,2ff6a063.jpg', 'landlord_gender': 'MM', 'landlord_name': '暖心大姐', 'house_price': '358', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/6,0,42,4085,260,260,4faad403.jpg', 'house_addr': '北京市丰台区万科红', 'info_web': 'http://bj.xiaozhu.com/fangzi/1603871035.html'}
{'house_title': '国贸双井10号线苹果酒店式公寓', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,25,3184,1800,1200,4b993d38.jpg', 'landlord_gender': 'MM', 'landlord_name': '阳光艳艳', 'house_price': '398', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,59,2841,363,363,8b6cf3d7.jpg', 'house_addr': '北京市朝阳区苹果社区北区', 'info_web': 'http://bj.xiaozhu.com/fangzi/2803985763.html'}
{'house_title': '北三环健德门10号线阳光充沛整租公寓', 'house_img': 'http://image.xiaozhustatic1.com/12/6,0,68,2767,1800,1200,a419ba8c.jpg', 'landlord_gender': 'FM', 'landlord_name': '一块萌萌的五花肉', 'house_price': '338', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/6,0,13,3403,375,376,da442c27.jpg', 'house_addr': '北京市朝阳区祈家豁子8号 健翔大厦(健翔公寓)', 'info_web': 'http://bj.xiaozhu.com/fangzi/3063899729.html'}
{'house_title': '近邻北京西站 南站 307医院舒适大两居室', 'house_img': 'http://image.xiaozhustatic1.com/12/2,0,27,3758,1800,1200,32cec838.jpg', 'landlord_gender': 'FM', 'landlord_name': '小房东东', 'house_price': '428', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/3,0,32,1155,260,260,7cd22180.jpg', 'house_addr': '北京市丰台区丰台泥洼路', 'info_web': 'http://bj.xiaozhu.com/fangzi/1185941235.html'}
{'house_title': '南锣鼓巷、故宫、簋街、雍和宫清新双人房', 'house_img': 'http://image.xiaozhustatic1.com/12/1,0,77,2314,825,550,8cfcf835.jpg', 'landlord_gender': 'MM', 'landlord_name': '小肖肖', 'house_price': '218', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,55,1517,260,260,ea96ce11.jpg', 'house_addr': '北京市东城区南锣鼓巷', 'info_web': 'http://bj.xiaozhu.com/fangzi/357151300.html'}
{'house_title': '东三环潘家园十里河地铁10-14号线临近国贸', 'house_img': 'http://image.xiaozhustatic1.com/12/3,0,99,2623,1800,1200,a7ad6184.jpg', 'landlord_gender': 'MM', 'landlord_name': '兰絮的家', 'house_price': '328', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/4,0,91,8102,329,329,2583e316.jpg', 'house_addr': '北京市朝阳区十里河桥西宏善家园', 'info_web': 'http://bj.xiaozhu.com/fangzi/1370027235.html'}
{'house_title': '地铁6号线常营单间温馨公寓爱猪我家', 'house_img': 'http://image.xiaozhustatic1.com/12/4,0,13,6807,1800,1200,4f508533.jpg', 'landlord_gender': 'MM', 'landlord_name': '爱猪我家萍姐', 'house_price': '197', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/3,0,95,5809,359,359,9c0c2802.jpg', 'house_addr': '北京市朝阳区常营富力阳光美园', 'info_web': 'http://bj.xiaozhu.com/fangzi/1831963835.html'}
{'house_title': '国贸CBD四惠十里堡华堂商场 现代田园四人房', 'house_img': 'http://image.xiaozhustatic1.com/12/5,0,64,2493,1800,1200,49dbbf30.jpg', 'landlord_gender': 'MM', 'landlord_name': '不勤', 'house_price': '556', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,10,2403,363,364,d729c792.jpg', 'house_addr': '北京市朝阳区八里庄十里堡', 'info_web': 'http://bj.xiaozhu.com/fangzi/2627680763.html'}
{'house_title': '地铁5号线10号线宋家庄大型交通枢纽时尚公寓', 'house_img': 'http://image.xiaozhustatic1.com/12/3,0,85,5997,1800,1200,56cd3eea.jpg', 'landlord_gender': 'FM', 'landlord_name': 'simoe陈', 'house_price': '358', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/4,0,34,9060,260,260,463e7ce3.jpg', 'house_addr': '北京市丰台区万科红公寓', 'info_web': 'http://bj.xiaozhu.com/fangzi/1758721035.html'}
{'house_title': '双井、九龙山地铁附近首城国际三室一厅整租', 'house_img': 'http://image.xiaozhustatic1.com/12/5,0,24,1688,1800,1200,f90815a2.jpg', 'landlord_gender': 'MM', 'landlord_name': 'uujaa', 'house_price': '688', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/4,0,97,7907,320,320,708221d7.jpg', 'house_addr': '北京市朝阳区广渠路36号首城国际', 'info_web': 'http://bj.xiaozhu.com/fangzi/2538072663.html'}
{'house_title': '5号线/13号线立水桥地铁站蓝色小清新卧室', 'house_img': 'http://image.xiaozhustatic1.com/12/2,0,91,4059,1800,1200,17dfcdb2.jpg', 'landlord_gender': 'MM', 'landlord_name': 'evergday', 'house_price': '138', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/2,0,19,3529,260,260,20a5e73d.jpg', 'house_addr': '北京市昌平区陈家营西路2号院', 'info_web': 'http://bj.xiaozhu.com/fangzi/1195183455.html'}
{'house_title': '地铁5号13号立水桥南 浪漫温馨大床房', 'house_img': 'http://image.xiaozhustatic1.com/12/3,0,20,5777,1800,1200,2ca35fc1.jpg', 'landlord_gender': 'FM', 'landlord_name': '安安同学', 'house_price': '138', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/5,0,96,1679,414,414,dde31210.jpg', 'house_addr': '北京市朝阳区北苑北苑家园锦芳路', 'info_web': 'http://bj.xiaozhu.com/fangzi/1779817335.html'}
{'house_title': '紧邻10号线,三站奔中关,属于你的单人间', 'house_img': 'http://image.xiaozhustatic1.com/12/1,0,84,3843,825,550,55601bf5.jpg', 'landlord_gender': 'MM', 'landlord_name': 'Sharon_bj', 'house_price': '198', 'landlord_jpg': 'http://image.xiaozhustatic1.com/21/1,0,20,4699,260,260,a0108f46.jpg', 'house_addr': '北京市海淀区蓝靛厂中路', 'info_web': 'http://bj.xiaozhu.com/fangzi/508913100.html'}
4. 总结
-
format
方法使用起来极为方便 - 同一个需求数据可以从不同地方获取数据
- 可以获取详情页链接后立马就抓取详情页信息, 也可以获取全部详情页链接后再抓取信息
-
if
else
在不确定数据是否存在时可以很方便的使用