記一次python 爬蟲(chóng)爬取深圳租房信息的過(guò)程及遇到的問(wèn)題
為了分析深圳市所有長(zhǎng)租、短租公寓的信息,爬取了某租房公寓網(wǎng)站上深圳區(qū)域所有在租公寓信息,以下記錄了爬取過(guò)程以及爬取過(guò)程中遇到的問(wèn)題:
爬取代碼:
import requestsfrom requests.exceptions import RequestExceptionfrom pyquery import PyQuery as pqfrom bs4 import BeautifulSoupimport pymongofrom config import *from multiprocessing import Poolclient = pymongo.MongoClient(MONGO_URL) # 申明連接對(duì)象db = client[MONGO_DB] # 申明數(shù)據(jù)庫(kù)def get_one_page_html(url): # 獲取網(wǎng)站每一頁(yè)的html headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/85.0.4183.121 Safari/537.36' } try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: return None except RequestException: return Nonedef get_room_url(html): # 獲取當(dāng)前頁(yè)面上所有room_info的url doc = pq(html) room_urls = doc(’.r_lbx .r_lbx_cen .r_lbx_cena a’).items() return room_urlsdef parser_room_page(room_html): soup = BeautifulSoup(room_html, ’lxml’) title = soup.h1.text price = soup.find(’div’, {’class’: ’room-price-sale’}).text[:-3] x = soup.find_all(’div’, {’class’: ’room-list’}) area = x[0].text[7:-11] # 面積 bianhao = x[1].text[4:] house_type = x[2].text.strip()[3:7] # 戶型 floor = x[5].text[4:-2] # 樓層 location1 = x[6].find_all(’a’)[0].text # 分區(qū) location2 = x[6].find_all(’a’)[1].text location3 = x[6].find_all(’a’)[2].text subway = x[7].text[4:] addition = soup.find_all(’div’, {’class’: ’room-title’})[0].text yield { ’title’: title, ’price’: price, ’area’: area, ’bianhao’: bianhao, ’house_type’: house_type, ’floor’: floor, ’location1’: location1, ’location2’: location2, ’location3’: location3, ’subway’: subway, ’addition’: addition }def save_to_mongo(result): if db[MONGO_TABLE].insert_one(result): print(’存儲(chǔ)到mongodb成功’, result) return True return Falsedef main(page): url = ’http://www.xxxxx.com/room/sz?page=’ + str(page) # url就不粘啦,嘻嘻 html = get_one_page_html(url) room_urls = get_room_url(html) for room_url in room_urls: room_url_href = room_url.attr(’href’) room_html = get_one_page_html(room_url_href) if room_html is None: # 非常重要,否則room_html為None時(shí)會(huì)報(bào)錯(cuò) pass else: results = parser_room_page(room_html) for result in results:save_to_mongo(result)if __name__ == ’__main__’: pool = Pool() # 使用多進(jìn)程提高爬取效率 pool.map(main, [i for i in range(1, 258)])
在寫(xiě)爬取代碼過(guò)程中遇到了兩個(gè)問(wèn)題:
(一)在get_room_url(html)函數(shù)中,開(kāi)始是想直接return每個(gè)租房信息的room_url,但是return不同于print,函數(shù)運(yùn)行到return時(shí)就會(huì)結(jié)束該函數(shù),這樣就只能返回每頁(yè)第一個(gè)租房room_url。解決辦法是:return 包含每頁(yè)所有room_url的generator生成器,在main函數(shù)中用for循環(huán)遍歷,再?gòu)拿總€(gè)room_url中獲取href,傳入到get_one_page_html(room_url_href)中進(jìn)行解析。
(二)沒(méi)有寫(xiě)第76行的if語(yǔ)句,我默認(rèn)get_one_page_html(room_url_href)返回的room_html不為空,因此出現(xiàn)multiprocessing.pool.RemoteTraceback報(bào)錯(cuò):
上圖中顯示markup為None情況下報(bào)錯(cuò),點(diǎn)擊藍(lán)色'F:ProgramFilesanaconda3libsite-packagesbs4__init__.py'發(fā)現(xiàn)markup為room_html,即部分room_html出現(xiàn)None情況。要解決這個(gè)問(wèn)題,必須讓代碼跳過(guò)room_html is None的情況,因此添加 if 語(yǔ)句解決了這個(gè)問(wèn)題。
最終成功爬取某租房公寓深圳市258頁(yè)共4755條租房信息,為下一步進(jìn)行數(shù)據(jù)分析做準(zhǔn)備。
其中單條信息:
以上就是記一次python 爬蟲(chóng)爬取深圳租房信息的過(guò)程及遇到的問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于python 爬蟲(chóng)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python實(shí)現(xiàn)讀取類(lèi)別頻數(shù)數(shù)據(jù)畫(huà)水平條形圖案例2. python中PyQuery庫(kù)用法分享3. python操作數(shù)據(jù)庫(kù)獲取結(jié)果之fetchone和fetchall的區(qū)別說(shuō)明4. CSS3實(shí)現(xiàn)動(dòng)態(tài)翻牌效果 仿百度貼吧3D翻牌一次動(dòng)畫(huà)特效5. PHP獲取時(shí)間戳等相關(guān)函數(shù)匯總6. php5.6不能擴(kuò)展redis.so的解決方法7. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)8. Ajax實(shí)現(xiàn)頁(yè)面無(wú)刷新留言效果9. AJAX實(shí)現(xiàn)數(shù)據(jù)的增刪改查操作詳解【java后臺(tái)】10. ASP.NET MVC前臺(tái)動(dòng)態(tài)添加文本框并在后臺(tái)使用FormCollection接收值
