python爬取 百姓网部分数据 + 存入MongoDB数据库详细案例

2023-11-04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

新手上路,有不好的地方欢迎评论区指正。

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有。

一、实施步骤

(1) 数据爬取:使用requests请求为基础获取数据源。(没安装的老哥自行安装
(2) UA伪装:模拟浏览器访问网址。
(3) 数据解析:使用xpath语法处理数据。
(4) 数据存储:获取需求数据后使用MongoDB进行存储。

二、目标网站

https://haikou.baixing.com/chongwujiaoyi/

 先分析目标网站

点击链接进去之后可以看到我们需要抓取的数据

 Ctrl+U打开网页源代码后,可以发现我们想要的数据直接就在网页上,然后开始吧!

三、获取数据

1. 引入库

import requests  #请求网页 
from lxml import html    # 导入xpath
import pymongo   # 用于连接mongoDB数据库

由于版本原因,etree模块不能直接从lxml包中导入,需要多一步操作

etree = html.etree

2.请求数据

url = 'https://haikou.baixing.com/chongwujiaoyi/'
respsone = requests.get(url,headers=headers).content.decode('utf-8')
# print(respsone)

2.1 获取第一层链接

首先拿到每一只宠物的链接,进去之后才能拿到宠物的信息,f12打开开发者工具,然后审查元素看到每一条宠物的链接就在<ul>下的<li>里面

list = []
html = etree.HTML(response)
lis = html.xpath('/html/body/section[2]/div[3]/ul/li')
for li in lis:
   fir_url = li.xpath('./a/@href')   # 拿到每只宠物的url地址
   list.append(fir_url)
for i in list:
    if i == []:
    list.remove([])     # 稍微做一些数据处理

 这是拿到的链接

3.抓取数据

3.1 分析页面

可以看到想要的数据全部一一对应在每一个div里面了,可以直接Ctrl cv复制xpath路径一个个拿下。

3.2 抓取数据

接下来才开始获取我们想要的数据了,用for循环请求每一个链接,然后根据xpath的规则拿到我们想要的数据

for url in list:
    url = url[0]   # 去掉列表
    content = requests.get(url,headers=headers).content.decode('utf-8')  # 编码
    

info = []     #创建一个列表来存放我们的数据
html = etree.HTML(content)
divs = html.xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div[2]')
# print(len(divs))
for div in divs:
    blood = div.xpath('./div[2]/label[2]/text()')[0]
    age = div.xpath('./div[3]/label[2]/text()')[0]
    yimiao = div.xpath('./div[4]/label[2]/text()')[0]
    quchong = div.xpath('./div[5]/label[2]/text()')[0]
    price = div.xpath('./div[6]/label[2]/text()')[0]
    type = div.xpath('./div[7]/a/text()')[0]
    num = div.xpath('./div[8]/label[2]/text()')[0]
    phone = html.xpath('//*[@id="mobileNumber"]/strong/text()')[0]
    list = {
        '品种': type,
        '犬只血统':blood,
        '年龄':age,
        '疫苗情况':yimiao,
        '驱虫情况':quchong,
        '价格':price,
        '代售只数':num,
        '联系方式':phone
    }
info.append(list)  

需要抓取多页的朋友可以分析一下接口的页码参数,写个循环即可。

四、保存数据(MongoDB)

最后就只剩下把数据存入数据库了

client = pymongo.MongoClient('Localhost', 27017)   # 端口号
db = client['demo']  # 数据库名
data = db['petInfo']  # 表名
data.insert_one(list)   # 插入数据操作

五、完整代码

# _*_ coding:UTF-8 _*_

import requests
from lxml import html
import pymongo

etree = html.etree

headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
        'referer': 'https: // haikou.baixing.com / chongwujiaoyi / m177986 /'
          # 这里需要加入防盗链,第一次请求没加获取不到页面信息
    }
def get_res():
    url = 'https://haikou.baixing.com/chongwujiaoyi/'
    respsone = requests.get(url,headers=headers).content.decode('utf-8')
    # print(respsone)
    return respsone

def get_url(response):
    list = []
    html = etree.HTML(response)
    lis = html.xpath('/html/body/section[2]/div[3]/ul/li')
    for li in lis:
        fir_url = li.xpath('./a/@href')   # 拿到每只宠物的url地址
        list.append(fir_url)
    for i in list:
        if i == []:
            list.remove([])   # 稍微做一些数据处理
    print(list)
    return list

