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

运行结果:

成功运行

我的代码:

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() 返回的是一个字符串呢??

悬而未决的问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容