链家网爬取深圳租房信息并存入MySQL

0 爬前工作

决定毕业后前往深圳工作,想要了解深圳的租房市场。通过结合网上对链家网爬取经验,开始自己的爬取工作

分析URL

  • https://sz.lianjia.com/zufang/
    其中,sz是城市,如想获得其它城市可以更换;zufang表示租房
  • https://sz.lianjia.com/zufang/luohuqu/
    限定罗湖区后,URL增加luohuqu,想要那个区加上那个区的拼音
  • https://sz.lianjia.com/zufang/luohuqu/rt200600000001/
    限定整租后,URL增加rt200600000001,类型:整租:rt200600000001 合租:rt200600000002
  • https://sz.lianjia.com/zufang/luohuqu/pg2rt200600000002/#contentList
    打开第二页后,URL增加pg2

后继还有租金、户型、朝向等不做限定

宽表设计

浏览网页后根据自己分析需要设计了如下宽表:

district1 区 district2 区域 address 详细地址 rentType 出租类型 size 大小 toward 朝向 zone 格局 price 价格 tag 标签

需要用到的包

import requests # 爬取网站
from bs4 import BeautifulSoup # 解析超文本
import re # 正则
import pymysql # 连接MySQL
import time # 时间限制

1 解析网页

1.0 查看单个网页是否爬取成功

District = "luohuqu"
page = 2
RentType = "rt200600000002"
URL = "https://sz.lianjia.com/zufang/{}/pg{}{}/#contentList".format(District, page, RentType)
headers = {
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
           ,"Connection":"close"}
res = requests.get(URL, headers = headers)
print("URL = " + res.url)
print(res.text)

打印出来的网址能正常打开,超文本的输出也跟网站上查看的一样,可以看出链家网的爬取有URL请求头就可以爬取到,极大方便了爬虫
接着进入下一步

1.1 解析URL

  • 输入:URL(连接)、headers(请求头)
  • 输出:soup(解析超文本后的格式)
  • request.get()爬取网站
  • BeautifulSoup解析超文本
def parseURL(URL, headers):
    time.sleep(10) ## 时间限流,避免被反爬虫
    try: ## 避免访问太快失败整个程序退出
        res = requests.get(URL, headers = headers)
        if (res.status_code==200):
            html = res.text
            soup = BeautifulSoup(html, 'lxml')
            return soup
        else:
            print("访问{}失败".format(URL))
            return None
    except:
        time.sleep(20)
        print("访问{}失败".format(URL))
        return None

lxml解析器有解析HTML和XML的功能,而且速度快,容错能力强

1.2 获取限制区和出租类型后的总套数

在这里插入图片描述
可以看到总套数在以上attrs中
注意class是python固定语言,在后面加个"_"

totalFind = int(soup.find('span', class_="content__title--hl").get_text()) # 获取文本后是str类型,需转换成int才能比较大小

get_text()可以获取文本,返回str类型

1.3 获取总页数

在这里插入图片描述
因为总页数不在文本里,所以采用先获取该结点,再用正则匹配

  • 输入:soup(解析超文本后的格式)
  • 输出:totalPage(总页数)
def TotalPage(soup):
    pg_content = soup.find_all('div',  class_="content__pg")[0] ## 获取结点
    totalPage = re.search('data-totalpage="(\d+)".*', str(pg_content)).group(1) ## 总页数不在文本里,所以需要正则来查找
    return totalPage

1.4 获取非首页的网址

增加:page

  • 输入:District(区)、page(第几页)、RentType(出租类型)
  • 输出:URL
def getURL(District, page, RentType):
    URL = "https://sz.lianjia.com/zufang/{}/pg{}{}/#contentList".format(District, page, RentType)
    return URL

1.5 获取信息

在这里插入图片描述
同一页面的每一套租房信息都在这种结点中,先找到所有这种结点
再根据宽表的设计找出需要信息的位置,进行提取

  • 输入:house(每套的结点)
  • 输出:data(信息数据)
def getMessage(house):
    title = house.find('p', class_="content__list--item--title twoline").get_text(strip=True) ##strip=True:去除获得文本内容的前后空白
    rentType = re.split(r'[·]', title)[0] ## 出租类型
    message = house.find('p',  class_="content__list--item--des").get_text(strip=True)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值