长租公寓算是国内正在规范化的一个产业,其中比较正规的比较大的有某如、某壳,想要对长租公寓行业做一些简单的数据分析,于是乎爬虫搞起来,柿子挑软的捏:从某壳下手。
爬虫策略
说实话,某壳的数据挺好爬的,没有比较变态的反爬措施(某如有:价格是图片,不过也好解决,下一篇写哈),只要不是频繁请求的话应该就没事儿(我都是sleep1秒以上的,反正就爬一次而已),本人不支持暴力爬取,动不动就多线程、多进程、代理都搞上了,没意思。。。其实还是数据量小,哈哈
- 我们爬取的是北京的房源,其他地区不在范围
- 公寓公司的找房策略就是围绕着地铁站进行的,因此爬取策略也是围绕地铁站,首先爬取各个地铁站的链接
- 翻页策略:进入地铁站页面后,有下图的页面选择,我们可以获取最大数字,然后生成链接;或者直接获取一下页链接。我选用的方式是后者
- 使用BeautifulSoup对页面进行分析,然后爬取数据
- 设置爬取间隔,1~2秒,随机选取
- 爬取数据存入mongodb
- 地铁链接存入redis,以取出爬取的方式以支持断点续爬
爬虫实践
获取各个地铁站的链接存入redis
地铁站数据情况:
- 首先获取各个地铁线路:
class
为dl_lst list subway
的dl
标签下所有,class
为area-ls-wp
的div
标签 - 循环各地铁线路,链接在
class
为sub_option_list
的div
标签下的a
标签中的href
详细代码如下:
# 获取城市地点和网站链接
def get_locations(rds):
url = 'https://www.dankegongyu.com/room/bj/d%E6%B5%B7%E6%B7%80%E5%8C%BA-b%E4%BA%94%E9%81%93%E5%8F%A3.html'
responese = requests.get(url=url, headers=headers)
soup = BeautifulSoup(responese.text, 'lxml')
locations = soup.find('dl', class_='dl_lst list subway').find_all('div', class_='area-ls-wp')
# 获取地区的url
for location in locations:
all_hrefs = location.find('div', class_='sub_option_list').find_all('a')
for href in all_hrefs:
key = href.text.strip()
rds.hset('danke_hash', key, href[