python爬虫:爬取链家深圳全部二手房的详细信息

1、问题描述:

爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中

2、思路分析:

(1)目标网址:https://sz.lianjia.com/ershoufang/

(2)代码结构:

class LianjiaSpider(object):

    def __init__(self):

    def getMaxPage(self, url): # 获取maxPage

    def parsePage(self, url): # 解析每个page,获取每个huose的Link

    def parseDetail(self, url): # 根据Link,获取每个house的详细信息

(3) init(self)初始化函数

· hearders用到了fake_useragent库,用来随机生成请求头。

· datas空列表,用于保存爬取的数据。

def __init__(self):
    self.headers = {"User-Agent": UserAgent().random}
    self.datas = list()

(4) getMaxPage()函数

主要用来获取二手房页面的最大页数.

def getMaxPage(self, url):
    response = requests.get(url, headers = self.headers)
    if response.status_code == 200:
        source = response.text
        soup = BeautifulSoup(source, "html.parser")
        pageData = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]
        # pageData = ‘{"totalPage":100,"curPage":1}‘,通过eval()函数把字符串转换为字典
        maxPage = eval(pageData)["totalPage"]
        return  maxPage
    else:
        print("Fail status: {}".format(response.status_code))
        return None

(5)parsePage()函数

主要是用来进行翻页的操作,得到每一页的所有二手房的Links链接。它通过利用一个for循环来重构 url实现翻页操作,而循环最大页数就是通过上面的 getMaxPage() 来获取到。

def parsePage(self, url):
    maxPage = self.getMaxPage(url)
    #  解析每个page,获取每个二手房的链接
    for pageNum in range(1, maxPage+1 ):
        url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pageNum)
        print("当前正在爬取: {}".format(url))
        response = requests.get(url, headers = self.headers)
        soup = BeautifulSoup(response.text, "html.parser")
        links = soup.find_all("div", class_ = "info clear")
        for i in links:
            link = i.find("a")["href"]    #每个<info clear>标签有很多<a>,而我们只需要第一个,所以用find
            detail = self.parseDetail(link)
            self.datas.append(detail)

(6)parseDetail()函数

根据parsePage()函数获取的二手房Link链接,向该链接发送请求,获取出详细页面信息。

def parseDetail(self, url):
    response = requests.get(url, headers = self.headers)
    detail = {}
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")
        detail["价格"] = soup.find("span", class_ = "total").text
        detail["单价"] = soup.find("span", class_ = "unitPriceValue").text
        detail["小区"] = soup.find("div", class_ = "communityName").find("a", class_ = "info").text
        detail["位置"] = soup.find("div", class_="areaName").find("span", class_="info").text
        detail["地铁"] = soup.find("div", class_="areaName").find("a", class_="supplement").text
        base = soup.find("div", class_ = "base").find_all("li") # 基本信息
        detail["户型"] = base[0].text[4:]
        detail["面积"] = base[2].text[4:]
        detail["朝向"] = base[6].text[4:]
        detail["电梯"] = base[10].text[4:]
        return detail
    else:
        return None

(7)将数据存储到CSV文件中

这里用到了 pandas 库的 DataFrame() 方法,它默认的是按照列名的字典顺序排序的。想要自定义列的顺序,可以加columns字段。

    #  将所有爬取的二手房数据存储到csv文件中
    data = pd.DataFrame(self.datas)
    # columns字段:自定义列的顺序(DataFrame默认按列名的字典序排序)
    columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]
    data.to_csv(".\Lianjia_II.csv", encoding=‘utf_8_sig‘, index=False, columns=columns)

3、效果展示

4、完整代码:

# -* coding: utf-8 *-
#author: wangshx6
#data: 2018-11-07
#descriptinon: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文

import requests
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent

class LianjiaSpider(object):

    def __init__(self):
        self.headers = {"User-Agent": UserAgent().random}
        self.datas = list()

    def getMaxPage(self, url):
        response = requests.get(url, headers = self.headers)
        if response.status_code == 200:
            source = response.text
            soup = BeautifulSoup(source, "html.parser")
            pageData = soup.find("div", class_ = "page-box house-lst-page-box")["page-data"]
            # pageData = ‘{"totalPage":100,"curPage":1}‘,通过eval()函数把字符串转换为字典
            maxPage = eval(pageData)["totalPage"]
            return  maxPage
        else:
            print("Fail status: {}".format(response.status_code))
            return None

    def parsePage(self, url):
        maxPage = self.getMaxPage(url)
        #  解析每个page,获取每个二手房的链接
        for pageNum in range(1, maxPage+1 ):
            url = "https://sz.lianjia.com/ershoufang/pg{}/".format(pageNum)
            print("当前正在爬取: {}".format(url))
            response = requests.get(url, headers = self.headers)
            soup = BeautifulSoup(response.text, "html.parser")
            links = soup.find_all("div", class_ = "info clear")
            for i in links:
                link = i.find("a")["href"]    #每个<info clear>标签有很多<a>,而我们只需要第一个,所以用find
                detail = self.parseDetail(link)
                self.datas.append(detail)

        #  将所有爬取的二手房数据存储到csv文件中
        data = pd.DataFrame(self.datas)
        # columns字段:自定义列的顺序(DataFrame默认按列名的字典序排序)
        columns = ["小区", "户型", "面积", "价格", "单价", "朝向", "电梯", "位置", "地铁"]
        data.to_csv(".\Lianjia_II.csv", encoding=‘utf_8_sig‘, index=False, columns=columns)

    def parseDetail(self, url):
        response = requests.get(url, headers = self.headers)
        detail = {}
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, "html.parser")
            detail["价格"] = soup.find("span", class_ = "total").text
            detail["单价"] = soup.find("span", class_ = "unitPriceValue").text
            detail["小区"] = soup.find("div", class_ = "communityName").find("a", class_ = "info").text
            detail["位置"] = soup.find("div", class_="areaName").find("span", class_="info").text
            detail["地铁"] = soup.find("div", class_="areaName").find("a", class_="supplement").text
            base = soup.find("div", class_ = "base").find_all("li") # 基本信息
            detail["户型"] = base[0].text[4:]
            detail["面积"] = base[2].text[4:]
            detail["朝向"] = base[6].text[4:]
            detail["电梯"] = base[10].text[4:]
            return detail
        else:
            return None

if __name__ == "__main__":
    Lianjia = LianjiaSpider()
    Lianjia.parsePage("https://sz.lianjia.com/ershoufang/")

原文地址:https://www.cnblogs.com/wangshx6/p/9923553.html

时间: 2024-08-01 11:19:36

python爬虫:爬取链家深圳全部二手房的详细信息的相关文章

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确定请求方式, 是否存在js加密等. 2. 新建scrapy项目 1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目 scrapy startproject lianjia 2. 在cmd中进入lianjia文件中, 创建Spider文件 cd lianjia scrapy genspi

Python爬取链家二手房数据——重庆地区

最近在学习数据分析的相关知识,打算找一份数据做训练,于是就打算用Python爬取链家在重庆地区的二手房数据. 链家的页面如下: 爬取代码如下: import requests, json, time from bs4 import BeautifulSoup import re, csv def parse_one_page(url): headers={ 'user-agent':'Mozilla/5.0' } r = requests.get(url, headers=headers) so

Python的scrapy之爬取链家网房价信息并保存到本地

因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ? 爬虫结构: ? 其中封装了一个数据库处理模块,还有一个user-agent池.. 先看mylianjia.py # -*- coding: utf-8 -*- import scrapy from ..items import LianjiaItem from scrapy.http import Request from parsel i

爬取链家任意城市租房数据(北京朝阳)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 15:56 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市租房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import os

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph