Python 爬取链家二手房,我在北京买房的经历

本节所讲内容:

链家网站前期分析

利用requests爬取数据

爬取数据存储MongoDB(代码请看最后)

链家网站前期分析

今天我们主要对链家二手房数据爬取,看下我们目前的资金能买那一套。链家二手房网站:https://bj.lianjia.com/ershoufang/

我们相对如上图所示的数据爬取,也就是两个数据,接下来开始分析

点击f12进入开发者模式,具体定位到如上图所示的元素节点中,然后利用xpath进行匹配

首先,右键点击tag标签,然后copy xpath,紧着着输入ctrl+f 进行搜索,如下图

我们已经定位到本页 的30条数据

然后我想获取到该节点下的title中的内容,所以我们需要接着往下匹配,如下图所示

可以看到明显匹配到30条数据,将xpath展示: //*[@class="info clear"]/div[1]/a/text()

紧接着我们想要匹配该房源的价格,依次往推导即可

如果第一个div代表1 那这个followInfo 代表的就是div[4]这个元素。

那就根据规律进行匹配,如下图

获取的匹配xpath路径为:

//*[@class="info clear"]/div[4]//div[@class='totalPrice']/span/text()

上面所讲解的是一页中的数据提取看,接下来我们想要提取更多的网页中的数据可以对整体的网址分析让我们分析总体网站的一个规律

https://bj.lianjia.com/ershoufang/pg/

https://bj.lianjia.com/ershoufang/pg2/

https://bj.lianjia.com/ershoufang/pg3/

通过上面的三条,可以总结一条规律。

基础地址:https://bj.lianjia.com/ershoufang/pg/

到这个地方为止我们分析网站就此结束,看下成果

1 链家网网站:https://bj.lianjia.com/ershoufang/

2 房源名xpath路径://*[@class="info clear"]/div[1]/a/text()

3 房源价格xpath路径:

//*[@class="info clear"]/div[4]//div[@class='totalPrice']/span/text()

4 基础网站:https://bj.lianjia.com/ershoufang/pg/

2. 利用requests爬取数据

上面已经了解这些接下来我们直接上代码

import requests
from lxml import etree
from fake_useragent import UserAgent
import pymysql,warnings
headers  = {
    'User-Agent':UserAgent().random
}

base_url = 'https://bj.lianjia.com/ershoufang/pg{}/'
#响应HTML交给parse_page解析
def load_page(url):
    try:
        res = requests.get(url,headers=headers)
        if res.status_code == 200:
            print('页面请求完毕')
            return res.text
    except:
        print('网络访问错误')
#解析HTML拿到想要的数据
def parse_page(html):
    xpath_content = etree.HTML(html)
    xpath_datas = xpath_content.xpath("//*[@class='info clear']")
    for data in xpath_datas:
        title = data.xpath('./div[1]/a/text()')
        price = data.xpath('./div[4]//div[@class="totalPrice"]/span/text()')
      print(title,price)
def main():
    for i in range(1,10):
        url = base_url.format(str(i))
        html = load_page(url)
        parse_page(html)
if __name__ == '__main__':
    main()

运行效果如下

3、存储到MongoDB中

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

import pymongo

DATABASE_IP = '127.0.0.1'#指定ip
DATABASE_PORT = 27017#指定端口
DATABASE_NAME = 'sun'#指定数据库

client = pymongo.MongoClient(DATABASE_IP,DATABASE_PORT)#连接
db = client.sun#连接数据库
collection = db.maoyan#生成表

总体代码如下:

import requests
from lxml import etree
from fake_useragent import UserAgent
import pymysql,warnings
#创建数据库,生成表结构
import pymongo

DATABASE_IP = '127.0.0.1'#指定ip
DATABASE_PORT = 27017#指定端口
DATABASE_NAME = 'sun'#指定数据库
client = pymongo.MongoClient(DATABASE_IP,DATABASE_PORT)#连接
db = client.sun#连接数据库
collection = db.lanjia#生成表

headers  = {
    'User-Agent':UserAgent().random
}

base_url = 'https://bj.lianjia.com/ershoufang/pg{}/'

#响应HTML交给parse_page解析
def load_page(url):
    try:
        res = requests.get(url,headers=headers)
        if res.status_code == 200:
            print('页面请求完毕')
            return res.text
    except:
        print('网络访问错误')

#解析HTML拿到想要的数据
def parse_page(html):
    xpath_content = etree.HTML(html)
    xpath_datas = xpath_content.xpath("//*[@class='info clear']")
    for data in xpath_datas:
        title = data.xpath('./div[1]/a/text()')
        price = data.xpath('./div[4]//div[@class="totalPrice"]/span/text()')
        # print(title,price)
        new_data = zip(title,price)
        for tup_data in new_data:
            insert_mongo(tup_data)
    print('数据写入完毕')

#插入到指定的数据库中
def insert_mongo(data):
    collection.insert_one({
        'name':data[0],
        'price':data[1]+'万'
    })

def main():
    for i in range(1,10):
        url = base_url.format(str(i))
        html = load_page(url)
        parse_page(html)

if __name__ == '__main__':
    main()

运行效果如下:

 

总结:

  1. 链家网站前期分析
  2. 利用requests爬取数据
  3. 爬取数据存储MongoDB中
原创文章 49 获赞 23 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Smile_Mr/article/details/94400675