python3爬取“小豬短租-北京”租房資訊
阿新 • • 發佈:2018-11-17
爬蟲思路分析:
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)