前言
筆者在做一個 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')
接下來就要考慮城市簡寫如何爬取了。我們可以根據這個網站中提供的城市分類來對網站進行爬取。