美文网首页
麻瓜编程·python实战·1-3作业:爬取租房信息

麻瓜编程·python实战·1-3作业:爬取租房信息

作者: bbjoe | 来源:发表于2016-08-09 17:25 被阅读0次

    运行结果:

    成功运行

    我的代码:

    from bs4 import BeautifulSoup
    import requests
    import time
    
    # 建一个列表来收纳从聚合页面爬取到的所有信息页面
    house_url = [] 
    # urls是所有聚合页面的集合
    urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(str(i)) for i in range(1,14)]
    
    # 分析租房信息页面
    def url_analysis(url):
        time.sleep(2)
        # 请求租房页面,并解析页面信息
        web_data = requests.get(url)
        soup = BeautifulSoup(web_data.text, 'lxml')
        # 提取名称(titles)、地址(house_addrs)、价格(house_prices)、第一张房源图片(house_imgs)、
        # 房东图片(owner_imgs)、房东性别(owner_sexes)、房东姓名(owner_names)
        titles = soup.select('div.con_l > div.pho_info > h4 > em')
        house_addrs = soup.select('div.con_l > div.pho_info > p > span')
        house_prices = soup.select('div.day_l > span')
        house_imgs = soup.select('img[id="curBigImage"]')
        owner_imgs = soup.select('div.member_pic > a > img')
        owner_sexes = soup.select('div.member_pic > div')
        owner_names = soup.select('div.w_240 > h6 > a')
    
        for title, add, price, img, pic, sex, name in \
            zip(titles, house_addrs, house_prices, house_imgs, owner_imgs, owner_sexes, owner_names):
            
            # 这里要注意考虑性别没有填写的情况
            if sex.get('class')[0] == 'member_ico':
                sex = '男'
            elif sex.get('class')[0] == 'member_ico1':
                sex = '女'
            else:
                sex = '保密'
            # 把所有获取的信息汇总成一个词典
            data = {
                'title' : title.get_text(),
                'add' : add.get_text().rstrip(),
                'price' : '¥ '+price.get_text(),
                'img' : img.get('src'),
                'pic' : pic.get('src'),
                'sex' : sex,
                'name' : name.get_text()
            }
            print(data)
    
    # 从聚合页面获取租房页面地址
    def url_get(url):
        time.sleep(3)
        web_data = requests.get(url)
        soup = BeautifulSoup(web_data.text, 'lxml')
        house = soup.select('ul.pic_list.clearfix > li > a')
        for urls in house:
            urls = urls.get('href')
            house_url.append(urls)
        return house_url
    
    #起点
    for single_url in urls:
        url_get(single_url)
    
    print('总共爬取到',len(house_url),'条信息')
    
    for each_url in house_url:
        print('这是第',house_url.index(each_url) + 1,'条租房信息')
        url_analysis(each_url)
    
    

    我的感想:

    • 用时接近3个小时(⊙o⊙)…
    • 真的很怕运行到第100多条的时候报错(多谢群友提醒性别的if条件要分3个)
    • 每个soup.select都是写一个打印一个(如果返回的是多个元素的打印 len() 比较实用),提取不出来就要改 CSS.selector
    • soup.select返回的都是列表,但其中的元素都是 bs4.tag
    • 貌似以前看到过,用try、except来避免出错而中断运行
    • 这边还有群友的一个关于性别的处理方式,用字典查询来替换if/else,另外也没有用for循环来迭代,而是直接切片(里面只有一个元素)


      群友用的性别方法

    一个悬而未决的问题:

    为什么 sex.get() 返回的是一个列表 而 pic.get() 返回的是一个字符串呢??

    悬而未决的问题

    相关文章

      网友评论

          本文标题:麻瓜编程·python实战·1-3作业:爬取租房信息

          本文链接:https://www.haomeiwen.com/subject/qrsdsttx.html