Python 爬虫小练

news/2024/7/19 12:14:12 标签: python, 爬虫, jvm

Python 爬虫小练 获取贝壳网数据

使用到的模块

标准库

Python3 标准库列表

  • os 模块:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。
  • math 模块:math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等
  • datetime 模块:datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等
  • logging 模块 :使用标准库提供的 logging API 最主要的好处是,所有的 Python 模块都可能参与日志输出,包括你自己的日志消息和第三方模块的日志消息。
  • logging.config 模块 :可配置 logging 模块。 它们的使用是可选的 — 要配置 logging 模块你可以使用这些函数,也可以通过调用主 API (在 logging 本身定义) 并定义在 logginglogging.handlers 中声明的处理器。
  • logging.handlers 模块 :这个包提供了以下有用的处理程序。 请注意有三个处理程序类 (StreamHandler, FileHandlerNullHandler) 实际上是在 logging 模块本身定义的,但其文档与其他处理程序一同记录在此。
  • urllib 模块:urllib 模块提供了访问网页和处理 URL 的功能,包括下载文件、发送 POST 请求、处理 cookies 等
  • threading 模块:线程模块提供对线程的支持
  • SQLite 3 模块:SQLite 是一个C语言库,它可以提供一种轻量级的基于磁盘的数据库,这种数据库不需要独立的服务器进程,也允许需要使用一种非标准的 SQL 查询语言来访问它。一些应用程序可以使用 SQLite 作为内部数据存储。可以用它来创建一个应用程序原型,然后再迁移到更大的数据库。

第三方库

  • requests 库: Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。

    requests 模块比urllib模块更简洁。官网地址:Python requests

  • BeautifulSoup 库:是一个可以从HTML或XML文件中提取数据的Python库。官网地址:BeautifulSoup

使用到的相关逻辑步骤

请求URL

  • 模拟浏览器

    python">headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
    }
    
  • URL编码

    python">import urllib.parse
    
    baseUrl = "https://nj.ke.com/ershoufang/"
    
    url = baseUrl + "天润城/"
    encoded_url = urllib.parse.quote(url, safe='/:?+=')
    
  • 无用户认证

    python">response = requests.get(encoded_url, headers=headers)
    
  • 有用户认证(cookie)

    python">headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
        'Cookie': 'lianjia_token=自己的具体值'
    }
    
    response = requests.get(encoded_url, headers=headers)
    
  • 代理,公司内部若存在代理需要配置。

    python">proxies = {"https": "http://111:8080"}
    
    response = requests.get(encoded_url, headers=headers, proxies=proxies)
    

解析HTML

python">soup = BeautifulSoup(response.text, 'html.parser')
  • 取属性

    python">soup.select('.title a')[0].attrs.get('href')
    
  • 取标签值

    python">soup.select(".total span")[0].text.strip()
    

下载图片资源

python"># urllib.request配置代理
urllib.request.install_opener(
  urllib.request.build_opener(
      urllib.request.ProxyHandler(proxies)
  )
)

urllib.request.urlretrieve(housingImgUrl,housingTypeImagePath)

分析数据

写入SQLite 3数据库

  • 建表(执行脚本)

  • 写入

  • 异常处理

    python">conn = sqlite3.connect('../db/identifier.sqlite', check_same_thread=False)
    c = conn.cursor()
    
    # 执行sql脚本
    with open('../db/script/house_listing_price.sql') as sql_file:
        c.executescript(sql_file.read())
    conn.commit()
    
    for house_info in house_info_list:
        sql = f'insert into house_listing_price values (' \
              f'"{house_info["houseid"]}"' \
              f',"{house_info["title"]}"' \
              f',"{house_info["price"]}"' \
              f',"{house_info["address"]}"' \
              f',"{house_info["area"]}"' \
              f',"{house_info["sealDate"]}"' \
              f',"{house_info["housingType"]}"' \
              f',"{house_info["houseUrl"]}")'
        try:
            c.execute("BEGIN")
            c.execute(sql)
            c.execute("COMMIT")
        except:
            print("[" + str(datetime.datetime.now()) + "] " + "写入数据库异常,sql is [" + sql + "]")
            c.execute("ROLLBACK")
    conn.commit()
    conn.close()
    

完整示例

python">import requests
from bs4 import BeautifulSoup
import math
import datetime
import sqlite3
import urllib.request
import os

# 代理-公司用
proxies = {"https": "http://xzproxy.cnsuning.com:8080"}
# 无代理
# proxies = {}

