结果
爬取结果__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')
总结
-
难点:性别区分
检查源码可以看到就是一个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': '北京市西城区德胜门内大街'
网友评论