def get_pet_info(list):
    for url in list:
        url = url[0]
        content = requests.get(url,headers=headers).content.decode('utf-8')
        parse_data(content)

def parse_data(content):
    info = []     #创建一个列表来存放我们的数据
    html = etree.HTML(content)
    divs = html.xpath('/html/body/div[1]/div[1]/div[1]/div[4]/div[2]')
    # print(len(divs))
    for div in divs:
        blood = div.xpath('./div[2]/label[2]/text()')[0]
        age = div.xpath('./div[3]/label[2]/text()')[0]
        yimiao = div.xpath('./div[4]/label[2]/text()')[0]
        quchong = div.xpath('./div[5]/label[2]/text()')[0]
        price = div.xpath('./div[6]/label[2]/text()')[0]
        type = div.xpath('./div[7]/a/text()')[0]
        num = div.xpath('./div[8]/label[2]/text()')[0]
        phone = html.xpath('//*[@id="mobileNumber"]/strong/text()')[0]
        list = {
            '品种': type,
            '犬只血统':blood,
            '年龄':age,
            '疫苗情况':yimiao,
            '驱虫情况':quchong,
            '价格':price,
            '代售只数':num,
            '联系方式':phone
        }
        info.append(list)
        sava_mongodb(list)
    print(info)

def sava_mongodb(list):
    client = pymongo.MongoClient('Localhost', 27017)
    db = client['demo']
    data = db['petInfo']
    data.insert_one(list)

def main():
    response = get_res()
    list = get_url(response)
    # get_pet_info(list)

if __name__ == '__main__':
    main()

总结

摘抄Jack-Cui大佬的一句话:我们要做一个友好的爬虫。写爬虫,要谨慎,勿给服务器增加过多的压力,满足我们的获取数据的需求,这就够了。

你好,我也好,大家好才是真的好。

    PS:如果觉得本篇本章对您有所帮助,欢迎关注、评论、点赞,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬取 百姓网部分数据 + 存入MongoDB数据库详细案例 的相关文章

