運行結(jié)果:
我的代碼:
from bs4 import BeautifulSoup
import requests
import time
# 建一個列表來收納從聚合頁面爬取到的所有信息頁面
house_url = []
# urls是所有聚合頁面的集合
urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(str(i)) for i in range(1,14)]
# 分析租房信息頁面
def url_analysis(url):
time.sleep(2)
# 請求租房頁面抚吠,并解析頁面信息
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text, 'lxml')
# 提取名稱(titles)、地址(house_addrs)携悯、價格(house_prices)饼煞、第一張房源圖片(house_imgs)刁品、
# 房東圖片(owner_imgs)辱姨、房東性別(owner_sexes)誊酌、房東姓名(owner_names)
titles = soup.select('div.con_l > div.pho_info > h4 > em')
house_addrs = soup.select('div.con_l > div.pho_info > p > span')
house_prices = soup.select('div.day_l > span')
house_imgs = soup.select('img[id="curBigImage"]')
owner_imgs = soup.select('div.member_pic > a > img')
owner_sexes = soup.select('div.member_pic > div')
owner_names = soup.select('div.w_240 > h6 > a')
for title, add, price, img, pic, sex, name in \
zip(titles, house_addrs, house_prices, house_imgs, owner_imgs, owner_sexes, owner_names):
# 這里要注意考慮性別沒有填寫的情況
if sex.get('class')[0] == 'member_ico':
sex = '男'
elif sex.get('class')[0] == 'member_ico1':
sex = '女'
else:
sex = '保密'
# 把所有獲取的信息匯總成一個詞典
data = {
'title' : title.get_text(),
'add' : add.get_text().rstrip(),
'price' : '¥ '+price.get_text(),
'img' : img.get('src'),
'pic' : pic.get('src'),
'sex' : sex,
'name' : name.get_text()
}
print(data)
# 從聚合頁面獲取租房頁面地址
def url_get(url):
time.sleep(3)
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text, 'lxml')
house = soup.select('ul.pic_list.clearfix > li > a')
for urls in house:
urls = urls.get('href')
house_url.append(urls)
return house_url
#起點
for single_url in urls:
url_get(single_url)
print('總共爬取到',len(house_url),'條信息')
for each_url in house_url:
print('這是第',house_url.index(each_url) + 1,'條租房信息')
url_analysis(each_url)
我的感想:
- 用時接近3個小時(⊙o⊙)…
- 真的很怕運行到第100多條的時候報錯(多謝群友提醒性別的if條件要分3個)
- 每個soup.select都是寫一個打印一個(如果返回的是多個元素的打印 len() 比較實用)蹦漠,提取不出來就要改 CSS.selector
- soup.select返回的都是列表椭员,但其中的元素都是 bs4.tag
- 貌似以前看到過,用try笛园、except來避免出錯而中斷運行
-
這邊還有群友的一個關(guān)于性別的處理方式隘击,用字典查詢來替換if/else,另外也沒有用for循環(huán)來迭代研铆,而是直接切片(里面只有一個元素)
一個懸而未決的問題:
為什么 sex.get() 返回的是一個列表 而 pic.get() 返回的是一個字符串呢埋同??