我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

python爬蟲需要學習那些知識呢?學習一些抓包知識,有些網站防爬,需要人工瀏覽一些頁面,抓取數據包分析防爬機制,然後做出應對措施。比如解決cookie問題,或者模擬設備等。不過對前端也要比較熟悉,比如說html和簡單的js和web框架什麼的。現在我們用Python爬取租房網站信息,來學習pyhton。

豬短租是一個租房網站,上面有很多優質的民宿出租信息,下面我們以成都地區的租房信息為例,來嘗試爬取這些數據。

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

1.爬取租房標題

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

按照慣例,先來爬下標題試試水,找到標題,複製xpath。

多複製幾個房屋的標題 xpath 進行對比:

//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span

//*[@id="page_list"]/ul/li[2]/div[2]/div/a/span

//*[@id="page_list"]/ul/li[3]/div[2]/div/a/span

瞬間發現標題的 xpath 只在

· 後序號變化,於是,秒寫出爬取整頁標題的 xpath:

//*[@id=“page_list”]/ul/li/div[2]/div/a/span

·1

還是固定的套路,讓我們嘗試把整頁的標題爬下來:

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

小豬在IP限制方面比較嚴格,代碼中務必要加入 sleep() 函數控制爬取的頻率

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

好了,再來對比下 xpath 信息

順著標題的標籤網上找,找到整個房屋信息標籤, xpath 對比如下:

//*[@id=“page_list”]/ul/li #整體

//*[@id=“page_list”]/ul/li/div[2]/div/a/span #標題

你應該知道該怎麼來改代碼了吧,寫一個循環:

file=s.xpath(‘//*[@id=“page_list”]/ul/li’)

for div in file:

title=div.xpath("./div[2]/div/a/span/text()")[0]

好了,來運行一下試試:

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

2.爬取多個元素的信息

對比其他元素的 xpath:

//*[@id=“page_list”]/ul/li #整體

//*[@id=“page_list”]/ul/li/div[2]/div/a/span #標題

//*[@id=“page_list”]/ul/li/div[2]/span[1]/i #價格

//*[@id=“page_list”]/ul/li/div[2]/div/em #描述

//*[@id=“page_list”]/ul/li/a/img #圖片

然後可以寫出代碼:

file=s.xpath(“//*[@id=“page_list”]/ul/li”)

for div in file:

title=div.xpath(“./div[2]/div/a/span/text()”)[0]

price=div.xpath(“./div[2]/span[1]/i/text()”)[0]

scrible=div.xpath(“./div[2]/div/em/text()”)[0].strip()

pic=div.xpath(“./a/img/@lazy_src”)[0]

來嘗試運行一下:

3.翻頁,爬取更多頁面

看一下翻頁時候 url 的變化:

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

http://cd.xiaozhu.com/search-duanzufang-p1-0/ #第一頁

http://cd.xiaozhu.com/search-duanzufang-p2-0/ #第二頁

http://cd.xiaozhu.com/search-duanzufang-p3-0/ #第三頁

http://cd.xiaozhu.com/search-duanzufang-p4-0/ #第四頁

……………………

url 變化的規律很簡單,只是 p 後面的數字不一樣而已,而且跟頁碼的序號是一模一樣的,這就很好辦了……寫一個簡單的循環來遍歷所有的url。

for a in range(1,6):

url = ‘http://cd.xiaozhu.com/search-duanzufang-p{}-0/’.format(a)

# 我們這裡嘗試5個頁面,你可以根據自己的需求來寫爬取的頁面數量

完整的代碼如下:

from lxml import etree

import requests

import time

for a in range(1,6):

url = 'http://cd.xiaozhu.com/search-duanzufang-p{}-0/'.format(a)

data = requests.get(url).text

s=etree.HTML(data)

file=s.xpath('//*[@id="page_list"]/ul/li')

time.sleep(3)

for div in file:

title=div.xpath("./div[2]/div/a/span/text()")[0]

price=div.xpath("./div[2]/span[1]/i/text()")[0]

scrible=div.xpath("./div[2]/div/em/text()")[0].strip()

pic=div.xpath("./a/img/@lazy_src")[0]

print("{} {} {} {}\n".format(title,price,scrible,pic))

看一下爬了5個頁面下來的效果:

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

相信你已經掌握爬蟲基本的套路了,但你還需要去不斷熟悉,能獨立寫出代碼為止。

寫代碼不僅要細心,也需要耐心。很多人從入門到放棄,並不是因為編程這件事情有多難,而是某次實踐過程中,遇到一個小問題。

下面我們再來爬取300個房源信息

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

爬取網頁上300個房源信息,包括標題,地址,日租金,第一張房源圖片鏈接,房東圖片鏈接,房東性別,房東名字

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦

代碼

from bs4 import BeautifulSoup
import requests
 
# 判斷性別
 
def get_sex(sex_icon):
 if sex_icon == ['member_ico']:
 return "男"
 if sex_icon == ['member_ico1']:
 return "女"
 else:
 return "未標識"
# 獲取每頁的url鏈接
def get_page_url(url):
 web_url = requests.get(url)
 web_url_soup = BeautifulSoup(web_url.text,'lxml')
 page_urls = web_url_soup.select('#page_list > ul > li > a')
 for page_url in page_urls:
 each_url = page_url.get('href')
 get_detail_info(each_url)
 
def get_detail_info(url):
 web_data = requests.get(url)
 soup = BeautifulSoup(web_data.text,'lxml')
 
 titles = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em')
 addresses = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > p > span.pr5')
 prices = soup.select('#pricePart > div.day_l > span')
 pics1 = soup.select('#curBigImage')
 owner_pics = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
 owner_names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
 sexes = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
 for title, address, price, pic1, owner_name, owner_pic, sex in zip(titles, addresses, prices, pics1, owner_names,
 owner_pics, sexes):
 data = {
 'title': title.get_text(),
 'address': address.get_text(),
 'price': price.get_text(),
 'pic': pic1.get('src'),
 'owner_pic': owner_pic.get('src'),
 'name': owner_name.get('title'),
 'sex': get_sex(sex.get('class'))
 }
 print (data)
 
urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1, 10)]
 
for url in urls:
 get_page_url(url)

成果

{'name': '想要', 'address': '北京市朝陽區望京利澤西園\n ', 'price': '395', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'title': '望京華彩十四號線精美豪華大一居', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,39,2965,1800,1200,f17d1a3e.jpg'}
{'name': '暖陽洋Sunny', 'address': '北京市朝陽區彩虹路\n ', 'price': '798', 'owner_pic': 'http://image.xiaozhustatic1.com/21/2,0,86,206,375,375,d46c51ef.jpg', 'title': '緊鄰798、望京、酒仙橋,精品大三居。', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/3,0,34,2819,1800,1200,e051c333.jpg'}
{'name': '小小西紅柿', 'address': '北京市豐臺區六里橋太平橋西里40號\n ', 'price': '368', 'owner_pic': 'http://image.xiaozhustatic1.com/21/6,0,72,1777,260,260,887558a2.jpg', 'title': '臨近 北京西站 距電力醫院3分鐘 兩居', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,28,4451,1800,1200,e3bb1749.jpg'}
{'name': '想要', 'address': '北京市朝陽區廣順北大街利澤西園\n ', 'price': '395', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'title': '望京商圈,毗鄰地鐵5分鐘,漫威主題大兩居', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,66,803,1800,1200,38a4c686.jpg'}
{'name': '最美好的時光遇到你', 'address': '北京市朝陽區小關北里\n ', 'price': '218', 'owner_pic': 'http://image.xiaozhustatic1.com/21/4,0,84,10730,260,260,6d756363.jpg', 'title': '惠新西街南口陽光大主臥', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/5,0,47,2122,1800,1200,8830e613.jpg'}
{'name': '暖陽洋Sunny', 'address': '北京市朝陽區彩虹路\n ', 'price': '268', 'owner_pic': 'http://image.xiaozhustatic1.com/21/2,0,86,206,375,375,d46c51ef.jpg', 'title': '獨立衛浴鄰798、望京、酒仙橋更多優惠房源。', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/2,0,71,458,1800,1200,a9c5ea82.jpg'}
{'name': '陽光豔豔', 'address': '北京市朝陽區蘋果社區北區\n ', 'price': '398', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,59,2841,363,363,8b6cf3d7.jpg', 'title': '國貿雙井10號線蘋果酒店式公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,25,3184,1800,1200,4b993d38.jpg'}
{'name': '蘭花姐', 'address': '北京市朝陽區十里河左安東路弘善家園\n ', 'price': '279', 'owner_pic': 'http://image.xiaozhustatic1.com/21/4,0,2,9806,329,329,4656b7f6.jpg', 'title': '潘家園十里河地鐵十號十四號臨近國貿', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,83,2043,1800,1200,cc659348.jpg'}
{'name': 'Alicejy', 'address': '北京市朝陽區望京南湖中園\n ', 'price': '195', 'owner_pic': 'http://image.xiaozhustatic1.com/21/6,0,3,3065,160,160,ba886bf8.jpg', 'title': '望京親水微豪庭,獨享奢華對望東湖灣', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,62,3156,1800,1200,7d5aa8bc.jpg'} 
{'name': '小肖肖', 'address': '北京市東城區南鑼鼓巷\n ', 'price': '158', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,55,1517,260,260,ea96ce11.jpg', 'title': '南鑼鼓巷0距離,鼓樓、後海、故宮、簋街', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,53,2309,825,550,5a3a9a34.jpg'}
{'name': '豹子楠', 'address': '北京市西城區高粱橋斜街長河灣\n ', 'price': '398', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,8,5386,333,333,764cfdb4.jpg', 'title': '西直門 長河灣 韓式田園溫馨2居', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,3,5482,825,550,f874984d.jpg'}
{'name': '幸福姐姐', 'address': '北京市朝陽區紅軍營南路\n ', 'price': '128', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,93,4699,375,375,f8bc8f9b.jpg', 'title': '北五環5.13號地鐵高檔的溫馨公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,42,4845,825,550,57c0343f.jpg'}
{'name': 'Rolling_meng', 'address': '北京市朝陽區勁松華騰園\n ', 'price': '318', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,96,1555,375,375,ea000c2a.jpg', 'title': '10號線勁松/雙井/國貿CBD採光舒適大一居', 'sex': '男', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,40,333,1800,1200,c8e516a7.jpg'}
{'name': '啵妞的家', 'address': '北京市朝陽區十里堡潤楓嘉尚\n ', 'price': '338', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,33,4216,366,366,c589a192.jpg', 'title': '6號線地鐵公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,60,2088,1800,1200,3b057da1.jpg'}

好了,今天的知識就分享到這裡,歡迎關注愛編程的南風,私信關鍵詞:學習資料,獲取更多學習資源,如果文章對你有有幫助,請收藏關注,在今後與你分享更多學習python的文章。同時歡迎在下面評論區留言如何學習python。

我用Python爬取了租房網站的信息,再也不怕租不到舒適的房啦


分享到:


相關文章: