python爬虫爬取房源信息

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 写这篇博客的原因是在我爬取房产这类数据信息的时候,发现csdn中好多博主写的关于此类的文章代码已经不适用,因为好多房产网站代码已经更改,使用老的代码明显爬取不到所需要的房产信息。......

   目录

一、数据获取与预处理

二、csv文件的保存

三、数据库存储

四、爬虫完整代码

五、数据库存储完整代码


写这篇博客的原因是在我爬取房产这类数据信息的时候,发现csdn中好多博主写的关于此类的文章代码已经不适用,因为好多房产网站代码已经更改,使用老的代码明显爬取不到所需要的房产信息。这篇博客是根据58同城中的二手房源代码进行爬取的,有遇到问题的伙伴可以借鉴一下,由于博主水平有限,所以有什么错误的地方还望各位伙伴评论区指正,谢谢~

一、数据获取与预处理

1、导入模块

python爬取网站信息采用的几种库和方法分别问beautifulsoup、Xpath、正则表达式,而此处我使用的是xpath。原因很简单,房源网站源代码使用xpath比较好提取数据,建议所有python学习者将爬虫方法都学一遍,这样的话遇到不同的网站就可以使用不同的方法来达到简单爬取所需信息的目的。

代码如下所示:

import csv
from lxml import etree
import requests

image.gif

其中csv模块是用来将爬取的信息存入到Excel表格中

而从lxml中导入的etree模块是用来接下来进行的xpath提取

requests模块是用来向网站进行请求

2、请求头

众所周知,大部分比较完善的网站会有反爬虫机制,所以如果想要爬取该类网站信息,就必须模拟浏览器向网站发送请求,这样才能得到网站回应,爬取到所需要的数据信息。

代码如下所示:

head = {
        "Cookie": "f=n; commontopbar_new_city_info=556%7C%E6%B4%9B%E9%98%B3%7Cluoyang; commontopbar_ipcity=luoyang%7C%E6%B4%9B%E9%98%B3%7C0; userid360_xml=63226CD4C488B4612A7CCA415FEE6165; time_create=1661081634551; id58=CocIJ2LOv3m4X1fRhY/DAg==; aQQ_ajkguid=3EDCDC81-7B5E-4F6F-8C2F-7DABDAFD1348; sessid=ABBD4809-9E9F-45ED-95C1-862EEAFB53D7; ajk-appVersion=; ctid=556; fzq_h=91e3ec8f25dd1406bc61b2a97f769b73_1658489614032_98fa3aa955c544e78ef3d56396c75d7b_47896385561765975701177718252511739399; 58tj_uuid=94e99d7b-f5fd-490e-9527-8d4e7244e894; new_uv=1; utm_source=; spm=; init_refer=; als=0; 58home=luoyang; f=n; new_session=0; xxzl_cid=44f564fa5d724ccd91387882f148211b; xzuid=fbd94eca-007c-4a45-b357-3f5c108e2646",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/103"
    }

image.gif

3、提取网站信息

代码如下所示:

baseurl = "https://{0}.58.com/ershoufang/p{1}/?PGTID=0d200001-0022-c260-609a-771473e6f2e5&ClickID=1".format(city,page)
req = requests.get(baseurl, headers = head)
req_xpath = etree.HTML(req.text)

image.gif

4、数据清洗

代码如下所示:

# 获取名字
    housename = req_xpath.xpath('//h3[@class="property-content-title-name"]/@title')
    # 获取房产链接
    houselink = req_xpath.xpath('//a[@data-action="esf_list"]/@href')
    # 获取建造时间
    housedate = req_xpath.xpath('//p[@class="property-content-info-text"]/text()')
    Housedate = ','.join(housedate)
    Housedate = Housedate.replace('\n', '')
    Housedate = Housedate.replace(' ', '')
    HouseData = []
    HouseDataend = []
    hstring = ''
    for i in Housedate:
        hstring += i
        if i == ',':
            HouseData.append(hstring)
            hstring = ''
    for k in range(0, len(HouseData), 3):
        for j in range(k+3, len(HouseData), 3):
            HouseData1 = ''.join(HouseData[k:j])
            HouseDataend.append(HouseData1)
            break
    # 获取户型
    housetype = req_xpath.xpath('//p[@class="property-content-info-text property-content-info-attribute"]/span[@data-v-f11722e6]/text()')
    allhousetype = []
    temp = ''
    for i in housetype:
        temp += i
        if len(temp) == 6:
            allhousetype.append(temp)
            temp = ''
    # 获取价格
    houseprice = req_xpath.xpath('//p[@class="property-price-average"]/text()')
    # 获取房地产名称
    houseName = req_xpath.xpath('//p[@class="property-content-info-comm-name"]/text()')
    # 获取房地产地段
    houseaddress = req_xpath.xpath('//p[@class="property-content-info-comm-address"]/span[@data-v-f11722e6]/text()')
    Houseaddress = []
    for k in range(0, len(houseaddress), 3):
        for j in range(k+3, len(houseaddress),3):
            houseaddress1 = "-".join(houseaddress[k:j])
            Houseaddress.append(houseaddress1)
            break

image.gif

爬取结果如下所示:

image.gif编辑

二、csv文件的保存

一般我们从网站上爬取到的信息都要存入Excel这种表格中,才能够再存入数据库,至少我是这么做的,可能有更高明的技术人员会更简单的方法。

代码如下所示:

headers = ['房产相关信息', '房产名称' , '房产链接','户型', '价格', '建造岁月和面积等', '地段']
rows = zip(housename, houseName,houselink, allhousetype, houseprice, HouseDataend, Houseaddress)
with open(csvfilepath, 'w', encoding='utf-8', newline= '') as f:
    f_csv = csv.writer(f)     # 创建csv.writer对象
    f_csv.writerow(headers)
    for row in rows:
        f_csv.writerow(row)

image.gif

在此我使用的是csv文件存储,当然也可以使用别的如xlwt模块等等。

三、数据库存储

1、模块导入

代码如下所示:

import pymysql
import pandas as pd

image.gif

由于我使用的是mysql数据库存储,所以导入了pymysql模块,当然如果有人使用sqlite3也是可以的,没有太大影响。

而pandas模块则是用来从csv文件中提取信息存储到数据库中去的。

2、数据库连接

connect = pymysql.connect(host = "127.0.0.1", port = 3306, user = "root", 密码(password) = " ", database = "housedata", charset = "utf8" )
cursor = connect.cursor()

image.gif

数据库存储必须先进行数据库的连接,一般的框架和我的差不多,大家只需要按此输入自己的mysql信息即可。

3、csv文件读取

# 读取csv文件数据
    csv_name = r'E:\pythonProjectSpider\house.csv'
    data = pd.read_csv(csv_name, encoding = "utf-8")
    data = data.where(data.notnull(), None)
    Data = list(data.values)

image.gif

4、数据库表头创建

# 创建数据库表头
    query = "drop table if exists house"  # 若已有数据表hose,则删除
    cursor.execute(query)
    sql = "create table if not exists house(description varchar (100), housename varchar (100), houselink varchar (1000), housetype varchar (100), houseprice varchar (100), mainmessage varchar (100), houseaddree varchar (100)) default charset=utf8;"
    cursor.execute(sql)
    connect.commit()

image.gif

5、数据库信息导入

# 写入数据库
    for data in Data:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'
        sql = """insert into house values(%s)""" % ",".join(data)
        cursor.execute(sql)
        connect.commit()
    print("植入成功")

image.gif

所有操作完成后记得关闭数据库,这是必要操作。

# 关闭数据库
    connect.close()
    cursor.close()

image.gif

四、爬虫完整代码

import csv
from lxml import etree
import requests
def main():
    csvfilepath = 'E:\pythonProjectSpider\house.csv'
    getData(csvfilepath)
def getData(csvfilepath):
    head = {
        "Cookie": "f=n; commontopbar_new_city_info=556%7C%E6%B4%9B%E9%98%B3%7Cluoyang; commontopbar_ipcity=luoyang%7C%E6%B4%9B%E9%98%B3%7C0; userid360_xml=63226CD4C488B4612A7CCA415FEE6165; time_create=1661081634551; id58=CocIJ2LOv3m4X1fRhY/DAg==; aQQ_ajkguid=3EDCDC81-7B5E-4F6F-8C2F-7DABDAFD1348; sessid=ABBD4809-9E9F-45ED-95C1-862EEAFB53D7; ajk-appVersion=; ctid=556; fzq_h=91e3ec8f25dd1406bc61b2a97f769b73_1658489614032_98fa3aa955c544e78ef3d56396c75d7b_47896385561765975701177718252511739399; 58tj_uuid=94e99d7b-f5fd-490e-9527-8d4e7244e894; new_uv=1; utm_source=; spm=; init_refer=; als=0; 58home=luoyang; f=n; new_session=0; xxzl_cid=44f564fa5d724ccd91387882f148211b; xzuid=fbd94eca-007c-4a45-b357-3f5c108e2646",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/103"
    }
    city = input("请输入你要查看的城市: ")
    page = input("请属于你要查询的页数: ")
    baseurl = "https://{0}.58.com/ershoufang/p{1}/?PGTID=0d200001-0022-c260-609a-771473e6f2e5&ClickID=1".format(city,page)
    req = requests.get(baseurl, headers = head)
    req_xpath = etree.HTML(req.text)
    # 获取名字
    housename = req_xpath.xpath('//h3[@class="property-content-title-name"]/@title')
    print(housename)
    # 获取房产链接
    houselink = req_xpath.xpath('//a[@data-action="esf_list"]/@href')
    print(houselink)
    # 获取建造时间
    housedate = req_xpath.xpath('//p[@class="property-content-info-text"]/text()')
    Housedate = ','.join(housedate)
    Housedate = Housedate.replace('\n', '')
    Housedate = Housedate.replace(' ', '')
    HouseData = []
    HouseDataend = []
    hstring = ''
    for i in Housedate:
        hstring += i
        if i == ',':
            HouseData.append(hstring)
            hstring = ''
    for k in range(0, len(HouseData), 3):
        for j in range(k+3, len(HouseData), 3):
            HouseData1 = ''.join(HouseData[k:j])
            HouseDataend.append(HouseData1)
            break
    print(HouseDataend)
    # 获取户型
    housetype = req_xpath.xpath('//p[@class="property-content-info-text property-content-info-attribute"]/span[@data-v-f11722e6]/text()')
    allhousetype = []
    temp = ''
    for i in housetype:
        temp += i
        if len(temp) == 6:
            allhousetype.append(temp)
            temp = ''
    print(allhousetype)
    # 获取价格
    houseprice = req_xpath.xpath('//p[@class="property-price-average"]/text()')
    print(houseprice)
    # 获取房地产名称
    houseName = req_xpath.xpath('//p[@class="property-content-info-comm-name"]/text()')
    print(houseName)
    # 获取房地产地段
    houseaddress = req_xpath.xpath('//p[@class="property-content-info-comm-address"]/span[@data-v-f11722e6]/text()')
    Houseaddress = []
    for k in range(0, len(houseaddress), 3):
        for j in range(k+3, len(houseaddress),3):
            houseaddress1 = "-".join(houseaddress[k:j])
            Houseaddress.append(houseaddress1)
            break
    print(Houseaddress)
    # csv文件保存
    headers = ['房产相关信息', '房产名称' , '房产链接','户型', '价格', '建造岁月和面积等', '地段']
    rows = zip(housename, houseName,houselink, allhousetype, houseprice, HouseDataend, Houseaddress)
    with open(csvfilepath, 'w', encoding='utf-8', newline= '') as f:
        f_csv = csv.writer(f)     # 创建csv.writer对象
        f_csv.writerow(headers)
        for row in rows:
            f_csv.writerow(row)
if __name__ == '__main__':
    main()

image.gif

五、数据库存储完整代码

import pymysql
import pandas as pd
def saveDB():
    connect = pymysql.connect(host = "127.0.0.1", port = 3306, user = "root", 密码(password) = "", database = "housedata", charset = "utf8" )
    cursor = connect.cursor()
    # 读取csv文件数据
    csv_name = r'E:\pythonProjectSpider\house.csv'
    data = pd.read_csv(csv_name, encoding = "utf-8")
    data = data.where(data.notnull(), None)
    Data = list(data.values)
    # 创建数据库表头
    query = "drop table if exists house"  # 若已有数据表hose,则删除
    cursor.execute(query)
    sql = "create table if not exists house(description varchar (100), housename varchar (100), houselink varchar (1000), housetype varchar (100), houseprice varchar (100), mainmessage varchar (100), houseaddree varchar (100)) default charset=utf8;"
    cursor.execute(sql)
    connect.commit()
    # 写入数据库
    for data in Data:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'
        sql = """insert into house values(%s)""" % ",".join(data)
        cursor.execute(sql)
        connect.commit()
    print("植入成功")
    # 关闭数据库
    connect.close()
    cursor.close()
if __name__ == '__main__':
    saveDB()

image.gif

数据库存储结果:

image.gif编辑


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
4天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
30 10
|
7天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
8天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
17天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
22天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
29天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
8月前
|
开发者 索引 Python
实践:如何使用python在网页的表格里抓取信息
实践:如何使用python在网页的表格里抓取信息
130 0
|
SQL 关系型数据库 数据库连接
使用python3抓取pinpoint应用信息入库
使用python3通过pinpoint api来获取pinpoint中应用基础信息、上下游链路,并入库
1981 0