#前言html
先看爬到的信息:python
今天主要用到了兩個庫:Requests和BeautifulSoup。因此我先簡單的說一下這兩個庫的用法,提到的都是此文須要用到的。編程
#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
#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文檔,結果以下(截取了一部分):
這裏主要講一下Beautiful Soup中的**select()**方法, 經過某個屬性查找,而屬性能夠在網頁中複製到。
具體的能夠直接此網址學:
http://beautifulsoup.readthedocs.io/zh_CN/latest/
複製的步驟:
**1.**選中你要了解的內容,右鍵-->檢查,好比我對價格進行了「檢查」:
**2.**選擇copy selector
**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"字段
因此咱們能夠直接用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()
複製代碼
運行結果:
但願對剛入門的朋友有所幫助!