# 下载图片第三方配置代理
urllib.request.install_opener(
    urllib.request.build_opener(
        urllib.request.ProxyHandler(proxies)
    )
)

# 模拟浏览器请求的header
headers = {
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
}

# 挂牌列表URL-不分页
url = "https://nj.ke.com/ershoufang/co22l2rs%E5%A4%A9%E6%B6%A6%E5%9F%8E%E5%8D%81%E5%9B%9B%E8%A1%97%E5%8C%BA/"
response = requests.get(url, headers=headers, proxies=proxies)
soup = BeautifulSoup(response.text, 'html.parser')
# 网站每页30条
everypagecount = 30
sumhouse = soup.select(".total span")[0].text.strip()
pagesum = int(sumhouse) / everypagecount
pagesum = math.ceil(pagesum)
# 网站只提供100页
pagesum = min(pagesum, 100)
print("[" + str(datetime.datetime.now()) + "] " + "总记录数" + str(sumhouse) + ",总页数" + str(pagesum))
# 创建一个空列表,用于存储房源信息
house_info_list = []


# 请求房源列表数据
def requestUrl(real_url):
    response = requests.get(real_url, headers=headers, proxies=proxies)
    soup = BeautifulSoup(response.text, 'html.parser')
    # 获取房源列表数据
    house_list = soup.select('.sellListContent li .clear')
    # 循环遍历房源列表,提取所需信息
    for house in house_list:
        # 挂牌标题
        title = house.select('.title a')[0].text.strip()
        # 挂牌价格
        price = house.select('.totalPrice span')[0].text.strip()
        # 地址小区名称
        address = house.select('.positionInfo a')[0].text.strip()
        # 楼层简述
        area = house.select('.houseInfo')[0].text.strip().replace(
            '\n', '').replace(' ', '').split('|')[0]
        area = area[0:area.index(')') + 1]
        # 房屋登记编号
        houseId = house.select('.unitPrice')[0].attrs.get('data-hid')
        # 房源详情页的URL
        href = house.select('.title a')[0].attrs.get('href')
        response2 = requests.get(href, headers=headers, proxies=proxies)
        soup2 = BeautifulSoup(response2.text, 'html.parser')
        # 挂牌日期
        sealDate = soup2.select('.introContent .transaction li')[0].text.strip()[4:]
        # 户型
        housingType = soup2.select('.introContent .base .content li')[0].text.strip()[4:].strip()
        # 房屋图片列表
        house_images_list = soup2.select('.thumbnail .smallpic li')
        housingTypeImagePath = "../src/main/resources/images/housingType/" + houseId + ".jpg"
        for house_images in house_images_list:
            # 下载户型图
            if "户型图" == house_images.attrs.get("data-desc") and not os.path.exists(housingTypeImagePath):
                housingImgUrl = house_images.attrs.get("data-src")
                urllib.request.urlretrieve(
                    housingImgUrl,
                    housingTypeImagePath)

        # 将提取到的信息添加到房源信息列表中
        house_info_list.append({
            'title': title,
            'price': price,
            'address': address,
            'area': area,
            'houseid': houseId,
            'sealDate': sealDate,
            'housingType': housingType,
            'houseUrl': href
        })
    return


pageNo = 0
while pageNo < pagesum:
    currentPageNo = str(pageNo + 1)
    # 挂牌列表URL-分页
    url = 'https://nj.ke.com/ershoufang/pg' + currentPageNo + 'co22l2rs%E5%A4%A9%E6%B6%A6%E5%9F%8E%E5%8D%81%E5%9B%9B%E8%A1%97%E5%8C%BA/'
    print("[" + str(datetime.datetime.now()) + "] " + "获取第" + currentPageNo + "页")
    requestUrl(url)
    pageNo = pageNo + 1

# 将房源信息列表保存为CSV文件
import csv

# print("写入文件中")
# current_date = datetime.datetime.now()
# formatted_date = current_date.strftime("%Y-%m-%d")
# filename = "house_info-" + formatted_date + ".csv"
# with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
#     writer = csv.writer(f)
#     writer.writerow(['标题', '价格', '地址', '位置', '房屋ID'])
#     for house_info in house_info_list:
#         writer.writerow([
#             house_info['title'], house_info['price'], house_info['address'],
#             house_info['area'], house_info['houseid']
#         ])
# print("写入完成")

