Python, Pekin ikinci el konut verilerini tarıyor, Beipiao halkı bir eve parası yetebilir mi? Tam kaynak kodu ile

Yazar | Xu Tao

Yüksek konut fiyatları Pekin'deki insanları endişelendiriyor Bu makale Pekin'in ikinci el konut verilerini analiz ediyor.

Bu makale esas olarak iki bölüme ayrılmıştır: Python, Ganji.com'un ikinci el konut verilerini tarar ve R, PythonR'de yeni olan öğrenciler için uygun olan, taranan ikinci el konut fiyatları üzerinde doğrusal regresyon analizi yapar.

Python Ganji.com Beijing ikinci el konut verilerini tarıyor

Bir ay boyunca taramaya başladım, bu yüzden Xpath, Beautiful Soup ve her web sitesini uygulama konsolidasyonu için ayrı ayrı taramak için düzenli üç yöntem kullandım. Veri kaynakları aşağıdaki gibidir:

Xpath taranıyor:

Bu esas olarak, belirli öğelerin var olup olmadığını belirlemek için Xpath'in nasıl kullanılacağı sorununu çözmek içindir.Örneğin, evin herhangi bir dekorasyon bilgisi yoksa, yargılamadan, belirli öğelerin yokluğu sürünmenin kesintiye uğramasına neden olacaktır.

ithalat istekleri

lxml ithalat etree'den

request.exceptions import RequestException

çoklu işlemeyi içe aktar

ithalat zamanı

üstbilgiler = {

'Kullanıcı-Aracı': 'Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 55.0.2883.87 Safari / 537.36'}

def get_one_page (url):

Deneyin:

yanıt = request.get (url, başlıklar = başlıklar)

response.status_code == 200 ise:

return response.text

dönüş Yok

RequestException hariç:

dönüş Yok

def parse_one_page (içerik):

Deneyin:

seçici = etree.HTML (içerik)

TÜMÜ = selector.xpath ('// * / div / div / div / div')

TÜMÜNDE div için:

Yol ver {

'Ad': div.xpath ('dl / dd / a / text ()'),

'Tür': div.xpath ('dl / dd / span / text ()'),

'Alan': div.xpath ('dl / dd / span / text ()'),

'Doğru': div.xpath ('dl / dd / span / text ()'),

'Kat': div.xpath ('dl / dd / span / text ()'). Strip (). Replace ('\ n', ""),

'Süsle': div.xpath ('dl / dd / span / text ()'),

#Adresin özel bir muameleye ihtiyacı var

'Adres': div.xpath ('dl / dd // text ()') + div.xpath ('dl / dd // text ()'). Replace ('\ n', '') + div.xpath ('dl / dd // metin ()'). şerit (),

'Toplam Fiyat': div.xpath ('dl / dd / div / span / text ()') + div.xpath ('dl / dd / div / span / text ()'),

'Fiyat': div.xpath ('dl / dd / div / text ()')

}

div == Yok ise: ## Yargıyı buraya ekleyin, öğelerden biri boşsa, Yok sonucunu verin

dönüş Yok

İstisna hariç:

dönüş Yok

def main ():

i aralığı (1, 500) için: # Burada, veri aralığı içinde 500 sayfalık veriyi taramaya ayarlanmıştır, tarama miktarını

url = 'http: //bj.ganji.com/fang5/o {} /'.format (i)

içerik = get_one_page (url)

print ('Sayfa {} yakalandı'.format (i))

parse_one_page (içerik) içindeki div için:

baskı (böl)

__name__ == '__ main__' ise:

ana()

Güzel Çorba taraması:

ithalat istekleri

yeniden ithal

request.exceptions import RequestException

bs4'ten BeautifulSoup içe aktarın

csv içe aktar

ithalat zamanı

üstbilgiler = {'Kullanıcı-Aracı': 'Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 55.0.2883.87 Safari / 537.36'}

def get_one_page (url):

Deneyin:

yanıt = request.get (url, başlıklar = başlıklar)

response.status_code == 200 ise:

return response.text

dönüş Yok

