1. 程式人生 > >python3爬取“小豬短租-北京”租房資訊

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)