前言
笔者在做一个 NLPNLPNLP 项目时,需要识别小区名,因此想要查询网上是否有相关的数据集。经过一番搜索后一无所获…从而决定自己来爬取这份数据。
由于爬取网站的内容信息之后可能会发生变更,因此此处给出具体的爬虫思路,便于应对之后的网站结构变更。
方法
1. 爬取网站的确定
既然是爬虫,那首先就需要确定爬取网站。这时候就需要思考哪些网站可能会涉及小区名字?
国家统计网?经过一番搜索,没找到…
房屋中介网?√
因此我们可以选取比较知名的房屋中介网来进行小区名爬取,此处选取的网站是链家,原因是该网站有专门的小区板块。链家
新龙城
因此我们增加一行代码来提取 imgimgimg 标签中的信息并输出。
text_list = soup.find_all('img', class_="lj-lazy")
for item in text_list:
print(item['alt'])
# 输出结果:
# 首开康乃馨城
# 农光里
# 理想家园
# 华贸城
# 住欣家园
# 远洋山水
# 旗胜家园
# 小南庄社区
# ...
第三步,构造网站 urlurlurl
首先我们考虑页面如何构造。这个难度不大,我们只需要 forforfor 一遍页面编号即可。这个网站有一个特点在于,网站上可能只显示了 303030 页,但是实际上可能有 100100100 页…并且假如第 100100100 页是最后一页,那么第 101101101 页的内容将与第 100100100 页保持一致。因此我们根据当前网页是否与上一个网页一致,来判断当前网站爬取是否结束。
def get_housing_estate():
fo = open("data/housing_estate.txt", "w")
# 设置初始值
last = BeautifulSoup(requests.get(url.format("wz", 1)).text, 'lxml').find_all('img', class_="lj-lazy")
for city in address_list:
for page in range(1, 500):
print(city, page)
# 创建bs对象
try:
response = requests.get(url.format(city, page)).text
except:
# 页面出错,则更换下一个城市
break
soup = BeautifulSoup(response, 'lxml') # 使用到了lxml解析库
text_list = soup.find_all('img', class_="lj-lazy")
# 出现重复页面
if text_list == last:
break
last = text_list
# 写入文件
for item in text_list:
fo.write(item['alt'] + 'n')
接下来就要考虑城市简写如何爬取了。我们可以根据这个网站中提供的城市分类来对网站进行爬取。