RequestException hariç:

dönüş Yok

def parse_one_page (içerik):

Deneyin:

çorba = BeautifulSoup (içerik, 'html.parser')

öğeler = çorba.find ('div', class_ = re.compile ('js-tips-list'))

items.find_all ('div', class_ = re.compile ('ershoufang-list')) içindeki div için:

Yol ver {

'Ad': div.find ('a', class_ = yeniden.compile ('js-title')). Metin,

'Tür': div.find ('dd', class_ = re.compile ('size')). Content.text, #tag öğesinin .contents özelliği, etiketin alt düğümlerini bir liste olarak çıkarabilir

'Alan': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,

'Doğru': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,

'Kat': div.find ('gg', sınıf_ = yeniden. Yığın ('boyut')). İçindekiler.text.replace ('\ n', ''),

'Süsle': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,

'Adres': div.find ('span', class_ = re.compile ('alan')). Text.strip (). Replace ('', ''). Replace ('\ n', ''),

'Toplam Fiyat': div.find ('span', class_ = re.compile ('js-price')). Text + div.find ('span', class_ = re.compile ('yue')). Metin,

'Fiyat': div.find ('div', class_ = yeniden.compile ('zaman')). Metin

}

# Bazı ikinci el konut bilgileri, şu gibi bilgilerin bir kısmından yoksundur: dekorasyon bilgisi eksikliği veya kat bilgisi eksikliği, şu anda bir değerlendirme eklemeniz gerekir, aksi takdirde tarama kesintiye uğrayacaktır.

div == Yok ise:

dönüş Yok

İstisna hariç:

dönüş Yok

def main ():

aralıktaki i için (1,50):

url = 'http: //bj.ganji.com/fang5/o {} /'.format (i)

içerik = get_one_page (url)

print ('Sayfa {} yakalandı'.format (i))

parse_one_page (içerik) içindeki div için:

baskı (böl)

varsayılan yol dosya adını doğrudan yazmaksa, f: # Data.csv dosyası depolama yolu olarak open ('Data.csv', 'a', newline = '') ile.

alan adları =

writer = csv.DictWriter (f, alan adları = alan adları)

writer.writeheader ()

parse_one_page (içerik) içindeki öğe için:

writer.writerow (öğe)

time.sleep (3) # Tarama sıklığını ayarlayın. Başlangıçta çok fazla tarama yaptım ve bu da web sayfasının doğrulanmasına neden oldu.

__name __ == '__ main__' ise:

ana()

Düzenli tarama: Uzun zamandır çalıştım ama hala çözmedim.

Bu süreçte kolaylıkla karşılaşılan sorunlar şunlardır:

  • Bazı evler, dekorasyon bilgisi eksikliği gibi bazı bilgilerden yoksundur. Şu anda, bir yargının eklenmesi gerekiyor. Herhangi bir yargılama eklenmezse, emekleme otomatik olarak sona erecek (burada büyük bir deliğe düştüm).
  • Data.csv bilgi noktalarının depolama dosyası yolu, varsayılan olarak çalışma dizinidir.Python'da çalışma dizini nasıl görüntülenir:

işletim sistemini içe aktar

# Python'un varsayılan çalışma dizinini görüntüleyin

baskı (os.getcwd ())

# Çalışma dizinini değiştirin

os.chdir ('e: \ workpython')

baskı (os.getcwd ())

# Çıktı çalışma dizini

e: \ workpython

  • Tarayıcı bir sözlük biçiminde yazdırır ve her ev bilgisi bir sözlüktür.Python'daki excel ile ilgili kitaplık bilgi kör noktası olduğundan, sözlük döngüsü tarama sırasında doğrudan CSV'ye yazılır.

Pycharm aşağıdaki gibi yazdırır:

Sözlük döngüsünü doğrudan CSV'ye yazmanın etkisi aşağıdaki gibidir:

  • Yeni başlayanların çoğu Adres ile nasıl başa çıkılacağını bilmiyor. Burada .contents'ın Güzel Çorba'da kullanımını vurgulayacağım.Ben şahsen deneyimledim. Cevabı bulmak için burada çok zaman geçirdim.

R, taranmış ikinci el konut fiyatları üzerinde genel bir doğrusal regresyon analizi yapar

Ganji.com'un yakalanan ikinci el konut verileri üzerinde bazı basit analizler yapmak için R'yi kullanalım.

Verilerin açıklaması

Ad: Analitik referans önemi olmaksızın, tüccarlar için esas olarak dikkat çekici sorular

Tip: Yatak odası sayısı, oturma odası sayısı, banyo sayısı

Alan: Alan (metrekare)

Doğru: Doğru

Kat: Kat

Süsle: ince dekorasyon, sade dekorasyon, kaba oda gibi dekorasyon durumu

Adres: İkinci el evin adresi

Toplam Fiyat: Toplam fiyat

Fiyat: Ortalama fiyat (yuan / metrekare)

Veri temizleme

veri < -read.csv ("E: // R / RData / data.csv İçin Veri")

VERİ < -data # Ad ve Adres sütunlarını kaldırın

VERİ

# Yargı tarama sırasında eklendi, bu nedenle taranan verilerde eksik değerler olup olmadığını bilmiyorum, buradan kontrol edin

colSums (is.na (DATA))

# Burada, Type'ın yatak odası, oturma odası ve banyosu üç farklı sütuna ayrılmıştır.

## Bazı evlerde oturma odası bulunmadığına dikkat edilmelidir, örneğin: 1 yatak odası ve 1 banyonun şu anda ayrı ayrı ele alınması gerekir ve bazılarının tuvalet bilgisi yoktur.

kütüphane (tidyr)

kitaplık (stringr)

VERİ = ayrı (veri = DATA, col = Tür, içine = c ("Yatak odaları", "Salonlar"), sep = "")

VERİ = ayrı (veri = DATA, col = Salonlar, = c ("Salonlar", "Tuvalet"), sep = "salon")

## Banyonun arkasındaki Çince karakterleri kaldırın

DATA $ Tuvalet < -str_replace (DATA $ Tuvalet, "", "")

### Şekil 6'da gösterildiği gibi, Salonlarda Çince karakterleri kaldırın, çünkü bazı konut bilgilerinde oturma odası yoktur, örneğin: 1 yatak odası ve 1 salon. Yatak odası ve oturma odası olarak bölündüğünde, banyo oturma odasına bölünecektir.

DATA $ Salonları < -str_replace (DATA $ Salonları, "", "")

## Verileri oturma odası bilgisi olmadan alın, bu veriler Salonlar sütununa ayrılmıştır

yeni veri < -VERİ

yeni veri

## Salonlar sütununu oturma odası olmadan 0 olarak doldurun

VERİ < -0

VERİ < -yeni veri

colSums (DATA == "")

Yatak Odası Salonları Tuvalet Alanı Yer Dekorasyonuna Doğru

00 20 00 0

Toplam Fiyat Fiyatı

00

## Bilgisiz 2 tuvalet olduğunu bulduk, 0 olarak doldurun.

DATA $ Tuvalet < -0

## Burada Alan'dan sonra metrekareyi kaldırın

VERİ $ Alan < -str_replace (DATA $ Alan, "", "")

## Doğru türünü görüntüleyin

tablo (DATA $ Doğru)

Kuzeye doğru Kuzeydoğuya Güneydoğuya Doğubatıya Doğuya Kuzeybatıya Güneybatıya doğru

512523506532190167838

Güneybatı batıya dönük

2826

## Kat bilgilerinin tüm parantezlerini kaldırın

DATA $ Taban < -str_replace (DATA $ Floor, ". *", "") ## Normal ifade

# Katın kategori bilgilerini görüntüleyin

Alt kat, yer altı, yüksek kat, 1 kat, 2 kat, 3 kat, 4 kat, 5 kat, Orta kat

632327903661101681301016

# Toplam Fiyat ve Fiyattan sonra sırasıyla 10.000 yuan ve yuan / kaldır

