当前位置: 首页 > news >正文

爬取贝壳网的40000条基本数据

总共分为四部分:
1.获得网页URL
2.获得网页数据
3.过滤数据,获得需要的数据

4.完整代码

一,获得网页URL

#先导入库
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re

#建立一个主函数,该代码都所有函数都在主函数执行
def main():
    baseurl="https://sjz.ke.com/ershoufang/pg/"  #获得贝壳网网址


def Geturl(baseurl):
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"}
    repo=urllib.request.Request(baseurl,headers=headers)
    html=''
    try:
        reponse=urllib.request.urlopen(repo)
        html=reponse.read().decode("utf-8")

    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html

User-Agent数据在右击检查中的network里面截取:
如果头不对,会报404
在这里插入图片描述

二,通过beautifulsoup过滤网页数据

def GetDate(baseurl):
    for i in range(0,1):    #页数
        url=baseurl+str(i*30) #每页的数量
        html=Geturl(url)

    soup = BeautifulSoup(html, "html.parser")  #建立soup对象
    for item in soup.find_all("li", class_="clear"): #查找匹配的字符串 这里是找a标签的字符串 减少查找范围
        data = []
        item=str(item)
        print(item)

for item in soup.find_all(“li”, class_=“clear”) 是缩短数据的筛选范围
在这里插入图片描述

三.通过re正则表达式 获得数据

#创建正则表达式对象 查找目标的对象
findTitle=re.compile(r'<img.*title="(.*?)"',re.S)  #标题对象   re.S 让换行符包含在字符中
findImgSrc=re.compile(r'<img.*data-original="(.*?)"',re.S)#图标对象
findHref=re.compile(r'<a.*href="(.*?)"') #超链接对象
findpricemi=re.compile(r'<span>单价(\d*)元/平米</span>') #平方米/块
然后在GetDate函数里面用re去查找并保存数据

        LinkTitle=re.findall(findTitle,item)[0]   #将标题数据追加到列表
        data.append(LinkTitle)

        LinkSrc = re.findall(findImgSrc,item)[0] #通过正则表达式查看指定的字符串 [0]是表示只查取遇到的第一个字符串
        data.append(LinkSrc)


        LinkHref = re.findall(findHref, item)[0]  #将超链接数据追加到列表
        data.append(LinkHref)

        Linkpricemi=re.findall(findpricemi,item)[0]
        data.append(Linkpricemi)
        datalist.append(data)
    return datalist

四,完整代码

import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re
import xlwt #进行excel操作


 #保存所有的信息
datalist = []
def main():
    baseurl="https://sjz.ke.com/ershoufang/pg/"  #获得贝壳网网址


    datalist=GetDate(baseurl)
    # print(datalist)
    savepath="贝壳网二手房"

    # saveData(data)
#创建正则表达式对象 查找目标的对象
findTitle=re.compile(r'<img.*title="(.*?)"',re.S)  #标题对象   re.S 让换行符包含在字符中
findImgSrc=re.compile(r'<img.*data-original="(.*?)"',re.S)#图标对象
findHref=re.compile(r'<a.*href="(.*?)"') #超链接对象
findpricemi=re.compile(r'<span>单价(\d*)元/平米</span>') #平方米/块



# #获取数据 过滤数据
def GetDate(baseurl):
    for i in range(0,99):    #页数 
        url=baseurl+str(i*30) #每页的数量
        html=Geturl(url)

    soup = BeautifulSoup(html, "html.parser")  #建立soup对象
    for item in soup.find_all("li", class_="clear"): #查找匹配的字符串 这里是找a标签的字符串 减少查找范围
        data = []
        item=str(item)
        print(item)

        LinkTitle=re.findall(findTitle,item)[0]   #将标题数据追加到列表
        data.append(LinkTitle)

        LinkSrc = re.findall(findImgSrc,item)[0] #通过正则表达式查看指定的字符串 [0]是表示只查取遇到的第一个字符串
        data.append(LinkSrc)


        LinkHref = re.findall(findHref, item)[0]  #将超链接数据追加到列表
        data.append(LinkHref)

        Linkpricemi=re.findall(findpricemi,item)[0]
        data.append(Linkpricemi)
        datalist.append(data)
    return datalist


#得到指定一个URL的网页内容
def Geturl(baseurl):
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"}
    repo=urllib.request.Request(baseurl,headers=headers)
    html=''
    try:
        reponse=urllib.request.urlopen(repo)
        html=reponse.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html



if __name__=="__main__":
    main()

然后可以把数据通过xlwt保存为excel 或者sqlite3保存为数据库
这里数据太多就没进行保存的
如果保存为excel可以看看这个博主https://blog.csdn.net/shancyr45/article/details/103381059

相关文章:

  • 配置好了但 hadoop的Datanode无法启动
  • kafka启动消费者和生产者(单节点)
  • sublime通过sftp远程连接linux
  • pyecharts的render函数无法运行,无法生成html文件
  • JavaDoc生成文档
  • JAVA用户交互Scanner
  • Java if选择结构
  • Java switch多选结构
  • While循环结构
  • For循环结构
  • Java方法的定义和调用
  • Java方法的重载
  • Java可变参数
  • Java递归
  • JAVA实现计算器
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • egg(89)--egg之redis的发布和订阅
  • rabbitmq延迟消息示例
  • socket.io+express实现聊天室的思考(三)
  • Vue 重置组件到初始状态
  • 程序员最讨厌的9句话,你可有补充?
  • 从重复到重用
  • 前端路由实现-history
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习使用ExpressJS 4.0中的新Router
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 数据库巡检项
  • ​决定德拉瓦州地区版图的关键历史事件
  • # Maven错误Error executing Maven
  • $.ajax中的eval及dataType
  • (04)odoo视图操作
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (五)IO流之ByteArrayInput/OutputStream
  • (一一四)第九章编程练习
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)大型网站的系统架构
  • @staticmethod和@classmethod的作用与区别
  • @Valid和@NotNull字段校验使用
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [2023年]-hadoop面试真题(一)
  • [Android学习笔记]ScrollView的使用
  • [BZOJ3757] 苹果树
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [JavaEE] 线程与进程的区别详解
  • [JavaWeb玩耍日记]Maven的安装与使用
  • [LeetCode]Balanced Binary Tree