1.抓取鏈家前十頁的數據
鏈家網址:長沙房產網_長沙房地產_長沙房產門戶(長沙鏈家網)
1.1.計算均價和總價
import time ? from selenium import webdriver from selenium.webdriver.common.by import By ? driver = webdriver.Chrome() driver.get("https://cs.lianjia.com/zufang/rs岳麓區/") ? # 總價 total = 0 # 記錄房間個數 size = 0 ? for i in range(2):elements = driver.find_elements(By.CSS_SELECTOR, '.content__list--item--main')print(f"第{i+1}頁的數據:")for el in elements:# 獲取租房標題name = el.find_element(By.CSS_SELECTOR, '.content__list--item--title a').text# 判斷是否包含獨棟信息if name.__contains__("獨棟"):continue# 獲取租房的價格price = el.find_element(By.CSS_SELECTOR, '.content__list--item-price em').textprint(f"name={name},price={price}")total += float(price)# 記錄房間的個數size += len(elements)# 點擊下一頁driver.find_element(By.CSS_SELECTOR,'a.next').click()# 模擬睡眠6秒time.sleep(2) ? print(f"總價:{total},岳麓區的租房均價為:{total/size}")
1.2.計算的類型(整租,合租)
str = """ name=整租·萬科里金域國際 4室2廳 南,price=4500 name=獨棟·魔方公寓 長沙航天溪湖店 連鎖公寓直租無中介費 1室1廳,price=1800 name=整租·瀟湘奧林匹克花園 1室1廳 南,price=2200 name=合租·達美美立方 5居室 復式 南臥,price=999 name=整租·萬科里金域國際 3室2廳 南,price=3400 """ # 計算的類型(整租,合租) print("整租:", str.count("整租")) print("合租:", str.count("合租"))
1.3.計算的房型
由于在爬取的數據中存在
“居室”
和“室”
的區別,所以請將所有的“居室”
數據替換成“室”
。str = """ name=整租·萬科里金域國際 4室2廳 南,price=4500 name=獨棟·魔方公寓 長沙航天溪湖店 連鎖公寓直租無中介費 1室1廳,price=1800 name=整租·瀟湘奧林匹克花園 1室1廳 南,price=2200 name=合租·達美美立方 5居室 復式 南臥,price=999 name=整租·萬科里金域國際 3室2廳 南,price=3400 """ import re import collections st = str.replace('居室','室') rs = re.findall(r'\d室',st) print(rs) print(collections.Counter(rs))
2.抓取boss直聘前十頁的數據
boss直聘網址:「北京招聘網」海量北京人才招聘信息 - BOSS直聘
2.1.抓取boss直聘前十頁的數據
其中參數
city=101020100
是中國天氣網全城市代碼weather_cityId
。from selenium import webdriver from selenium.webdriver.common.by import By import time ? driver = webdriver.Chrome() driver.get("https://www.zhipin.com/web/geek/job?query=java&city=101020100") ? jobs = [] ? for i in range(3):time.sleep(6)elements = driver.find_elements(By.CSS_SELECTOR, ".job-card-wrapper")for el in elements:# 獲取地區area = el.find_element(By.CSS_SELECTOR,"span.job-area").text# 獲取薪酬salary = el.find_element(By.CSS_SELECTOR,"span.salary").textprint(f"area={area},salary={salary}")jobs.append({'area':area,'salary':salary})driver.find_element(By.CSS_SELECTOR,".selected+a").click() ? print(jobs)
2.2.將獲取數據本地序列化
Python的pickle
模塊是一種用于序列化(將對象轉換為字節流)和反序列化(將字節流轉換回對象)Python對象的工具。它可以將Python對象保存到文件中或從文件中加載對象。
pickle
模塊還有其他一些有用的函數和特性。以下是一些常見的功能:
-
pickle.dumps(obj)
:將對象序列化為字節流,但不保存到文件中。 -
pickle.loads(bytes_obj)
:從字節流中加載對象,而不是從文件中加載。 -
pickle.dump(obj, file)
:將對象序列化并保存到文件中。 -
pickle.load(file)
:從文件中加載序列化的對象。
# 將獲取到的結果保存到本地
p = Path("jobs.txt")
p.touch()
# 通過pickle.dump實現數據序列化
pickle.dump(jobs,p.open(mode="wb"))
2.3.計算每個區的需求個數與均價
# 計算每個區的需求個數與均價
jobs = pickle.load(open('jobs.txt',mode="rb"))
print(jobs)
areas=list(map(lambda a: "".join(re.findall(r'.*?·(.*?)·.*?',a['area'])),jobs))
print(areas)
import collections
rs = collections.Counter(areas)
?
for k,v in rs.items():print(f"【{k}】的工作崗位需求數:{v}")# 獲取該區的工作集合ps = list(filter(lambda e: e['area'].count(k) > 0, jobs))# 獲取該區的薪酬總價total = functools.reduce(lambda a,b:a+int(b['salary'].split('-')[0]),ps,0)print(f"該區的工作入門平均薪酬:{total/len(ps)}")