随机推荐

  • 代码管理工具SVN

    svn 什么是svn SVN是Subversion的简称 是一个开放源代码的版本控制系统 相较于RCS CVS 它采用了分支管理系统 它的设计目标就是取代CVS 互联网上很多版本控制服务已从CVS迁移到Subversion 说得简单一点SV
  • 力扣-->#剑指Offer 563 . 二叉树倾斜

    这道题要理解有一定的困难 首先看到这样的题目肯定想到的就是遍历 其次 需要有一个值来记录倾斜度 即 left right 再者 需要一个函数来帮忙辅助计算倾斜度 即findSum class Solution int findSum Tre
  • RIP、OSPF等路由协议严格意义上讲属哪一层?

    1 RIP基于UDP BGP基于TCP OSPF和EIGRP基于IP 这些在TCP IP协议栈中定义的路由协议用于发现和维护前往目的地的最短路径 你可以认为它们不属于网络层协议 注意 是用 based on 而不是实现了 BGP用TCP 所
  • 微信公众号h5页面实现授权,前端部分

    授权步骤 微信开发工具上配置公众号的apiId 微信环境内调起微信的授权功能 代码实现 此段代码放在app vue的监听函数中 每当路由发生变化 都会判断此页面是否已授权 没授权的话则进行授权 watch route handler fun
  • 4. 消息中心的设计与实现

    消息中心的设计与实现 一 引言 运用场景 1 消息的主动提醒 客户端被动接收 2 客户模块 及时通讯 3 单一登录 一个账号只能在一个设备登录 消息中心的实现方案 1 客户端轮询 2 TCP长连接 常用 Java的长连接的方案 Java B
  • windows命令行下ftp连接超时的可能原因

    1 需要连接的主机没有启用ftp服务 iis没有建立ftp站点 ftp身份验证设置不当 详情参考博文 windows下使用ftp 以及 windows开启ftp服务 两篇博文有重复的部分 我将他们取并集操作了一遍 另外 我还处理了iis未授
  • 使用Visual Studio编译ffmpeg

    一 首先参照下面的链接配置和编译 FFmpeg在VS2017下的编译 vs2017 ffmpeg源码编译 鱼儿 1226的博客 CSDN博客 vs2019编译ffmpeg源码为静态库动态库 完整步骤 亲测可行 ffmpeg vs 令狐掌门的
  • 嵩天老师-Python语言程序设计-Python123配套练习测验题目汇总整理

    测验1 Python基本语法元素 知识点概要 普遍认为Python语言诞生于1991年 Python语言中的缩进在程序中长度统一且强制使用 只要统一即可 不一定是4个空格 尽管这是惯例 IPO模型指 Input Process Output
  • 求最长不含重复字符的子字符串——C++

    声明 本文原题主要来自力扣 记录此博客主要是为自己学习总结 不做任何商业等活动 一 原题描述 剑指 Offer 48 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串 计算该最长子字符串的长度 示例 1 输入
  • Linux查看进程命令

    查看进程 1 ps 命令用于查看当前正在运行的进程 grep 搜索 例如 ps ef grep java 表示查看所有进程里 CMD 是 java 的进程信息 2 ps aux grep java aux 显示所有状态 ps 3 kill
  • Sublime Text4 配置 Python3 环境、代码提示、编译报错教程

    1 配置 Python3 环境 单击 工具 gt 编译系统 gt 新建编译系统 弹出 替换里面的内容为 cmd G CodeTools anaconda3 python exe u file file regex File line 0 9
  • 数据中台数据分析过程梳理

    在当今社会中 随着企业的快速发展 相关业务系统的建设也会越来越多 新的业务模式 新的IT架构 多云环境的出现等等 而一些问题就逐渐暴露了出来 企业之间的IT无法做到互通 新模式生产数据与旧数据无法互通 企业IT架构错综复杂 底层数据互通更加
  • java使用opencv库二值化图片

    应用场景 截取监控视频图片保存到本地后用作后期监控视频角度调整参考 使用二值化后的图片并进行透明度降低进行监控矫正 package img import java awt Color import java awt image Buffer
  • delphi XE5如何把其它程序而不是本软件在通知区域的图标隐藏?不是关闭进程。请举个详细例子,比如Shell_NotifyIcon...

    Delphi XE5可以使用API函数Shell NotifyIcon来实现隐藏其它程序的图标 具体代码例子如下 procedure HideIcon APid Cardinal var noteIconData TNOTIFYICONDA
  • 关于 hostapd

    关于 hostapd 主页 http w1 fi hostapd hostapd是一个IEEE 802 11的AP和IEEE 802 1X WPA WPA2 EAP RADIUS验证器 此页面用于怎么在linux系统下使用它 其他操作系统请
  • 金融贷款行业实时高精准获客 ——三网运营商大数据

    都说生产是第一因素 但对于任何企业来说 客户来源才是第一因素 在大多数行业 获得客户的困难已经成为行业的挑战 如今 许多行业和企业获得客户的主要来源是在线促销和客户获取 现在几乎每个人都有一部手机 运营商可以根据移动客户的访问行为 通信行为
  • 排查java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:***

    首先排查 vi etc sysconfig network 没有就加上 HOSTNAME 你的主机名 XXXX 如果有 接着排查 vi etc hosts 没有就加上 127 0 0 1 localhost localdomain loca
  • 2021年全球与中国高速分散机行业市场规模及发展前景分析

    2021年全球与中国高速分散机行业市场规模及发展前景分析 本报告研究全球与中国市场高速分散机的发展现状及未来发展趋势 分别从生产和消费的角度分析高速分散机的主要生产地区 主要消费地区以及主要的生产商 重点分析全球与中国市场的主要厂商产品特点
  • 论文阅读:DeepFake-Adapter: Dual-Level Adapter for DeepFake Detection(Deepfake模型快速调参)

    一 论文信息 论文名称 DeepFake Adapter Dual Level Adapter for DeepFake Detection 作者团队 项目主页 https github com rshaojimmy DeepFake Ad
  • python爬取 百姓网部分数据 + 存入MongoDB数据库详细案例

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 实施步骤 二 目标网站 先分析目标网站 三 获取数据 1 引入库 2 请求数据 2 1 获取第一层链接 3 抓取数据 3 1 分析页面 3 2 抓取数据 四