Python爬蟲實戰(1)-爬取「房天下」租房信息(超詳細)

#前言html

先看爬到的信息:python

image

今天主要用到了兩個庫:RequestsBeautifulSoup。因此我先簡單的說一下這兩個庫的用法,提到的都是此文須要用到的。編程


#Requestsbash

requests是一個很實用的Python HTTP客戶端庫。ui

下面經過一個例子來了解一下:編碼

網址就用房天下的天津整租租房信息「http://zu.tj.fang.com/house/n31/」spa

import  requests
#請求頭
headers = {
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
           }
#Get請求-並傳遞headers
data=requests.get("http://zu.tj.fang.com/house/n31/",headers=headers)

print(data.text)

複製代碼

若是正常的話打印出來的就是以下,這裏只截取一部分:code

requests請求也會出現異常,這裏我就先不細說了,能夠去此網址查下具體用法:orm

http://docs.python-requests.org/zh_CN/latest/user/quickstart.htmlcdn

另外上面的代碼中的headers是如何來的呢?這裏給你們講一下:

請求頭的添加方法:

**1.**打開你要爬取的網址,在空白處右鍵-->檢查,而後點擊Network

image


#BeautifulSoup

Beautiful Soup 是用Python寫的一個HTML/XML的解析器,它能夠很好的處理不規範標記並生成剖析樹(parse tree)。 它提供簡單又經常使用的導航(navigating),搜索以及修改剖析樹的操做。它能夠大大節省你的編程時間。

安裝Beautiful Soup時注意一個問題, 個人python是3.6版本,安裝的是bs4

import  requests
import  bs4
#請求頭
headers = {
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
           }
#Get請求-並傳遞headers
data=requests.get("http://zu.tj.fang.com/house/n31/",headers=headers)
soup=bs4.BeautifulSoup(data.text,"html.parser")
print(soup.prettify())

複製代碼

輸出的是soup文檔,結果以下(截取了一部分):

image

這裏主要講一下Beautiful Soup中的**select()**方法, 經過某個屬性查找,而屬性能夠在網頁中複製到。

具體的能夠直接此網址學:

http://beautifulsoup.readthedocs.io/zh_CN/latest/

複製的步驟:

**1.**選中你要了解的內容,右鍵-->檢查,好比我對價格進行了「檢查」:

image

**2.**選擇copy selector

image

**3.**複製的放到select方法內,代碼以下:

headers = {
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
           }

data=requests.get("http://zu.tj.fang.com/house/n31/",headers=headers)
soup=bs4.BeautifulSoup(data.text,"html.parser")

concretedata=soup.select("#listBox > div.houseList > dl:nth-of-type(1) > dd > div.moreInfo > p > span")

for houseinformat in  concretedata:
    print(houseinformat.get_text())

複製代碼

輸出的確定是咱們選中的價格

注意的是複製的內容裏有dl:nth-child(1),直接改爲dl:nth-of-type(1)要不會報錯的。另外裏面的get_text()方法表示直接獲取了文字信息,否則會和標籤一塊兒顯示的。

**強調:**若是要想獲取此列表的全部價格的話,直接觀察一下會發現,去掉nth-of-type(1)就能夠了,你們應該都明白的。也就是把select方法中的內容改成:

而後運行輸出(只截取了一部分):

實戰

根據上面的爬取方式,咱們能夠把當前網頁「房天下天津整租租房信息」中的房屋標題,具體內容與價格爬取下來。

1.爬取標題

爬取標題咱們再copy時發現用select方法不是和恰當了,這裏應該能看出來吧?看不出來的能夠本身去試一試,這裏咱們查看爬取下來SOUP文檔,發現標題是在P標籤下的"title"字段

image

因此咱們能夠直接用Beautiful Soup中的find_all()方法

#標題
title=soup.find_all("p","title")

複製代碼

2.爬取價格

這就不用多少了,上面講過

#價格
price=soup.select("#listBox > div.houseList > dl > dd > div.moreInfo > p > span")

複製代碼

3.爬取具體內容

#具體的內容
concretedata=soup.select("#listBox > div.houseList > dl > dd > div.moreInfo > p > span")

複製代碼

總體代碼以下:

# -*- coding: gbk -*-
import  requests
import  bs4

def get_lastdata():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
    }

    data = requests.get("http://zu.tj.fang.com/house/n31/", headers=headers)
    #由於打印出來的格式有亂碼,因此更改一下編碼
    data.encoding="gbk"
    soup = bs4.BeautifulSoup(data.text, "html.parser")
    # 標題
    title = soup.find_all("p", "title")
    # 價格
    price = soup.select("#listBox > div.houseList > dl > dd > div.moreInfo > p > span")
    # 具體的內容
    concretedata = soup.select("#listBox > div.houseList > dl > dd > p.font16.mt20.bold")

    for title,price,concretedata in zip(title,price,concretedata):
        last_data={
            "title":title.get_text().strip(),
            "concretedata":concretedata.get_text().strip(),
            "price":price.get_text().strip()
        }

        print(   last_data)

if __name__ == '__main__':
    get_lastdata()

複製代碼

運行結果:

但願對剛入門的朋友有所幫助!

image
相關文章
相關標籤/搜索