python3 使用BeautifulSoup爬取网页内容保存到csv

会有一股神秘感。 提交于 2019-12-06 17:17:59

以爬取房天下的租房信息为例:
需要爬取的字段有,户型,租金,面积,朝向,楼层,装修情况,标签,小区名称,地区
因为这个网站没有反爬虫所以不需要用到代理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)  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!