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').text print(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").text print(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)}")