python3爬取“小猪短租-北京”租房信息

爬虫思路分析:

1. 观察小猪短租(北京)的网页

首页:http://www.xiaozhu.com/?utm_source=baidu&utm_medium=cpc&utm_term=PC%E6%A0%87%E9%A2%98&utm_content=pinzhuan&utm_campaign=BDPZ

选择“北京”,然后点“搜索小猪”,获取北京市的首页url:http://bj.xiaozhu.com/

观察右侧详情,页面最下面有分页,点击第2、第3页观察url的变化

http://bj.xiaozhu.com/search-duanzufang-p2-0/

http://bj.xiaozhu.com/search-duanzufang-p3-0/

验证首页是否可以写作:http://bj.xiaozhu.com/search-duanzufang-p0-0/(答案是ok的,大部分分页行的网站首页都是可以与其他分页统一化的)

因此,分页的URL可以这么构造:http://bj.xiaozhu.com/search-duanzufang-p{}-0/.format(number),其中number是几就是第几页

2. 观察右侧的信息,发现每个房源的信息不全,需要手动点击进去才能看到详情

因此需要获取每个房源的详情页面的URL

3. 观察某一房源的详细信息,这里我们提取“标题、地址、价格、房东名字、性别”等

源代码:

import requests
from bs4 import BeautifulSoup as bs
 4 
headers = {
    'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}

"""获取每一个房源的网址,参数是分页url"""
def get_link(url):
    html_data = requests.get(url, headers = headers)
    soup = bs(html_data.text, 'lxml')#bs4推荐使用的的解析库
    #print(soup.prettify())   #标准化输出url中的源代码(有可能跟网页查看中的不一致,网页中有可能标签书写不规范)以此为基础抓取,如果抓取失败,用此命令查看源代码
    links = soup.select('#page_list > ul > li > a')#注意循环点!!!直接粘贴过来的是“#page_list > ul > li:nth-child(1) > a > img”,需要去掉:nth-child(1),注意每个标签前后有空格
    #print(links)
    for link in links:
        link = link.get('href')
        #print(link)
        get_info(link)

"""

"""#获取每一个房源的详细信息,参数url是每个房源的网址"""
def get_info(url):
    html_data = requests.get(url, headers = headers)
    soup = bs(html_data.text, 'lxml')#bs4推荐使用的的解析库
    # print(soup.prettify())   #标准化输出url中的源代码(有可能跟网页查看中的不一致,网页中有可能标签书写不规范)以此为基础抓取,如果抓取失败,用此命令查看源代码
    title = soup.select('div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em')[0].string
    # 用网页copy过来的全部是“body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em”,但是使用这个爬不出来数据(我也不知道why),把body去掉或者用下面最简短的方式(只使用最近的且唯一的div)
    # title = soup.select('div.pho_info > h4 > em ')
    # 查询结果title格式是一维列表,需要继续提取列表元素(一般就是[0]),列表元素是前后有标签需要继续提取标签内容,使用get_text()或者string

    address = soup.select('div.wrap.clearfix.con_bg > div.con_l > div.pho_info > p > span')[0].string.strip()
    price = soup.select('#pricePart > div.day_l > span')[0].string.strip()  # div中的id=pricePart是唯一性的,因此不用写前面的div
    name = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')[0].string.strip()
    img = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')[0].get('src').strip()  # 获取标签的属性值
    sex = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')[0].get('class')[0].strip()  # 获取标签的属性值
    #将详细数据整理成字典格式
    data = {
        '标题':title,
        '地址':address,
        '价格':price,
        '房东姓名':name,
        '房东性别':sex,
        '房东头像':img
    }
    print(data)

"""


"""#程序主入口"""
if __name__=='__main__':
    for number in range(0,1):
        url = 'http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number)   #构造分页url(不是房源详情的url)
        get_link(url)

猜你喜欢

转载自blog.csdn.net/qq_40925239/article/details/84145184