最近、急な仕事の変更により、新しいオフィスの場所が現在の住居から遠方になったため、新しい家を借りることになりました。
私は代理店の eMule に乗って、街の奇妙な場所を探索し始めました。
さまざまなレンタルアプリを切り替える過程で、効率が非常に低いため、非常に心配しました。
まず第一に、私は一緒に住んでいるからです。私のガールフレンド 一緒に、2 人は同時に職場までの距離を考慮する必要がありますが、各プラットフォームの通勤時間に基づいて家を検索する機能は比較的役に立ちません。一部のプラットフォームは同時に複数の場所の選択をサポートしていません。また、プラットフォームによっては各拠点からの通勤距離を機械的にしか取得できないため、同じ継続時間の地点では利用ニーズに応えられません。
第二に、賃貸人の観点から見ると、賃貸プラットフォームが多すぎて、各プラットフォームのフィルタリングと並べ替えロジックが一貫していないため、類似した物件の情報を水平的に比較することが困難です。
でも、それは問題ではありません。プログラマーとして、問題を解決するにはプログラマーの方法を使用する必要があります。そこで、昨夜、Python スクリプトを使用して、上海エリアの賃貸プラットフォームのすべての住宅情報を取得しました。合計 20,000 件以上ありました。はクロール データです。プロセス全体が全員と共有されます。
ページを分析してエントリ ポイントを見つける
まず、プラットフォームの賃貸ページに入ります。ホームページ上の住宅リストには、必要な情報のほとんどがすでに含まれていることがわかります。情報は DOM から直接取得できるため、シミュレートされたリクエストを通じて Web ページ データを直接収集することを検討してください。https://sh.lianjia.com/zufang/
#次のステップは、URL を取得する方法を検討することです。観察の結果、この地域には2万戸以上の住宅が存在することが判明しましたが、ウェブページからアクセスできるデータは最初の100ページまでであり、各ページに表示される件数の上限は30件です。合計3k、全ての情報を取得することは不可能です。
#しかし、フィルター条件を追加することでこの問題を解決できます。フィルター項目で「静安」を選択し、次の URL を入力します。https://sh.lianjia.com/zufang/jingan/このエリアには 2,000 軒以上の家があり、その数が多いことがわかります。データ ページは 75 です。1 ページあたり 30 エントリがあるため、理論的にはすべてのデータにアクセスできます。したがって、各地区の住宅データを個別に取得することで、市内のすべてのデータを取得できます。
https://sh.lianjia.com/zufang/jingan/pg2/2ページ目ボタンをクリック後、上記のURLを入力すると、pg以降の数字を変更すれば該当するページ番号を入力できることがわかります。
しかし、ここで問題が発生し、同じページ数を訪問するたびに取得されるデータが異なるため、収集されるデータが重複してしまいます。そこで、並べ替え条件の「棚にある最新」をクリックして、次のリンクを入力します:
https://sh.lianjia.com/zufang/jingan/pg2rco11/
この並べ替え方法で得られるデータの順序は安定しています。この時点で、私たちの考え方は次のとおりです。小さな領域の最初のページを個別に取得し、最初のページまでの現在の領域の最大ページ数を取得し、各ページにアクセスしてすべてのデータを取得するシミュレートされたリクエストにアクセスします。
データのクローリング
アイデアを思いついた後、コードを書き始める必要があります。まず、すべてのリンクを収集する必要があります。コードは次のとおりです:
# 所有小地区对应的标识 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))
その後は、一つずつ行う必要があります 前のステップで取得した URL を処理して、リンク内のデータを取得します コードは次のとおりです:
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'})
ページ構造を観察することで、各要素の保存場所を取得し、対応するページ要素を見つけて、必要な情報を取得できます。
完全なコードはここに添付されています。興味のある友人は、必要に応じてリンク内の地域識別子と小さな地域識別子を置き換えて、独自の情報を取得できます。あなたの地域について。他のレンタルプラットフォームのクローリング方法はほとんど同様であるため、詳細は説明しません。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("****全部完成****")いくつかの操作の後、私たちはさまざまな地元の賃貸プラットフォームの完全な住宅情報を入手しました。この時点で、いくつかの基本的なフィルタリング方法を通じて必要なデータをすでに取得できています。
以上が上海で家を借りるために、Python を使用して 20,000 件以上の住宅情報を一晩で調べました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。