爬虫实战——58同城租房数据爬取

2023-11-17

背景

自己本人在暑期时自学了python,还在中国大学mooc上学习了一些爬虫相关的知识,对requests库、re库以及BeautifulSoup库有了一定的了解,但是没有过爬虫方面的实战,刚好家人有这方面需求,就对58同城上的租房数据进行了爬取,算是当作自己的第一次爬虫实战。不过自己的水平实在不行,搞了两天,参考了很多人的代码,也查了很多文件。好,话不多说,直接上代码。

代码及结果

from bs4 import BeautifulSoup
from fontTools.ttLib import TTFont
import requests
import json
import time
import re
import base64
import openpyxl

User_Agent = 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'
headers = {
    'User-Agent': User_Agent,
}


def convertNumber(html_page):

    base_fonts = ['uni9FA4', 'uni9F92', 'uni9A4B', 'uni9EA3', 'uni993C', 'uni958F', 'uni9FA5', 'uni9476', 'uni9F64',
                  'uni9E3A']
    base_fonts2 = ['&#x' + x[3:].lower() + ';' for x in base_fonts]  # 构造成 鸺 的形式
    pattern = '(' + '|'.join(base_fonts2) + ')'

    font_base64 = re.findall("base64,(AA.*AAAA)", html_page)[0]  # 找到base64编码的字体格式文件
    font = base64.b64decode(font_base64)
    with open('58font2.ttf', 'wb') as tf:
        tf.write(font)
    onlinefont = TTFont('58font2.ttf')
    convert_dict = onlinefont['cmap'].tables[0].ttFont.tables['cmap'].tables[0].cmap  # convert_dict数据如下:{40611: 'glyph00004', 40804: 'glyph00009', 40869: 'glyph00010', 39499: 'glyph00003'
    new_page = re.sub(pattern, lambda x: getNumber(x.group(),convert_dict), html_page)
    return new_page


def getNumber(g,convert_dict):
    key = int(g[3:7], 16)  # '&#x9ea3',截取后四位十六进制数字,转换为十进制数,即为上面字典convert_dict中的键
    number = int(convert_dict[key][-2:]) - 1  # glyph00009代表数字8, glyph00008代表数字7,依次类推
    return str(number)
               

def request_details(url):
   f = requests.get(url, headers=headers)
   f=convertNumber(f.text)
   soup = BeautifulSoup(f, 'lxml')
   name = soup.select('h1[class="c_333 f20 strongbox"]')
   price = soup.select('b[class="f36 strongbox"]')
   try:
       lease=soup.find(text='租赁方式:').findNext('span').contents[0]
   except:
       lease=""
   try:
       housing_type=soup.find(text='房屋类型:').findNext('span').contents[0]
       housing_type="".join(housing_type.split())
   except:
       housing_type=""
   try:
       oritation=soup.find(text='朝向楼层:').findNext('span').contents[0]
       oritation="".join(oritation.split())
   except:
       oritation=""
   try:
       community=soup.find(text='所在小区:').findNext('span').contents[0].contents[0]
   except:
       community=""
   try:
       building_type=soup.find(text='建筑类型:').findNext('span').contents[0]
   except:
       building_type=""
   try:
       address=soup.find(text='详细地址:').findNext('span').contents[0]
       address="".join(address.split())
   except:
       address=""
   data = {
    '名称':name[0].text,
    '价格':price[0].text.strip()+"元",
    '租赁方式':lease,
    '房屋类型':housing_type,
    '朝向楼层':oritation,
    '所在小区':community,
    '建筑类型':building_type,
    '详细地址':address,
    '网址':url
   }
   return data
  

def get_link(url):
    f = requests.get(url)
    soup = BeautifulSoup(f.text, 'lxml')
    links = soup.select('div[class="des"]>h2>a')
    link_list = []
    for link in links:
        link_content = link.get('href')
        link_list.append(link_content)
    return link_list


def save_to_text(content,i):
    mywb=openpyxl.load_workbook('SHEET2.xlsx')
    sheet=mywb.active;
    sheet[chr(65)+str(i)].value=content['名称']
    sheet[chr(66)+str(i)].value=content['价格']
    sheet[chr(67)+str(i)].value=content['租赁方式'].encode('utf-8')
    sheet[chr(68)+str(i)].value=content['房屋类型'].encode('utf-8')
    sheet[chr(69)+str(i)].value=content['朝向楼层'].encode('utf-8')
    sheet[chr(70)+str(i)].value=content['所在小区'].encode('utf-8')
    sheet[chr(71)+str(i)].value=content['建筑类型'].encode('utf-8')
    sheet[chr(72)+str(i)].value=content['详细地址'].encode('utf-8')
    sheet[chr(73)+str(i)].value=content['网址']
    mywb.save('SHEET2.xlsx')
    content = json.dumps(content, ensure_ascii=False)
    with open('58', 'a', encoding='utf-8') as f:
        f.write(content)
        f.write('\r\n')


def main():
    mywb=openpyxl.Workbook()
    sheet=mywb.active;
    sheet[chr(65)+str(1)].value="名称"
    sheet[chr(66)+str(1)].value="价格"
    sheet[chr(67)+str(1)].value="租赁方式"
    sheet[chr(68)+str(1)].value="房屋类型"
    sheet[chr(69)+str(1)].value="朝向楼层"
    sheet[chr(70)+str(1)].value="所在小区"
    sheet[chr(71)+str(1)].value="建筑类型"
    sheet[chr(72)+str(1)].value="详细地址"
    sheet[chr(73)+str(1)].value="网址"
    mywb.save('SHEET2.xlsx')
    num = 1
    link = 'https://fy.58.com/qhdlfyzq/chuzu/pn{}'
    start = 1
    end = 11
    urls = [link.format(i) for i in range(start, end)]
    for url in urls:
        link_list = get_link(url)
        print(link_list)
        time.sleep(5)
        for link in link_list:
            if link != "https://e.58.com/all/zhiding.html":
                try:
                    content = request_details(link)
                    num = num + 1
                    print(content)
                    save_to_text(content, num)
                except:
                    print("error")
                time.sleep(5)


if __name__ == '__main__':
    main()

在这里插入图片描述

总结

难点

  • 对于页码的变换,参考了一些人的代码,为网址后面加上/pn{}(page number)
  • 为了防止输入验证码,每两次访问之间都需要间隔至少5s,由于58同城是识别ip地址,一旦被锁定,需要手动打开网页,完成验证
  • 58同城在网页源代码中,对数字进行了加密,许多数字都是以乱码显示,我参考了58同城南京数据爬取,借鉴了一些他的代码,解决了这个问题
  • 对于BeautifulSoup库的运用,包括find(),next_sibling,contents等等,都提高了查到有用信息的效率

自己需要提升的方面

  • 对于我这种python新手来说,最应该提升的部分就是字符的编码了,整个调试过程中,遇到很多次编码上的错误,最后虽然调试通了,但是部分代码比较冗余
  • 代码中最后用到了openpyxl模块,感觉还需要继续熟练
  • 异常处理十分重要,但是自己掌握的还不是很好
  • 代码的整齐美观还需要很大的提升

代码提升潜力

  • 代码的简洁和美化
  • 异常处理感觉可以进行修改
  • 在主函数中,可以直接一次性提取出所有的网址,防止重复
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫实战——58同城租房数据爬取 的相关文章

  • 文件上传 拿 shell

    启动docker开启镜像环境 成功在主机上访问到 根据弱密码tomcat tomcat登陆管理后台 在下面位置可以找到上传点 上传对应的war文件 先把一剑jsp马保存到zip压缩包中 再修改后缀名为war上传 可以看到上传成功 连接成功
  • 获取表单中某个元素,返回数组

    获取id为editForm的表中中所有input元素的对象 input editForm 获取每个input中name和val var ret input editForm each function var nm this attr na
  • OpenWrt后台管理启用https-OpenSSL

    OpenWrt 默认使用http 访问管理后台 这样不安全 推荐修改为 https 访问 加密数据传输 本文介绍配置步骤 1 卸载旧的ssl软件包 root OpenWrt opkg remove luci ssl px5g px5g mb

随机推荐

  • 深入《C++ Core Guidelines解析》:提升C++编程实践的关键指南

    目录 1 写在前面 2 推荐理由 3 内容介绍 4 作者介绍 5 赠书 or 购买 1 写在前面 C Core Guidelines是一个正在进行的开源项目 通过将广泛认可的现代C 上佳实践集中在一个地方来解决这些问题 Core Guide
  • Kylin--简介及图解架构

    Kylin简介 Kylin 麒麟 的诞生背景 Kylin的应用场景 为什么要使用Kylin Kylin的总体架构 Kylin 麒麟 的诞生背景 ebay 中国团队研发的 是第一个真正由中国人自己主导 从零开始 自主研发 并成为Apache顶
  • Linux中创建文件与文件夹

    一 创建文件夹 命令 mkdir 文件夹名 例 一开始home目录下没有test文件夹 命令创建后生成 二 创建文件 命令 touch 文件名 例 一开始test文件夹下没有boot properties 命令创建后生成 三 注意事项 创建
  • linux下挂载移动硬盘(ntfs格式),Linux下挂载移动硬盘(NTFS格式)

    工作中遇到linux系统 Red Hat Enterprise5 7 挂载希捷ntfs格式移动硬盘 会跳出一个ERROR提示框 The volume EAGET NQH user the ntfs file system which is
  • arcpy导入报错 “ImportRrror: No module named arcpy”

    在使用ArcGIS自带的Python IDLE处理数据的时候 导入arcpy报错 ImportError No module named arcpy 我遍历了各解决方法依然无法成功导入arcpy 后经过查询 探索 通过如下方法得以成功解决
  • aoj1303

    继续python系列 python能够自动推断类型这个太好用了 根本不用声明类型 自己根据运行情况推断出所用的类型 所以在定义函数的时候根本不用声明参数的类型 下面这个题目aoj1303 求2的指数 如下 def gethex a li w
  • 关于飞书的告警通知,这里有个更好的办法

    飞书 是字节跳动于2016年自研的新一代一站式协作平台 是保障字节跳动全球五万人高效协作的办公工具 飞书将即时沟通 日历 云文档 云盘和工作台深度整合 通过开放兼容的平台 让成员在一处即可实现高效的沟通和流畅的协作 全方位提升企业效率 20
  • Git 使用

    Git 一 Git基础 1 Git介绍 Git是目前世界上最先进的分布式版本控制系统 2 Git与Github 2 1 两者区别 Git是一个分布式版本控制系统 简单的说其就是一个软件 用于记录一个或若干文件内容变化 以便将来查阅特定版本修
  • 模板类、模板函数的模板类型显式实例化及其用途(转载)

    转载自 C 11模板隐式实例化 显式实例化声明 定义 简单易懂 云飞扬 Dylan的博客 CSDN博客 模板隐式实例化 1 隐式实例化 在代码中实际使用模板类构造对象或者调用模板函数时 编译器会根据调用者传给模板的实参进行模板类型推导然后对
  • 【LAMMPS系列】LAMMPS软件安装资料包

    大家好 我是粥粥 LAMMPS 是一种经典的分子动力学代码 专注于材料建模 它是大型原子 分子大规模并行模拟器的首字母缩略词 LAMMPS 具有固态材料 金属 半导体 和软物质 生物分子 聚合物 以及粗粒或中等系统的势函数 它可用于模拟原子
  • 自定义多数据源JDBC连接池

    背景 公司需要对各个客户的数据库进行统一管理 故涉及到对多个不同数据库进行连接 传统的数据库连接池无法满足需求 故结合网上的自定义数据库连接池 进行的改进 代码如下 注意 由于代码处于公司环境 有直接使用肯定是会有报错 相信这种简单的修补是
  • android Stopwatch实例

    Stopwatch 实例 package net baisoft stopwatch import java util ArrayList import java util Date import java util HashMap imp
  • electron vue 打开新窗口

    1 主进程 background js文件 const winURL process env NODE ENV development http localhost 8080 file dirname index html 事件名 open
  • 网页设计期末大作业-景点旅游网站(含导航栏,轮播图,样式精美)

    景点旅游网站 资源链接在文末 页设计期末结课的作业 样式很精美 链接基本正常 详细情况入下图所示 资源下载链接 https download csdn net download weixin 43474701 85514120
  • AIX显示版本的最高全包含版本原则

    复杂度2 5 机密度4 5 最后更新2021 05 02 专题其它章节说过AIX对所有程序包管理会检验完整性 并且内置了一个验证列表 包含其所能识别的最新版应当包含的各个程序包的版本 如果当前安装的TL Patch不完整 则只会显示可以实现
  • CSS transform属性的简单应用——双开门动画效果

    1 效果演示 CSS transform属性有许多效果 平移 旋转 缩放等 这里简单应用平移效果 实现双开门动画 以下为效果图 2 设计思路 设置一张居中的需要隐藏的底图 设置封面图 平分成左右两部分 鼠标悬浮在封面图上 触发 开门 效果
  • 在C/C++代码中使用SSE等指令集的指令(4)SSE指令集Intrinsic函数使用

    在http blog csdn net gengshenghong article details 7008682里面列举了一些手册 其中Intel Intrinsic Guide可以查询到所有的Intrinsic函数 对应的汇编指令以及如
  • centos7的安装和创建用户

    1 centos7 2的安装 打开安装包之后解压 然后双击 进入下面的界面 选择语言 点击下一步 2 然后来到了配置页面 可以配置时间 选择中国的时区 3 其他的选择默认就好 重要的是选择安装类型和磁盘分区 4 选择安装类型 一般默认是mi
  • npm开发微信小程序--使用vantui 详解干货

    更新微信开发者工具创建项目 1 创建项目 放在一个合适的文件夹中 没有APPID时 请点击测试号 或去注册一个 2 进入项目的根目录 npm init 一路回车 要先npm init 初始化项目 否则会报错 官方文档中没有提到的东东 里面有
  • 爬虫实战——58同城租房数据爬取

    背景 自己本人在暑期时自学了python 还在中国大学mooc上学习了一些爬虫相关的知识 对requests库 re库以及BeautifulSoup库有了一定的了解 但是没有过爬虫方面的实战 刚好家人有这方面需求 就对58同城上的租房数据进