DATA $ Toplam Fiyat < -str_replace (DATA $ TotalPrice, "10.000 yuan", "")

DATA $ Fiyat < -str_replace (DATA $ Fiyat, "yuan / ", "")

kafa (DATA)

## Veri formatını dönüştürme

DATA $ Yatak odaları < -as.factor (DATA $ Yatak Odası)

DATA $ Salonları < -as.factor (DATA $ Salonları)

DATA $ Tuvalet < -as.faktör (DATA $ Tuvalet)

VERİ $ Alan < -as.numeric (VERİ $ Alanı)

DATA $ Toplam Fiyat < -as.numeric (DATA $ TotalPrice)

DATA $ Fiyat < -as.numeric (DATA $ Fiyat)

VERİ $ Doğru < -as.faktör (DATA $ Towards)

DATA $ Süsle < -as.factor (DATA $ Süsle)

str (VERİ)

Yukarıdaki veriler temizlendi.

Açıklayıcı analiz

Bu bölümün ana fikri, tek bir bağımsız değişkenin bağımlı değişken üzerindeki etkisini araştırmaktır.Konut fiyatlarını etkileyen faktörleri simüle etmeden ve keşfetmeden önce, öncelikle konut fiyatlarını etkileyen faktörleri yargılamak için her bir değişkenin tanımlayıcı bir analizini yapın. Burada çeşitli faktörlerin toplam fiyat üzerindeki etkisini araştırıyoruz.

Yatak Odası ve Toplam Fiyat arasındaki ilişkiyi keşfedin

tablo (DATA $ Yatak odaları)

12 34 56 79

5411225779193102205 1

## 6, 7 ve 9 yatak odalı yatak odalarının sayısı az olduğu için burada bu verileri boşaltıyoruz.

VERİ < -VERİ

VERİ < -VERİ

VERİ < -VERİ

tablo (DATA $ Yatak odaları)

12 34 5

5411225779193102

kütüphane (ggplot2)

ggplot (DATA, aes (x = Yatak Odası, y = ToplamFiyat)) + geom_boxplot (col = "kırmızı")

DATA $ Yatak odaları < -as.numeric (DATA $ Yatak Odası)

## Burada yatak odası sayısı 1, 2'dir ve 3'ü A, 4'ü B, 5'i C'dir.

DATA $ Yatak odaları < - "A"

DATA $ Yatak odaları < - "A"

DATA $ Yatak odaları < - "A"

DATA $ Yatak odaları < - "B"

DATA $ Yatak odaları < - "C"

Toplam Fiyat, yatak odası sayısına göre değişir. Ve yatak odası sayısının artmasıyla birlikte toplam fiyat da yükseliyor ki bu da kamuoyunun algısına uygun.

Salonlar ve TotalPrice arasındaki ilişkiyi keşfedin

masa (DATA $ Salonlar)

01 23 45 9

201674105077181 0

## 5 Oturma odasında sadece bir kişi var, onu burada taburcu edeceğiz

VERİ < -VERİ

masa (DATA $ Salonlar)

01 23 45 9

201674105077180 0

