Python实战计划爬虫作业1_3:|Python实战计划爬虫作业1_3: 爬租房信息

作业要求 Python实战计划爬虫作业1_3:|Python实战计划爬虫作业1_3: 爬租房信息
文章图片
作业要求 Python实战计划爬虫作业1_3:|Python实战计划爬虫作业1_3: 爬租房信息
文章图片
作业要求 我的代码

#-*- coding:utf-8 -*- #本次作业完成完成爬取300个租房信息 #爬取网站为:http://bj.xiaozhu.com/search-duanzufang-p1-0/ #需要打开每一个租房图片的连接,打开新页面,在新页面获取租房信息from bs4 import BeautifulSoup import requests import timedef _getSoup(url, headers): webSite = requests.get(url, headers) return BeautifulSoup(webSite.text, 'lxml') #注意第一个参数.textdef getProductUrl(url, headers): ''' :param url: 搜索页的URL :param headers: 默认为本机的hearders, :return: list, 每一个元素为商品页的URL ''' soup = _getSoup(url, headers) productsTemp = soup.select('a.resule_img_a') #获取搜索页中,房屋的链接位置 products = [str(pro.get('href')) for pro in productsTemp] #获取链接return productsdef getAttribute(url, headers): ''' :param url: 商品页的URL :param headers: 用户的headers :return: 一个包含商品信息的dict ''' time.sleep(2) soup = _getSoup(url, headers) title = soup.select('div.pho_info > h4 > em') address = soup.select('div.pho_info > p > span') image = soup.select('#curBigImage') price = soup.select('div.day_l > span') rentingType = soup.select('#introduce > li.border_none > h6') roomInfo = soup.select('#introduce > li.border_none > p') bedNum = soup.select('#introduce > li:nth-of-type(3) > h6') bedInfo = soup.select('#introduce > li:nth-of-type(3) > p') lorderName = soup.select('a.lorder_name') lorderGender = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div') lorderCredit = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > p')genderLabel = lorderGender[0].get('class')[0] #.get返回的是一个list if genderLabel == 'member_ico': gender = 'male' elif genderLabel == 'member_ico1': gender = 'female' else: gender = 'unknown'creditLabel = lorderCredit[0].find_all('span', class_ = 'zm_ico') if len(creditLabel) != 0: credit = creditLabel[0].get_text() else: credit = 'unknown'attribute = { 'title' : title[0].get_text(), 'address' : address[0].get_text().strip(), #将地址后面的空格和换行符号去除 'image' : image[0].get('src'), 'price' : int(price[0].get_text()), #日租金应该是整型 'rentingType' : rentingType[0].get_text(), #租房类型:单间?整套?... 'area' : float(list(roomInfo[0].stripped_strings)[0].split(':')[1][:-2]), #房屋面积 'apartment' : list(roomInfo[0].stripped_strings)[1][5:], #房屋户型 'bedNum' : int(bedNum[0].get_text()[1:][:-1]), #床的数量,整型 'bedInfo' : list(bedInfo[0].stripped_strings), #床的信息 'lorderName' : lorderName[0].get_text(), #用户姓名 'lorderGender': gender, #用户性别 'lorderCredit' : credit #用户的芝麻信用值}return attributedef main(): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/51.0.2704.106 Safari/537.36 Name' } pageNum = 1# 开始的搜索页的页码 roomNum = 0# 已经完成的房间数 while roomNum <= 300:print('page', str(pageNum))# 当前搜索页的页码 url = 'http://bj.xiaozhu.com/search-duanzufang-p{}/'.format(str(pageNum))# 当前搜索页的URL products = getProductUrl(url, headers=headers)# 获取当前搜索页的房源链接list print(products) roomsCurrentPage = [getAttribute(url, headers) for url in products] # 将房源信息写入rooms.txt中 with open('/Users/xyh/Documents/python/python3/Week1/1_3/rooms.txt', 'a') as text: for room in roomsCurrentPage: text.write(str(room)) text.write('\n') roomNum += 1pageNum += 1print('已搞定!')if __name__ == '__main__': main()

总结 本次作业就是BeautifulSoup的练习,模式就是一个套路。重点难点在于,页面上每一个特征的定位,只要能够唯一地确定所需特征的位置,就能够解决问题。
【Python实战计划爬虫作业1_3:|Python实战计划爬虫作业1_3: 爬租房信息】但是感觉自己在组织设计每一个函数的功能时,不是很有感觉及想法。看过一些书,说函数最好就是一个函数实现一个功能,函数中的状态不要太多。但是自己实现时,不能很好地实现这些目标。希望老师能够指点一二。

    推荐阅读