print("[" + str(datetime.datetime.now()) + "] " + "写入数据库")
conn = sqlite3.connect('../db/identifier.sqlite', check_same_thread=False)
c = conn.cursor()

# 执行sql脚本
with open('../db/script/house_listing_price.sql') as sql_file:
    c.executescript(sql_file.read())
conn.commit()

for house_info in house_info_list:
    sql = f'insert into house_listing_price values (' \
          f'"{house_info["houseid"]}"' \
          f',"{house_info["title"]}"' \
          f',"{house_info["price"]}"' \
          f',"{house_info["address"]}"' \
          f',"{house_info["area"]}"' \
          f',"{house_info["sealDate"]}"' \
          f',"{house_info["housingType"]}"' \
          f',"{house_info["houseUrl"]}")'
    try:
        c.execute("BEGIN")
        c.execute(sql)
        c.execute("COMMIT")
    except:
        print("[" + str(datetime.datetime.now()) + "] " + "写入数据库异常,sql is [" + sql + "]")
        c.execute("ROLLBACK")
conn.commit()
conn.close()
print("[" + str(datetime.datetime.now()) + "] " + "写入完成")

http://www.niftyadmin.cn/n/4947401.html

相关文章

js 小程序限流函数 return闭包函数执行不了

问题&#xff1a; 调用限流 &#xff0c;没走闭包的函数&#xff1a; checkBalanceReq&#xff08;&#xff09; loadsh.js // 限流 const throttle (fn, context, interval) > {console.log(">>>>cmm throttle", context, interval)let canRun…

【傅里叶级数与傅里叶变换】数学推导——3、[Part4:傅里叶级数的复数形式] + [Part5:从傅里叶级数推导傅里叶变换] + 总结

文章内容来自DR_CAN关于傅里叶变换的视频&#xff0c;本篇文章提供了一些基础知识点&#xff0c;比如三角函数常用的导数、三角函数换算公式等。 文章全部链接&#xff1a; 基础知识点 Part1&#xff1a;三角函数系的正交性 Part2&#xff1a;T2π的周期函数的傅里叶级数展开 P…

无代码集成飞书连接更多应用

场景描述&#xff1a; 基于飞书开放平台能力&#xff0c;无代码集成飞书连接更多应用&#xff0c;打通数据孤岛。通过Aboter可轻松搭建业务自动化流程&#xff0c;实现多个应用之间的数据连接。 支持包括飞书事件监听和接口调用的能力&#xff1a; 事件监听&#xff1a; 用…

VMWARE15.5.7安装RedHat 7.9黑屏

在win7上面最高版本为vmware15.5.7 我安装后&#xff0c;安装成功了redhat5.5 但是因为操作系统有点老。安装其他软件时遇到问题。想改为7.0以上linux。 但是遇到了问题。安装时&#xff0c;一直黑屏。包括再安装5.5也是同样效果。 找了很多方案都无济于事。后面搜到一个方案…

最优化方法Python计算:基本共轭方向算法

设目标函数 f ( x ) 1 2 x ⊤ H x − x ⊤ b , x ∈ R n . f(\boldsymbol{x})\frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}-\boldsymbol{x}^\top\boldsymbol{b},\boldsymbol{x}\in\text{ℝ}^n. f(x)21​x⊤Hx−x⊤b,x∈Rn. 其中&#xff0c; H ∈ R n n \boldsymbol{H}\i…

Android CCodec (二十) CCodec Native服务实现分析

1、C2解码服务registerAsService注册流程 google实现CCodec的vendor默认解码服务代码路径是在frameworks/av/media/codec2/hidl/services/vendor.cpp中,而其注册的是HIDL服务,本文就对HIDL服务注册做简要分析。首先看下vendor.cpp中的代码注册流程。 int main(int /* argc *…

等保测评--安全计算环境--测评方法

安全子类--身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 一、测评对象 终端和服务器等设备中的操作系统(包括宿主机和虚拟机操作系统) 、网络设备(包括虚拟网络设备)、安全设备(包括虚拟安全设备)、移动终端…

pytorch2.0.1 安装部署(cpu+gpu) linux+windows

官网打开可能较慢&#xff0c;耐心等待 pytorch官网 以下操作在默认网络环境即可使用 一、说明和前期准备 1.pytorch是一个和tensorflow类似的框架 如果需要安装tensorflow&#xff0c;可以参考&#xff1a; tensorflow 1&#xff0c;2 cpugpu&#xff08;windowslinux&…