Rumah >pembangunan bahagian belakang >Tutorial Python >Untuk menyewa rumah di Shanghai, saya menggunakan Python untuk merangkak melalui lebih daripada 20,000 maklumat perumahan dalam sekelip mata.
Disebabkan perubahan mendadak dalam kerja baru-baru ini, lokasi pejabat baru jauh dari tempat tinggal saya sekarang, jadi saya terpaksa menyewa rumah baru.
Saya menaiki eDonkey agensi dan mula meneroka sudut bandar yang pelik.
Dalam proses bertukar antara pelbagai aplikasi sewaan, saya sangat bimbang kerana kecekapannya sangat rendah:
Pertama sekali, kerana saya tinggal bersama teman wanita saya Bersama-sama, kedua-dua orang itu perlu mempertimbangkan jarak untuk bekerja pada masa yang sama, tetapi fungsi mencari rumah berdasarkan masa berulang-alik pada setiap platform adalah tidak berguna Sesetengah platform tidak menyokong pemilihan berbilang lokasi pada masa yang sama masa, dan sesetengah platform hanya boleh mendapatkan jarak perjalanan secara mekanikal dari setiap lokasi Titik dengan tempoh yang sama tidak dapat memenuhi keperluan penggunaan.
Kedua, dari perspektif penyewa, terdapat terlalu banyak platform penyewaan, dan logik penapisan serta isihan setiap platform adalah tidak konsisten, menjadikannya sukar untuk membandingkan maklumat secara mendatar pada sifat yang serupa.
Tetapi tidak mengapa sebagai seorang pengaturcara, sudah tentu anda perlu menggunakan kaedah pengaturcara untuk menyelesaikan masalah. Jadi, malam tadi saya menggunakan skrip ular sawa untuk mendapatkan semua maklumat perumahan platform penyewaan di kawasan Shanghai Terdapat lebih daripada 20,000 keping secara keseluruhan:
Berikut. ialah data rangkak Keseluruhan proses dikongsi dengan semua orang.
Mula-mula masukkan halaman sewa platform Anda dapat melihat bahawa penyenaraian rumah di halaman utama sudah termasuk kebanyakan maklumat yang kami perlukan, dan ini Maklumat boleh diperoleh terus daripada DOM, jadi pertimbangkan untuk mengumpul data halaman web secara langsung melalui permintaan simulasi.
https://sh.lianjia.com/zufang/
Jadi langkah seterusnya ialah mempertimbangkan cara mendapatkan url tersebut. Melalui pemerhatian, kami mendapati terdapat lebih daripada 20,000 rumah di kawasan itu, tetapi hanya 100 muka surat pertama data boleh diakses melalui halaman web Had atas nombor yang dipaparkan pada setiap halaman ialah 30, yang berfungsi sehingga a jumlah 3k adalah mustahil untuk mendapatkan semua maklumat.
Tetapi kita boleh menyelesaikan masalah ini dengan menambah syarat penapis. Pilih "Jing'an" dalam item penapis dan masukkan URL berikut:
https://sh.lianjia.com/zufang/jingan/
Anda dapat melihat bahawa terdapat lebih daripada 2k unit rumah di kawasan itu, dan bilangan halaman data ialah 75, 30 item setiap halaman, secara teorinya semua data boleh diakses. Oleh itu, semua data di bandar boleh diperolehi dengan mendapatkan data perumahan di setiap daerah secara berasingan.
https://sh.lianjia.com/zufang/jingan/pg2/
Selepas mengklik butang halaman kedua, anda memasukkan url di atas Anda boleh mendapati bahawa selagi anda mengubah suai nombor selepas pg, anda boleh memasukkan nombor halaman yang sepadan.
Walau bagaimanapun, masalah ditemui di sini Data yang diperoleh untuk setiap lawatan ke bilangan halaman yang sama adalah berbeza, yang akan membawa kepada pertindihan data yang dikumpul. Jadi kami klik pada "Keluaran Terkini" dalam syarat pengisihan dan masukkan pautan berikut:
https://sh.lianjia.com/zufang/jingan/pg2rco11/
Susunan data yang diperolehi melalui kaedah pengisihan ini adalah stabil Halaman pertama setiap rantau kecil, dan kemudian dapatkan bilangan maksimum halaman di rantau semasa melalui halaman pertama, dan kemudian akses permintaan simulasi untuk mengakses setiap halaman untuk mendapatkan semua data.
Selepas anda mempunyai idea, anda perlu menulis kod tersebut Pertama, kami perlu mengumpul semua pautan adalah seperti berikut:
# 所有小地区对应的标识 list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu'] # 存放所有链接 urls = [] for a in list: urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a)) # 设置请求头,避免ip被ban headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'} # 获取当前小地区第1页的dom信息 res = requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a), headers=headers) content = res.text soup = BeautifulSoup(content, 'html.parser') # 获取当前页面的最大页数 page_num = int(soup.find('div', attrs={'class': 'content__pg'}).attrs['data-totalpage']) for i in range(2,page_num+1): # 将所有链接保存到urls中 urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i))
Selepas itu, kami Untuk memproses URL yang diperolehi dalam langkah sebelumnya satu demi satu dan mendapatkan data dalam pautan, kodnya adalah seperti berikut:
num=1 for url in urls: print("正在处理第{}页数据...".format(str(num))) res1 = requests.get(url, headers=headers) content1 = res1.text soup1 = BeautifulSoup(content1, 'html.parser') infos = soup1.find('div', {'class': 'content__list'}).find_all('div', {'class': 'content__list--item'})
Dengan memerhati struktur halaman, kita boleh mendapatkan setiap Dengan mencari lokasi di mana elemen disimpan dan mencari elemen halaman yang sepadan, kita boleh mendapatkan maklumat yang kita perlukan.
Kod lengkap dilampirkan di sini Rakan-rakan yang berminat boleh menggantikan pengecam wilayah dan pengecam kawasan kecil dalam pautan mengikut keperluan mereka sendiri, dan kemudian mereka boleh mendapatkan Maklumat mereka sendiri. tentang kawasan anda. Kaedah merangkak bagi platform sewaan lain kebanyakannya serupa, jadi saya tidak akan menerangkan secara terperinci.
import time, re, csv, requests import codecs from bs4 import BeautifulSoup print("****处理开始****") with open(r'..sh.csv', 'wb+')as fp: fp.write(codecs.BOM_UTF8) f = open(r'..sh.csv','w+',newline='', encoding='utf-8') writer = csv.writer(f) urls = [] # 所有小地区对应的标识 list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu'] # 存放所有链接 urls = [] for a in list: urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a)) # 设置请求头,避免ip被ban headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'} # 获取当前小地区第1页的dom信息 res = requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a), headers=headers) content = res.text soup = BeautifulSoup(content, 'html.parser') # 获取当前页面的最大页数 page_num = int(soup.find('div', attrs={'class': 'content__pg'}).attrs['data-totalpage']) for i in range(2,page_num+1): # 将所有链接保存到urls中 urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i)) num=1 for url in urls: # 模拟请求 print("正在处理第{}页数据...".format(str(num))) res1 = requests.get(url, headers=headers) content1 = res1.text soup1 = BeautifulSoup(content1, 'html.parser') # 读取页面中数据 infos = soup1.find('div', {'class': 'content__list'}).find_all('div', {'class': 'content__list--item'}) # 数据处理 for info in infos: house_url = 'https://sh.lianjia.com' + info.a['href'] title = info.find('p', {'class': 'content__list--item--title'}).find('a').get_text().strip() group = title.split()[0][3:] price = info.find('span', {'class': 'content__list--item-price'}).get_text() tag = info.find('p', {'class': 'content__list--item--bottom oneline'}).get_text() mixed = info.find('p', {'class': 'content__list--item--des'}).get_text() mix = re.split(r'/', mixed) address = mix[0].strip() area = mix[1].strip() door_orientation = mix[2].strip() style = mix[-1].strip() region = re.split(r'-', address)[0] writer.writerow((house_url, title, group, price, area, address, door_orientation, style, tag, region)) time.sleep(0) print("第{}页数据处理完毕,共{}条数据。".format(str(num), len(infos))) num+=1 f.close() print("****全部完成****")
Selepas beberapa operasi, kami memperoleh maklumat lengkap perumahan daripada pelbagai platform penyewaan tempatan. Pada ketika ini, kita sudah boleh mendapatkan data yang kita perlukan melalui beberapa kaedah penapisan asas.
Atas ialah kandungan terperinci Untuk menyewa rumah di Shanghai, saya menggunakan Python untuk merangkak melalui lebih daripada 20,000 maklumat perumahan dalam sekelip mata.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!