python爬虫 request+bs4 爬取方天下二手房-csv文件写入

前言

我发现我最近不仅头发更绿了 而且还更加秃了!!我淦
在这里插入图片描述

这段时间比较忙再看APP爬虫 然后最近学校也比较多事 但还是抽出时间赶了这篇文章 我还是尽力写的很细心了 大家有问题可以在评论区提出来 我每天都会上CSDN的!

这篇文章其实也适用于链家二手房内容的爬取 我就不再开一个文章写了 大家改一下页面解析部分就可以使用了
不想听我唠嗑的可以跳到最后一步查看代码
部分知识点来源于网络 如侵立删

一丶整体思路

看过我之前文章的朋友 其实已经知道这个爬虫其实来说已经没有什么了 就是很普通的requests请求 然后bs4解析数据 然后写入 但我还是想写一下就相当于帮助自己总结了 一周一更嘛 嚯嚯嚯
在这里插入图片描述

二丶遇到的问题

这个页面的解析其实有点点小问题 就是到六个网页元素的时候会出现一个广告页面 那个文件的格式与其他条的网页元素不同 我当初第一次写用bs4的find不好爬下来 后面换了bs4的select就好了很多了!!yyds!

三丶分析URL

好勒 现在开始就到了分析url情节 其实分析多了 你也就会觉得很简单了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
url其实很简单就是 https://qd.esf.fang.com/house/i3为基础 后面加上要爬取的页面数即可 但是我发现如果直接输入https://qd.esf.fang.com/house/i31 当你第一次进入页面的时候会弹出一个滑动验证码验证 而且这个滑动验证码比较麻烦是不明显的滑动验证的 我淦 这真的好麻烦!(等我那天解决了 在来跟大家分享方法)所以你紧接着在后面传入一些参数 就能保证不弹出验证码

url = 'https://qd.esf.fang.com/house/i3'+ str(page)+ '/?rfss=1-212bb59906c9c7084a-6c'

四丶解析页面

其实就是一个简单的div元素下包含着数个dl元素 遍历获取即可 但是要注意第六个不是 建议使用select获取更加方便
在这里插入图片描述
这里使用data_list 和 data_dict 是为了方便写入csv文件 我后面会写个文章总的讲一下写入的方式

resp = requests.get(url, headers=get_headers())
    # 记得传入bs4需要content获取网页内容
    soup = BeautifulSoup(resp.content, 'lxml')

    # 筛选全部的li标签
    # 多添加了一个dataflag=bg的属性 筛选掉了广告页面
    sellListContent = soup.select('.shop_list dl.clearfix[dataflag="bg"]')
    # 循环遍历
    for sell in sellListContent:
            title = sell.select('h4.clearfix a ')[0].string.strip()#strip去除空格
            #数据总结
            houseInfo = list(sell.select('p.tel')[0].stripped_strings)#用来获取目标路径下所有的子孙非标签字符串,会自动去掉空白字符串,返回的是一个生成器
            
            #number_hals
            number_hals = houseInfo[0]
            #面积
            area = houseInfo[2]
            #楼层数
            number_floor = houseInfo[4]
            #方向
            direction = houseInfo[6]
            #人或者年份
            man = houseInfo[8]

            data_dict = {}  # 用于存放每一页的数据
            data_dict['标题'] = title
            data_dict['楼层数'] = number_floor
            data_dict['厅数'] = number_hals
            data_dict['面积'] = area
            data_dict['方向'] = direction
            data_dict['其他'] = man

            data_list.append(data_dict)#追加数据进入全局data_list方便cvs写入

            # print(data_list)#打印列表
            # print(data_dict) #打印字典

五丶写入文件

这里写入文件先定义一个全局的data_list方便用来传入全部的数据 在解析页面的函数中在定义一个data_dict列表 用来存储当前页面下的数据 然后for循环追加遍历 这样无论data_dict字典中永远都是当前页面下的数据 而data_list是全部的数据

    with open('data_csv.csv', 'w', newline='') as f: #创建了个文件 作为f

        title = data_list[0].keys()  # 表头

        # 创建writer对象
        writer = csv.DictWriter(f, title) # 写入表头

        writer.writeheader()
        # 批量写入数据
        writer.writerows(data_list)#data_list文件中已经是全部的数据了
    print('csv文件写入完成')

六丶完整代码

麻烦大家没事多sleep一下 我不管你 有没有代理ip都多sleep一下 防止被禁止ip了!(苦口婆心)

import requests
from bs4 import BeautifulSoup
import json
import csv
import time
import random

# 构建请求头
def get_headers():#这个方法是随机传入User-Agent防止被封IP 不过作用应该没代理IP的作用大
    user_agents =  ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11', 'User-Agent:Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;', 'Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11', 'Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)']
    time.sleep(random.randint(0, 3))#间隔一段时间在爬取

    headers = {'User-Agent':random.choice(user_agents)}
    return headers


# 声明一个列表存储字典
data_list = [] #用于存放总数据


def start_spider(page):
    # 请求url
    url = 'https://qd.esf.fang.com/house/i3'+ str(page)+ '/?rfss=1-212bb59906c9c7084a-6c'

    resp = requests.get(url, headers=get_headers())
    # 记得传入bs4需要content获取网页内容
    soup = BeautifulSoup(resp.content, 'lxml')

    # 筛选全部的li标签
    # 多添加了一个dataflag=bg的属性 筛选掉了广告页面
    sellListContent = soup.select('.shop_list dl.clearfix[dataflag="bg"]')
    # 循环遍历
    for sell in sellListContent:
        title = sell.select('h4.clearfix a')[0].string.strip()  # strip去除空格
        # 数据总结
        houseInfo = list(sell.select('p.tel')[0].stripped_strings)  # 用来获取目标路径下所有的子孙非标签字符串,会自动去掉空白字符串,返回的是一个生成器

        # number_hals
        number_hals = houseInfo[0]
        # 面积
        area = houseInfo[2]
        # 楼层数
        number_floor = houseInfo[4]
        # 方向
        direction = houseInfo[6]
        # 人或者年份
        man = houseInfo[8]

        data_dict = {}  # 用于存放每一页的数据
        data_dict['标题'] = title
        data_dict['楼层数'] = number_floor
        data_dict['厅数'] = number_hals
        data_dict['面积'] = area
        data_dict['方向'] = direction
        data_dict['其他'] = man

        data_list.append(data_dict)#追加数据进入全局data_list方便cvs写入

        # print(data_list)#打印列表
        # print(data_dict) #打印字典
def main():
    # 只爬取10页
    for i in range(1,2):
        start_spider(i)
        print('已经抓完'+str(i)+'页面')
        time.sleep(3)
        
    # 将数据写入csv文件
    #先list存完全部数据 在写入
    with open('data_csv.csv', 'w',  newline='') as f: #创建了个文件 作为f
        title = data_list[0].keys()  # 表头
        # 创建writer对象
        writer = csv.DictWriter(f, title) # 传入表头数据
        
        writer.writeheader()#写入表头数据
        # 批量写入数据
        writer.writerows(data_list)
    print('csv文件写入完成')

if __name__ == '__main__':
    main()

最后

我就是一位普通的爬虫爱好者?所以很多地方写的技术可能不是很好 大家轻点喷 轻点喷!祝大家技术蒸蒸日上 早日挣大钱!
在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值