网页模板网站有那些网络广告营销方案
文章目录
- 一、项目简介
- 二、安居客网页分析
- 1、整体分析
- 2、细节分析
- 2.1提取一个页面所有的房源信息
- 2.2提取每个房源信息中的信息
- 2.3如何爬取下一页的房源信息
- 三、程序编写
- 1、数据去重
- 2、反爬虫策略
- 3、使用requests请求网页
- 4、爬取并解析网页
- 5、计算每个区县的平均房价
- 6、引入的文件库,以及一些之前代码没申明的全局变量
- 7、主函数
- 8、程序运行过程截图和最终文件截图
- 四、后记
一、项目简介
有20w的济南用户地址信息(所在区县+街道),用济南市安居客网站(https://jinan.anjuke.com/sale/)查找每个用户所在街道的二手房房源信息,并求出该街道下的所有二手房的平均房价,即xxx元/㎡。
最终输出按用户地址文件的原顺序(不要过滤也不要打乱顺序)
输出格式:工作地经度,工作地纬度,居住地经度,居住地纬度,区县,街道,房价
二、安居客网页分析
以“山东省济南市历城区东风街道”中的“东风街道”搜索为例,提示:在安居客想要按照街道名搜索房源时最好不要加区县名,因为会弹出整个区的所有信息,与街道没多大关系,影响数据质量
1、整体分析
观察下面图片,可以看到搜索结果的第一页链接为https://jinan.anjuke.com/sale/rd1/?q=搜索内容
第二页开始就有规律:https://jinan.anjuke.com/sale/p页数/?q=搜索内容
每一个结果页面最多可以存放60个房源信息,可以点击’下一页’查看剩下的搜索结果
2、细节分析
2.1提取一个页面所有的房源信息
查看源代码,发现每个房源信息是以div class="property"标签包装的,所以我们可以使用BeautifulSoup中的find_all方法来获取一个页面中的所有房源信息
bs = BeautifulSoup(response.text, 'html.parser')
houses = bs.find_all('div', class_="property")
2.2提取每个房源信息中的信息
根据需求,我们需要爬取每个房源的平均价格和具体地址,这里爬取地址是为了检查使用街道名搜索出来的房源信息是否是该区县的,因为其他区县也可能有这个街道名。
查看源代码,可以在源代码中使用Ctrl+F搜索关键字快速定位到我们需要的标签位置
为了从class="property"标签只取出我们需要的信息,我使用正则表达式查找每个item中指定的字符串(平均价格和所在地址)
# 平均价格
findAveragePrice = re.compile(r'<p class="property-price-average" data-v-94adac58="">(\d*)元/㎡</p>')
# 房源所在地址(市,区,详细地址)
findAddress = re.compile(r'<p class="property-content-info-comm-address" data-v-94adac58="">(.*?)</p>')
for item in houses:
# 根据正则表达式求出房源的地址
find_Address = re.findall(findAddress, str(item))[0]
# 为避免模糊查询的可能,还判断所查找的街区是否与房源地址一致,若一致,则加入价格
prices = []
if street in find_Address:price = re.findall(findAveragePrice, str(item))[0]print(find_Address, price)prices.append(float(price))
average_price = np.mean(prices)
2.3如何爬取下一页的房源信息
我们可以发现,安居客搜索结果页面不会显示出一共检索出了多少页面或者检索出了多少条信息。这样我们在写url时有难度,不好判断一共需要多少个url链接,是一大难点
那我们就先对比看看有没有下一页的源代码对比
可以发现,如果还有下一页,那么下一页按钮对应的class=“next next-active”;如果当前页面是最后一页,即没有下一页时,此时下一页按钮对应的class=“next click-forbid”,所以我们只需要判断class是什么即可知道有无下一页,是否请求对应的url
# 判断是否还有下一页
next_page