使用beautifulsoup和re抓取鏈家資料基礎並儲存為csv檔案

twoguest發表於2021-01-02

本辦法只考慮抓取鏈家二手房100頁的基礎資料


import requests
from bs4 import BeautifulSoup
import re

# 鏈家的二手房基礎頁面只顯示最多100頁,每頁30個房源的資料,也就是用這個辦法,最多可以拿到3000家房源的資料
page = 2 # 用於定義頁數
# 先開啟一個csv檔案,定義好標題,以備資料插入
with open(r'c:\lianjia.csv','a') as f:
    f.write('{},{},{},{},{},{},{},{},{},{},{},{},\n'.format('房源編號','小區','商圈','戶型','面積','朝向','戶型','裝修','年代','總價','單價','標題'))
    for i in range(1,page):
        url = 'https://xm.lianjia.com/ershoufang/pg'+str(i)
        # print(url)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66'
        }

        html = requests.get(url,headers = headers).text
        soup = BeautifulSoup(html,'html.parser')
        # print(soup)
        infos = soup.find('ul',{'class':'sellListContent'}).find_all('li')
        # print(infos)
        for info in infos:
            # 先獲取房源的標題內容,房源ID包含在標題中,獲取ID的辦法困擾了我很久,我相信一個簡潔的辦法一定是使用正規表示式獲取,不過我還沒研究透,所以用了土辦法,先轉化為文字進行切片,然後根據切片後的列表進行提取
            titleinfo = str(info.find('div',{'class':'title'}))
            titleinfolist = titleinfo.split('"')
            house_id = titleinfolist[7]
            # print(house_id)
            name = info.find('div',{'class':'title'}).find('a').get_text()
            # 由於小區名字和小區所屬商圈都在class=positionInfo這個切片下面,所以需要先將兩個名字放入列表,然後分別提取
            weizhi = info.find('div',{'class':'positionInfo'}).find_all('a')
            data_list = []
            for z in weizhi:
                data_list.append(z.get_text())
            xiaoqu = data_list[0]
            shangquan = data_list[1]
            # 有了小區名和位置,接下來就是看房子的具體資訊,同樣需要先轉為列表然後切片
            houseinfo = info.find('div',{'class':'houseInfo'}).get_text()
            houseinfolist = houseinfo.split('|')
            roominfo = houseinfolist[0]
            # 面積是浮點數,要用正規表示式提取
            mianji = re.findall(r'-?\d+\.?\d*e?-?\d*?',houseinfolist[1])[0]
            chaoxiang = houseinfolist[2]
            zhuangxiu = houseinfolist[3]
            louceng = houseinfolist[4]
            nian = houseinfolist[5]
            # louxing = houseinfolist[6]
            # 接下來是總價
            totalprice = info.find('div',{'class':'totalPrice'}).find('span').text
            # 接下來是每平單價,用正規表示式提取整數
            unitprice = re.sub('\D','',info.find('div', {'class': 'unitPrice'}).find('span').text)
            # 接下來是存入csv

            f.write('{},{},{},{},{},{},{},{},{},{},{},{},\n'.format(house_id,xiaoqu,shangquan,roominfo,mianji,chaoxiang,zhuangxiu,louceng,nian,totalprice,unitprice,name))





相關文章