第一周/第三节项目练习: 爬取租房信息

1. 引言

爬取租房信息,具体要求如下

Paste_Image.png

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在不确定数据是否存在时可以很方便的使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容