Py学习  »  Python

Python玩爬虫,爬取安居客租房数据

蚂蚁学Python • 1 年前 • 344 次点击  

前言

最近我打算在西安市长安区租个房子,于是打开安居客官网进行浏览,点击了航天一小区域结果搜索出了一堆房源信息,为了综合比较找出更加适合我的选择,我敲了个代码将租赁数据批量爬取了下来。对于如何翻页爬取数据这个难题,我苦思冥想了一早上,突然想起蚂蚁老师的《零基础学Python简单爬虫》中教过我如何翻页爬取他的博客。我赶快去网易云课堂上回顾了一下知识点,很快就解决了难题!


1.导入python库

import requests
import parsel
import csv

2.编写请求头

首先打开安居客网站的主页,然后点击选择西安市长安区租房,再点击我感兴趣的航天一小区域。按F12进入开发者模式,用开发者工具搜索“航天城 航天一小一中 航天城二期主卧 神州六路 领包入住”,搜索出数据包后获取cookie、referer和user-agent,编写请求头可以在请求数据时防止被反爬。

headers = {
        "cookie":"SECKEY_ABVK=TgvSiy4m0B6i5M/GnutrL4MCQAxmauku4aF+LqjfcV8%3D; BMAP_SECKEY=E59uL36Kjw3iB4ZVJ1TzktcDRrwsPacuhFPlFvVySikxHflBOrAIKvnT_TWYzT5URefDsASa2VWCiaIX9be4V3Lnrh_Nos62tZXNwvoSq4VTzasiJ1egkq-odC5S4rdqxoaD8o2T1GJGf2QcMzz9qmHUmR4U12vFef9JGFoyWvQ; aQQ_ajkguid=480A83B5-6C24-CA9A-70C4-SX0705130713; isp=true; id58=e87rkGDik4M4TQ8rCOH9Ag==; 58tj_uuid=646ff6e2-1cdd-40ea-a598-19787fe938e3; als=0; _gid=GA1.2.1430887075.1652243486; _ga=GA1.2.365181464.1652243486; ajk-appVersion=; ctid=31; fzq_h=66195fd3068b1f875345633f8c10fa4a_1652243654423_6c16e54157d8446097cc7e59ed9481e0_2102187861; cmctid=483; wmda_visited_projects=%3B6289197098934; wmda_new_uuid=1; wmda_uuid=82b87a341ccf0eac3db311b6b0810093; sessid=89F34445-4127-728C-6A4A-B58CD71D8F23; twe=2; init_refer=https%253A%252F%252Fcn.bing.com%252F; new_uv=5; lps=https%3A%2F%2Fxa.zu.anjuke.com%2F%3Ffrom%3Dnavigation%7Chttps%3A%2F%2Fxa.anjuke.com%2F; wmda_session_id_6289197098934=1652272846315-4adb7df7-8ce6-9b96; obtain_by=2; new_session=0; xxzl_cid=ef3f8b7b219341ee8f8b5d044cccd51f; xzuid=eb4ac9b2-89df-4969-9661-9e99a843bd43",
        "referer":"https://xa.zu.anjuke.com/fangyuan/changanb/",
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39",
}

3.创建csv文件

创建好CSV文件后,我们可以用下面的方式添加表头

f = open('安居客租房数据.csv',mode='a',encoding='utf-8',newline='')
csv_writer = csv.DictWriter(f,fieldnames=['标题','房子类型','楼层','价格','小区','地址','详情'])
csv_writer.writeheader()  #写入表头    

4.解析数据、翻页爬取

大家可以用选择工具,点击需要爬取的数据,找到数据的源代码,然后右键点击“复制selector”,这样不用非常熟悉CSS语法也可以轻松的解析数据

for page in range(1,3):     #数据只有两页,用for循环进行翻页爬取
        url = f'https://xa.zu.anjuke.com/fangyuan/changanb-q-htyxxa/p{page}/'
        r = requests.get(url = url,headers = headers)
        selector = parsel.Selector(r.text)
        zu_infos = selector.css('.zu-itemmod')     #用CSS选择器,提取每页所有房子数据的信息
        for info in zu_infos:
                try:
                        title = info.css('.strongbox::text').get()  #解析出标题

                        house_num = info.css('div.zu-info > p.details-item.tag > b::text').getall()  #提取出所有b标签的文本数据,即户型数值
                        p = info.css('div.zu-info > p::text').getall()  #提取出所有p标签的文本数据,变量p是个列表
                        p = p[1:5]    #去掉无用信息
                        height = p[-1].strip(' ')  #提取出房子所在的楼层
                        house_unit = p[:3]    #提取户型单位
                        house_type = [house_num[i] + house_unit[i]  for i in range(len(house_num))]   #将户型数字与户型单位进行字符串拼接
                        house_type = ' '.join(house_type)   #列表中各个字符串元素用空格连接

                        price = info.css('div.zu-side > p > strong > b::text').get() + '元/月'  #解析出房源的价格

                        community = info.css('div.zu-info > address > a::text').get()     #提取小区名称
                        address = info.css('div.zu-info > address::text').getall()[1].strip('\xa0\xa0\n ')   #提取房子所在地址

                        detail = info.css('div.zu-info > p.details-item.bot-tag > span::text').getall()   #提取:租赁方式、朝向、有无电梯、附近有哪条地铁
                        detail = ' '.join(detail)  #列表中各个字符串元素用空格连接
                        print(title,house_type,height,price,community,address,detail)
                        dit = {
                                '标题': title,
                                '房子类型':house_type,
                                '楼层':height,
                                '价格': price,
                                '小区': community,
                                '地址': address,
                                '详情': detail,
                        }
                        csv_writer.writerow(dit)  #写入csv
                except:
                        pass

得到所有数据后有时候Excel直接打开会乱码,大家可以先用记事本打开,然后另存为时编码格式改为“ANSI”编码,最后再用Excel打开就好了。现在我可以在Excel里慢慢查看这些房源是否满足自己的要求,希望我能安全、省心,用最低的交易成本租到满意的房子,希望大家也能有所收获!


最后,推荐蚂蚁老师的视频课程,购买课程提供答疑服务、付费群聊



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/134161
 
344 次点击