前言
在港校做RA期间,本周老师安排了爬取国内二手房的交易网站,我先调研对比了各平台,之后选取了房天下和贝壳的数据进行爬取
贝壳需要注册登录才能访问,房天下不需要
因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据
提示:以下是本篇文章正文内容,思路和代码可供参考
文章目录
一:前期调研
1.1 各二手房平台详细对比
1.1.1链家
网址:
在售数据
成交:
列表页:
详情页:
例如:https://bj.lianjia.com/ershoufang/101108567289.html
分为:三个部分
- 图片展示
- 基本信息
- 房源特色
1.1.2安居客
网址:
列表页:
缺点:
- 没有在售和已成交的区分
- 没有直观显示有多少房源
- 网站维护有问题,我在登陆时都没法登陆,难以保障数据的实时更新
详情页:
以此为例:
https://beijing.anjuke.com/prop/view/A5183579374?from=filter&spread=commsearch_p&uniqid=pc5f27c655bde998.84281277&position=1&kwtype=filter&now_time=1596442197
分为:两个部分
- 图片展示
- 房屋信息
1.1.3 房天下
网址:
[房天下])https://esf.fang.com/)
列表页:
上面显示有16万套待售,但真实性存疑,我查阅此软件评价较差,存在数据造假的问题
本网站也没有已成交的房源信息,不够全面
详情页:
感觉对房源的介绍极为敷衍随意,不如其他平台的仔细介绍,真实感较差
1.1.4贝壳网
网址:
在售:
已成交:
详情页:
贝壳的二手房详情更为丰富,网页主体分为四个部分,:
- 图片展示区
- 房源基本信息
- 房源特色:
- 户型空间
1.2 综合评价
贝壳网和链家是多名网友较为推崇的两个平台,经过查询,两个平台的数据相差不大,且都有在售和已成交的数据
而其他平台,网友评价较低,主要原因为数据造假,在本次查询中也出现此问题
链家和贝壳在房源数据方面,展示极为清晰,方便我们获知总成交数量,在详情页的介绍也明显比其他两个平台更加翔实,真实性,可靠性更高
1.3 最后需求确定
和老师进一步讨论之后,我们最后选择了贝壳和房天下,爬取北京市 近两年的二手房的在售和已成交
本次需求是先将新闻的概览信息保存到EXCEL文件,最后格式如下
|标题|时间|报社|版面号|版面信息|文章描述|正文url|
因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据
在保存上述简要信息的时候,我便将正文的url保存进txt文件,方便后续直接读写txt进行正文爬取
这种设计模式我觉得是做到了不同模块的解耦,如果有朋友有更好的想法也可以和我交流
最后正文保存格式如下:
按照 关键词-报道报社 - 新闻标题-正文 保存
因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据
二:网页结构的分析
2.1 网站首页
目标的url 为 :
http://www.apabi.com/pku/?pid=usp.advsearch&db=newspaper&cult=CN
除了pku 是不同机构或高校会改变这个字段,在检索查看的其他过程中,本url不变,完全使用Ajax的异步加载
给我们的自动化翻页,匹配信息,查询都带来了极大的挑战
我使用了request进行测试,发现没有办法获取到返回的信息,页面总是不相符,测试了好久,一直没有得到正确的内容
一筹莫展之际,我只能使用selenium就行匹配(但这也给后续的爬去埋下了一个巨大的坑)
查看网页源代码发现,请求之后,返回的是iframe,直接更新下面的搜索结果,我们需要的信息是在iframe里面去进行匹配,如果直接匹配页面的话,是匹配不到的
Selenium的好处是所见即所得,但是因为是模仿人的点击,速度极慢,而且书写代码时非常繁杂,点击选项时可能就是网页滑动了一下,便导致定位错误,无法匹配
2.2 使用selenium访问
以下是模拟点击页面的代码,可以看到匹配元素时非常麻烦
driver_path = r"G:\Daily_Life\Google_driver\chromedriver.exe"
def config(head_keyword,con_keyword,office_key):
url = "http://www.apabi.com/pku/?pid=usp.advsearch&db=newspaper&cult=CN"
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
try:
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=chrome_options)
driver.get(url)
time.sleep(1)
webdriver.common.action_chains.ActionChains(driver)
#保存详细信息结果
rows=[]
#保存文章
arts = []
#报纸