以爬取房天下的租房信息为例:
需要爬取的字段有,户型,租金,面积,朝向,楼层,装修情况,标签,小区名称,地区
因为这个网站没有反爬虫所以不需要用到代理IP
#导入模块
from bs4 import BeautifulSoup
import requests
def crawlFang(url,data,href): #定义一个爬取字段的函数
res = requests.get(url)
html=res.text #获取网页内容
#获取BeautifulSoup对象
soup=BeautifulSoup(html,'html.parser')
#寻找需要爬取内容的标签
div=soup.find('div',class_="houseList")
divs=div.find_all('dl',class_="list hiddenMap rel")
divs.pop(10) #第十一个标签是广告需要删掉
for each in divs:
#因为户型,朝向,是在一个字段中的,先把整个文本提取出来
text=each.find('dd',class_="info rel").find('p',class_="font15 mt12 bold").get_text().strip().split('|')
#户型
pattern=text[1] #在文本中在分别提取出户型和朝向
#朝向
toward=text[3]
#地区
county = each.find('dd', class_="info rel").find('p',class_="gray6 mt12").find('a').find('span').get_text()
#房租
money=each.find('dd',class_="info rel").find('div',class_="moreInfo").find('span').get_text()
# 标签
try:
label=each.find('dd',class_="info rel").find_all('p')[5].get_text() #有的标签是空的需要判断一下
except:
label='None'
# 小区
community=each.find('dd',class_="info rel").find('p',class_="gray6 mt12").find_all('a')[2].get_text()
#爬取详情页连接并保存到列表中 ,
href1=each.find('dd',class_="info rel").find('p',class_="title").find('a').attrs['href']
href2='http://sh.zu.fang.com'+str(href1)+''
href.append(href2)
data.append([pattern,toward,county,money,label,community])
return data,href
因为有些字段只有详情页中存在所以需要在详情页中爬取,定义一个爬取详情页的函数
def detailsFang(href,data1): #爬取详情页内容的函数
for i,each in enumerate(href): #通过循环一页一页爬取
# 获取网页
print(i+1)
# time.sleep()
res=requests.get(href)
html = res.text #获取详情页网页内容
# 获取BeautifulSoup对象
soup = BeautifulSoup(html, 'html.parser')
divs=soup.find('div',class_="tab-cont-right")
#获取面积
area=divs.find_all('div',class_="tr-line clearfix")[0].find('div',class_="trl-item1 w132").find_all('div')[0].get_text()
#楼层
floor=divs.find_all('div',class_="tr-line clearfix")[1].find('div',class_="trl-item1 w182").find_all('div')[0].get_text()
#装修
decorate=divs.find_all('div',class_="tr-line clearfix")[1].find('div',class_="trl-item1 w132").find_all('div')[0].get_text()
data1.append([area,floor,decorate])
return data1
定义一个保存函数,把爬取的内容保存到csv文件
import codecs
import csv
def saveFang(data,data1):
with codecs.open('FangTianXia1.csv', 'a', encoding='utf-8') as csvfile: #打开csv文件 ,追加
write=csv.writer(csvfile)
for i in range(len(data)): #通过储存字段列表的长度一条条保存
write.writerow([
data[i][0],data[i][1],data[i][2],data[i][3],data[i][4],data[i][5],
data1[i][0],data1[i][1],data1[i][2]]
)
def main(n): 主函数负责调用函数
for i in range(0,n):
print('第',i+1,'页')
data1=[] #因为我是爬取一页保存一页所以列表需要清空
data=[]
href=[]
url='http://sh.zu.fang.com/house/i3'+str(i+1)+'/' #每一次循环就换成下一页爬取
crawlFang(url,data,href)
detailsFang(href,data1)
saveFang(data,data1)
if __name__=='__main__':# 调用主函数
main(100)