爬取北京地区短租房信息

1.爬虫思路分析
(1)该博客将爬取小猪短租网北京地区短租房13页的信息。通过手动浏览以下为前四页的网址:
http://bj.xiaozhu.com/
http://bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
http://bj.xiaozhu.com/search-duanzufang-p4-0/
但是我们发现把第一页的网址改为 http://bj.xiaozhu.com/search-duanzufang-p1-0/ 仍能浏览,(毕竟学爬虫是要善于发现规律的),因此只需更改p后面的数字即可,以此来构造其13页的网址。
(2)本次爬虫在详细页中进行,因此要先爬取进入详细页面的网址的链接,进而爬取数据。
(3)需要爬取的信息有:标题(tittle),地址(address),价格(price),房东名称(name),房东性别(sex),和房东头像(img)的链接,如下图所示:
爬取北京地区短租房信息
2.爬虫代码分析

import requests
from bs4 import BeautifulSoup
import time                                                                                                               #导入相应的库文件
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}                                                                   #加入请求头
def judgment_sex(class_name):
    if class_name == ['member_icol']:
        return '女'
    else:
        return '男'                                                                                                       #定义判断用户性别的函数
def get_links(a):                                                                                                     #定义获取详细页的url的函数
    wb_data=requests.get(a,headers=headers)
    soup=BeautifulSoup(wb_data.text,'lxml')
    links=soup.select('#page_list > ul > li > a')
    for link in links:
        href=link.get('href')
        get_info(href)                                                                                           #循环出的url函数,一次调用get_info函数
def get_info(url):
    wb_data=requests.get(url,headers=headers)
    soup=BeautifulSoup(wb_data.text,'lxml')
    tittles=soup.select(' div.pho_info > h4 > em')
    addresses=soup.select('span.pr5')
    prices=soup.select('#pricePart > div.day_l > span')
    imgs=soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
    names=soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
    sexs=soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
    for tittle,address,price,img,name,sex in zip (tittles,addresses,prices,imgs,names,sexs):
        data={
            'tittle':tittle.get_text().strip(),
            'address':address.get_text().strip(),
            'price':price.get_text(),
            'img':img.get('src'),
            'name':name.get_text(),
            'sex':judgment_sex(sex.get('class'))
        }
        print(data)                                                                                            #获取信息并通过字典的形式打印出来
    
if __name__=='__main__':                                                                         #程序的主入口
    urls=['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(str(i)) for i in range(1,14)]#构造多页url
    for url in urls:
        get_links(url)                                                                                      #循环调用get_links()函数
        time.sleep(2)                                                                                      #睡眠2秒


程序运行的部分结果如下图所示
爬取北京地区短租房信息
本代码主要分析定义get_links函数那一块(16-22行)用于获取详细页的链接。
传入url 后,进行请求和解析。通过谷歌浏览器的‘检查’并‘Copy selector’,可以找到进入详细页的url 链接,但url并不是嵌套在标签中,而是在标签的属性当中。如下图所示:
爬取北京地区短租房信息
我们知道用 get_text() 可以获取标签中的文本信息,但标签中的属性信息需要通过get(‘attr’)的方式获取得到,由上图可知,url链接在href中,这时用get(‘href’)便可获取得到网页的url。
注意:字典中的sex调用了judgment_sex()函数,用于判断房东性别

def judgment_sex(class_name):
    if class_name == ['member_icol']:
        return '女'
    else:
        return '男'  

爬取北京地区短租房信息
通过谷歌浏览器的检查可以发现女房东的性别为**


而男房东的性别为
**,这是就可以通过class的属性来判断房东的性别。
再说:最后的代码time.sleep(2),意思是每循环一次,让程序暂停两秒,防止请求网页频繁过快而导致爬虫失败。
此篇为本人传作的第一篇代码,也是初来博客园,望各位多多关照

如有不理解可以留言啊