ggplot (DATA, aes (x = Salonlar, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")

Toplam fiyat, oturma odası sayısı 3 olduğunda en yüksek, salon sayısı 0, 1 ve 2 olduğunda toplam fiyat 3 ve 4 salon sayısından daha düşüktür.

Tuvalet ve TotalPrice arasındaki ilişkiyi keşfedin

# Tuvalet ve toplam fiyat arasındaki ilişkiyi keşfedin

masa (DATA $ Tuvalet)

01 23 45 67 9

2214247011674267 20

# Burada 0, 6 ve 7 numaralı banyo sayısını kaldırın

VERİ < -VERİ

VERİ < -VERİ

VERİ < -VERİ

masa (DATA $ Tuvalet)

01 23 45 67 9

0214247011674260 00

ggplot (DATA, aes (x = Tuvalet, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")

Genel olarak, ne kadar çok yatak odası varsa, o kadar çok banyo vardır, yani daha fazla banyo, toplam fiyat o kadar yüksek olur.

Alan ve Toplam Fiyat arasındaki ilişkiyi keşfedin

ggplot (DATA, aes (x = Alan, y = Toplam Fiyat)) + geom_point (col = 'kırmızı')

Bu, konut alanı ne kadar büyükse, toplam fiyat o kadar yüksek olur.

Towards ve TotalPrice arasındaki ilişkiyi keşfedin

ggplot (DATA, aes (x = Doğru, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")

Taban ve Toplam Fiyat arasındaki ilişkiyi keşfedin

ggplot (DATA, aes (x = Kat, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")

Resimdeki bilgiler toplamda sadece 1, 2 ve 3 kat olduğunu ve yeraltının toplam fiyatının daha yüksek olduğunu göstermektedir.

Dekorasyon ve Toplam Fiyat arasındaki ilişkiyi keşfedin

ggplot (DATA, aes (x = Süsleme, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")

Farklı dekorasyon bilgilerinin toplam fiyat üzerinde çok az etkisi vardır.

Model oluşturma

Uygun < -lm (Toplam Fiyat ~ Yatak Odası + Salonlar + Tuvalet + Alan + + Kata Doğru + Dekorasyon, veri = DATA)

özet (uygun)

Aramak:

lm (formül = Toplam Fiyat ~ Yatak Odası + Salonlar + Tuvalet + Alan +

+ Kat + Dekorasyon yönünde, veri = VERİ)

Artıklar:

Min 1Q Medyan 3Q Maks

-1330,80 -103,49 -21,4163,882961,59

Katsayılar:

Tahmin Std. Hata t değeri Pr ( > | t |)

(Kesişme) -112.763388.3010 -1.2770.201697

Yatak Odası2 -43.593416.2533 -2.6820.007359 **

Yatak Odası3 -82.656520.7641 -3.9817.04e-05 ***

Yatak Odası4 -63.309634.9521 -1.8110.070198.

Yatak Odası579.061854.07631.4620.143842

Salonlar1 -5.066364.2764 -0.0790.937182

Salonlar2 -53.890565.4427 -0.8230.410307

Salonlar3 -303.975079.2280 -3.8370.000127 ***

Salonlar4 -528.5427104.0849 -5.0784.07e-07 ***

Tuvalet2112.956619.11715.9093.87e-09 ***

Tuvalet3543.730438.805614.012 < 2e-16 ***

Tuvalet4735.189455.097713.343 < 2e-16 ***

Tuvalet5338.790684.28514.0205.98e-05 ***

Alan 5.10910.161931.557 < 2e-16 ***

Kuzeydoğuya doğru 138.908879.38171.7500.080248.

Güneydoğu'ya doğru 187.189568.53882.7310.006351 **

Doğu-Batı yönünde 176.305565.83842.6780.007453 **

Doğuya doğru 210.943573.27442.8790.004022 **

Kuzey-güneye doğru 75.783157.11991.3270.184704

Güneye Doğru 60.194956.96781.0570.290763

Kuzeybatıya doğru 75.432671.14151.0600.289091

Güneybatıya doğru 169.810675.96262.2350.025467 *

Batıya Doğru 234.081676.55853.0580.002253 **

Yeraltı kat -812.357863.3277 -12.828 < 2e-16 ***

Kat 12.352514.24660.8670.385991

Kat 1 kat -313.727852.1342 -6.0182.00e-09 ***

Kat 2 Katlıdır -453.369241.6829 -10.877 < 2e-16 ***

Kat 3 katlıdır -601.703244.3336 -13.572 < 2e-16 ***

Kat 4 katlıdır -183.786636.3396 -5.0574.52e-07 ***

Kat 5 Katlıdır -41.418425.7922 -1.6060.108419

Orta Kat -1.722313.5961 -0.1270.899204

Sade dekorasyonu süsle -63.159122.0584 -2.8630.004224 **

Süsleme -49.327619.8544 -2.4840.013033 *

Boşluk süsleme -157.029924.3012 -6.4621.22e-10 ***

---

İşaret kodları: 0 "***" 0.001 "**" 0.01 "*" 0.05 "." 0.1 "" 1

Artık standart hata: 2794 serbestlik derecesinde 265.5

Çoklu R-kare: 0.6852, Düzeltilmiş R-kare: 0.6815

F istatistiği: 33 ve 2794 DF'de 184,3, p değeri: < 2.2e-16

Modelin F testi, kurulan modelin anlamlı olduğunu gösteren sıfır hipotezini reddeder; Ajusted R-kare 0,6815'dir ve modelin uyumu kabul edilebilir.

Yazar: Xu Tao, 19 yıllık mezunlar, mercan resiflerine odaklanan araştırmalar, her türlü temizlik verisi gibi R, kullanıcılar neredeyse @parkson'u biliyor.

Feragatname: Bu makale, resmi hesap verileri Senlin tarafından sağlanmıştır ve telif hakkı diğer tarafa aittir.

"Belgeler için çağrı"

CSDN halka açık hesabı, "on binlerce teknik insanla büyüme" kavramına bağlıdır. Teknik insanların ilk kez ilgilendikleri endüstri odak olaylarını teknik insanların benzersiz bakış açılarından tanımlamak için yalnızca "inek başlıkları" ve "konuşma" sütunlarını kullanmakla kalmaz, aynı zamanda "Teknoloji Başlıkları" sütunu, sektördeki popüler teknolojilerin ve uygulamaların derinlemesine bir yorumunu sunarak, tüm geliştiricilerin teknolojik trendlere ayak uydurmasına, uyanık bir teknolojik anlayışı sürdürmesine ve sektör eğilimleri ve teknolojileri hakkında daha kapsamlı bir anlayışa sahip olmasına olanak tanır.

Yüksek kaliteli makaleleriniz veya sektörün sıcak olayları, teknoloji trendleri hakkında içgörüler veya derinlemesine uygulama uygulamaları, senaryolar vb. Hakkında yeni içgörüleriniz varsa, gönderimler için lütfen CSDN ile iletişime geçin. İletişim: WeChat (guorui_1118, lütfen gönderim + ad + şirket pozisyonunu not edin), e-posta (guorui@csdn.net).

90'larda doğduğunuzda baba olun, Yiche Editor, 2019'da satın alınması en çok istenen MPV
önceki
Pekin Batı Tren İstasyonu'nun 5 çıkışının tümü yeniden adlandırıldı, bu nedenle seyahat eden arkadaşlar için hata yapmayın
Sonraki
12nm yeni işlem! AMD Radeon RX 590 ilk değerlendirme: enerji verimliliği oranı% 10 arttı
Pekin bu yıl kültürel hizmetlerin kalitesini nasıl artıracak ve insanlara fayda sağlayan kültürel projelerde iyi bir iş çıkaracak? Temsilciler ve komite üyelerinin hepsi "silah"
Bu sadece sisteki çiçeklere bakmaktan daha fazlası, önemli modellerin son özel casus fotoğrafları
Güzel 1-1 Reims, durdurma süresi cezası berabere kaldı, Bashen kaçırdı
Kış Olimpiyatları için hazırlıklar nasıl? Buz ve kar sporlarının gelişimi nasıl teşvik edilir? Tüm endişeleriniz burada
Yeni nesil Subaru Legacy, 2.4T yatay olarak zıt motoru piyasaya sürdü
Mazda MX-530th Anniversary Edition çıktı, Liangsao Racing Orange, 3000 adetle sınırlı
inanılmaz! Çin'in en büyük otomotiv endüstrisi zincir platformu Cixi'ye yerleşti
İlk yarı-Inter Milan 0-0 Sassuolo, Vecino riske girdi
Pekin Longqingxia Manzara Bölgesi'ndeki Shenbing tatbikatında vinçle kurtarma
"Sagitar" GLI'nin ABD versiyonu resmi olarak 2.0T motor artı gövde hızlandırma yayınladı
Ortalama maaş 8165 yuan! İnternet yetenek iştahı, bahar yetenek pazarının başında
To Top