結果
爬取結果
__author__ = 'CP6'
from bs4 import BeautifulSoup
import requests
import time
url = 'http://bj.xiaozhu.com/fangzi/3781218930.html'
urls = ['http://bj.xiaozhu.com/zhengzu-duanzufang-p{}-0/'.format(str(i)) for i in range(1, 10)]
'''
http://bj.xiaozhu.com/zhengzu-duanzufang-p1-0/
http://bj.xiaozhu.com/zhengzu-duanzufang-p2-0/
'''
def getRentGender(className):
if className == ['member_boy_ico']:
return '男'
elif className == ['member_girl_ico']:
return '女'
def getRentGender2(className):
if ''.join(className).find('girl') != -1 :
return '男'
else :
return '女'
def getLinks(url,data=None):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
links = soup.select('#page_list > ul > li > a')
for link in links:
getDetailInfo(link.get('href'))
def getDetailInfo(url,data=None):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
time.sleep(3)
titles = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em')
addresses = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > p > span')
prices = soup.select('div.day_l > span')
imgs = soup.select('#curBigImage')
rentimgs = soup.select('div.js_box.clearfix > div.member_pic > a > img')
names = soup.select('div.js_box.clearfix > div.w_240 > h6 > a')
genders = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > span')
# print(genders)
# print(genders.get_text().find('girl'));
for title,address,price,img,rentimg,name,gender in zip(titles,addresses,prices,imgs,rentimgs,names,genders):
data = {
'title':title.get_text(),
'address':address.get_text().split(),
'price':price.get_text(),
'img':img.get('src'),
'rentimgs':rentimg.get('src'),
'name':name.get_text(),
# 'gender':getRentGender(gender.get('class'))
'gender':getRentGender2(gender)
}
print(data)
# getDetailInfo(url)
# print(urls)
for single_url in urls:
getLinks(single_url)
# getLinks('http://bj.xiaozhu.com/zhengzu-duanzufang-p1-0/')
# getDetailInfo('http://bj.xiaozhu.com/fangzi/3781218930.html')
總結
-
難點:性別區分
Paste_Image1.png
Paste_Image2.png
檢查源碼可以看到就是一個span,直接爬取,然后get(‘class’)即可,根據獲取到的className做一個判斷。
def getRentGender(className):
if className == ['member_boy_ico']:
return '男'
elif className == ['member_girl_ico']:
return '女'
這里另外一個思路就是:根據className獲取到其中的關于性別的subStr,含有boy就是男,含有girl就是女。
def getRentGender2(className):
if ''.join(className).find('girl') != -1 :
return '男'
else :
return '女'
先把一個list(其實就是className),轉換成一個str,然后查找這個str中是否還有‘girl’(這里的判斷其實不是很嚴謹,但是對于本例還是適用的。)
-
Python的結構化語法
// 意思就是把一個str中的變化的部分,用{}替換,外部來更新說明它的變化方式。
// 也就是{}被替換為一個str,這個str是[1, 10)的數字字符串
urls = ['test{}test/'.format(str(i)) for i in range(1, 10)]
一個復雜的字符串數組,用一行代碼就完成了。
-
去掉str后面的空格
原始方法
'address':address.get_text()
'address': '北京市西城區德勝門內大街\n '
1. str.split()方法
'address':address.get_text().split()
'address': ['北京市西城區德勝門內大街'],
2. stripped_strings
'address':list(address.stripped_strings),
'address': ['北京市西城區德勝門內大街']
3. 前面2中方式都是變成list打印出來,strip可以去掉空格,保留str格式
'address': address.get_text().strip(),
'address': '北京市西城區德勝門內大街'