网络爬虫之爬虫原理

**

image.png

爬虫概述 

        Python网络爬虫是利用Python编程语言编写的程序,通过互联网爬取特定网站的信息,并将其保存到本地计算机或数据库中。

"""
批量爬取各城市房价走势涨幅top10和跌幅top10
"""
​
from lxml import etree
import requests
​
​
HEADERS = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"}
INDEX = "https://bj.fangjia.com/zoushi"
​
​
def process_index(url):
    """
    首页处理
    @param url: url
    @return: 返回首页源代码
    """
    res = requests.request("GET", url=url, headers=HEADERS)
    res.encoding = "utf-8"
    return res.text
​
​
def process_city(html):
    """
    各城市首页url获取
    @param html: 源代码
    @return: 返回各城市名和url
    """
    parse = etree.HTML(html)
    text = parse.xpath('//div[@class="tab_content"]/div')
    city_name = []
    city_url = []
    for i in text:
        city_name.extend(i.xpath("./a/text()"))
        city_url.extend(i.xpath("./a/@href"))
    city_info = dict(zip(city_name,city_url))
    return city_info
​
​
def process_trend(html):
    """
    各城市小区涨跌top处理
    @param html: 网页源码
    @return: 各城市小区名,房价基本信息
    """
    parse = etree.HTML(html)
    area = parse.xpath('//div[@class="trend trend03"]/div/div//tbody/tr')
    plot_name = []
    info = []
    for tr in area:
        plot_name.extend(tr.xpath("./td/a/text()"))
        plot_info = tr.xpath("./td/text()")
        base_info = ','.join(plot_info)
        info.append(base_info)
    plot_intend = dict(zip(plot_name,info))
    return plot_intend
​
​
​
if __name__ == '__main__':
    index_html = process_index(INDEX)
    city_dict = process_city(index_html)
    # 记录到文件中
    f = open('全国各城市房价小区涨跌top10_by_xpath.txt',"w", encoding="utf-8")
    # 批量获取各城市房价涨跌幅top10
    for city_name, city_url in city_dict.items():
        # 城市首页处理
        city_html = process_index(city_url)
        # 房价涨跌top10
        plot_intend = process_trend(city_html)
        if bool(plot_intend):
            for k,value in plot_intend.items():
                f.write(f"城市{city_name}----小区名--{k}---房价基本信息{value}\n")
                print(f"城市{city_name}----小区名{k}下载完毕....")
        else:
            f.write(f"城市{city_name}无涨幅小区top10\n")
        f.write(f"-------------------城市{city_name}分隔线--------------------------\n")
    f.close()

发起请求

         一般来说,对于不是接口返回的数据,爬虫首先要做的就是获取网页源代码,网页源代码中有我们需要的数据。

image.png

def process_index(url):
    """
    首页处理
    @param url: url
    @return: 返回首页源代码
    """
    res = requests.request("GET", url=url, headers=HEADERS)
    res.encoding = "utf-8"
    return res.text

以上片段代码就是获取首页源代码。

提取信息 

        获取网页源代码后,接下来就是分析网页源代码,从中提取我们想要的数据。 首先,最通用的方法便是采用正则表达式提取,这是一个万能的方法,但是在构造正则表达式时比较复杂且容易出错。另外,由于网页的结构有一定的规则,所以还有一些根据网页节点属性、CSS 选择器或 XPath 来提取网页信息的库,如 Beautiful Soup、pyquery、lxml 等。使用这些库,我们可以高效快速地从中提取网页信息,如节点的属性、文本值等。

def process_city(html):
    """
    各城市首页url获取
    @param html: 源代码
    @return: 返回各城市名和url
    """
    parse = etree.HTML(html)
    text = parse.xpath('//div[@class="tab_content"]/div')
    city_name = []
    city_url = []
    for i in text:
        city_name.extend(i.xpath("./a/text()"))
        city_url.extend(i.xpath("./a/@href"))
    city_info = dict(zip(city_name,city_url))
    return city_info
​
​
def process_trend(html):
    """
    各城市小区涨跌top处理
    @param html: 网页源码
    @return: 各城市小区名,房价基本信息
    """
    parse = etree.HTML(html)
    area = parse.xpath('//div[@class="trend trend03"]/div/div//tbody/tr')
    plot_name = []
    info = []
    for tr in area:
        plot_name.extend(tr.xpath("./td/a/text()"))
        plot_info = tr.xpath("./td/text()")
        base_info = ','.join(plot_info)
        info.append(base_info)
    plot_intend = dict(zip(plot_name,info))
    return plot_intend
​

以上代码就是通过Xpath方式获取我们想要的数据。

保存数据 

        提取信息后,我们一般会将提取到的数据保存到某处以便后续使用。这里保存形式有多种多样,如可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySQL 和 MongoDB 等。

if __name__ == '__main__':
    index_html = process_index(INDEX)
    city_dict = process_city(index_html)
    # 记录到文件中
    f = open('全国各城市房价小区涨跌top10_by_xpath.txt',"w", encoding="utf-8")
    # 批量获取各城市房价涨跌幅top10
    for city_name, city_url in city_dict.items():
        # 城市首页处理
        city_html = process_index(city_url)
        # 房价涨跌top10
        plot_intend = process_trend(city_html)
        if bool(plot_intend):
            for k,value in plot_intend.items():
                f.write(f"城市{city_name}----小区名--{k}---房价基本信息{value}\n")
                print(f"城市{city_name}----小区名{k}下载完毕....")
        else:
            f.write(f"城市{city_name}无涨幅小区top10\n")
        f.write(f"-------------------城市{city_name}分隔线--------------------------\n")
    f.close()

以上代码把获取的数据写入本地的.txt文件中。

image.png

Python网络爬虫的原理包括以下几个步骤:

  1. 发送HTTP请求:通过Python的requests库向目标网站发送HTTP请求,获取网页内容。

  2. 解析网页内容:使用Python的HTML解析库(如BeautifulSoup、lxml等)对网页内容进行解析,获取需要爬取的信息。

  3. 数据存储:将爬取到的数据存储到本地文件或数据库中,以备后续分析或应用。

  4. 遍历链接:使用Python的正则表达式或其他库解析网页中的链接,进一步遍历目标网站的其他页面,从而实现自动化爬取。

需要注意的是,在进行Python网络爬虫时,需要遵守网站的爬虫规则,以免侵犯网站的合法权益。此外,为了避免被反爬虫机制识别,还需要使用一些反反爬虫技术,如使用代理IP、设置请求头、限制爬虫频率等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AJAX——黑马头条-数据管理平台项目

1.项目介绍 功能: 登录和权限判断查看文章内容列表(筛选,分页)编辑文章(数据回显)删除文章发布文章(图片上传,富文本编辑器) 2.项目准备 技术: 基于Bootst…

【韩国】UE5的MetaHuman确实可以导入Blender进行编辑。

UE5的MetaHuman确实可以导入Blender进行编辑。根据网络上的信息,你可以将MetaHuman模型导出为FBX文件,然后在Blender中进行修改。修改完成后,你可以将其重新导入到Unreal Engine 5中4。请注意,当你在Blender中编辑模型时&#xff…

第12章 最佳的UI体验——Material Design实战

第12章 最佳的UI体验——Material Design实战 其实长久以来,大多数人都认为Android系统的UI并不算美观,至少没有iOS系统的美观。以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令; 2、熟悉常用 Linux Shell的命令; 3、熟悉在Linux文件系统中vi编辑器的使用; 4、进一步熟悉虚拟机网络连接模式与参数配置! 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

artifactory配置docker本地存储库

​一、概述 本地 Docker 存储库是我们部署和托管内部 Docker 镜像的位置。实际上,它是一个 Docker 注册表,能够托管的 Docker 镜像的集合。通过本地存储库,你可以保存、加载、共享和管理自己的 Docker 镜像,而无需依赖于外部的镜像…

API提取IP

API代理作为IP代理的一项重要业务,在绕开地域网络限制,提高作业效率等方面提供强大的技术支持。它能够帮助用户快速实现软件与软件间的交流,无障碍连通不同应用程序逻辑开发的系统应用。API代理用途范围广泛,如使用API提取代理IP、…

AcWing 1264. 动态求连续区间和 ,详细讲解线段树与树状数组(Python,篇一)

本篇博客主要介绍一下什么是线段树与树状数组,它们的原理与结构是怎样,并通过实际题型来讲解,篇一主要讲解线段树,下一篇博客讲解树状数组。 线段树与树状数组的区别和特点: 它们的时间复杂度都是O(nlogn) 存储方式…

使用navicate演示在 PostgreSQL 中使用 for 循环语句

1、简单循环示例 do $$ beginfor cnt in 1..10 loopraise notice cnt: %, cnt;end loop; end; $$ navicate中执行 2、循环查询 do $$ declare_record record; beginfor _record in (SELECT version,description FROM flyway_schema_history ORDER BY installed_rank desc li…

ios CI/CD 持续集成 组件化专题一 iOS 将图片打包成bundle

一、 创建 选择 macos 下的Bundle 二 、取名点击下一步 三、Base SDK 选择ios 四 、Build Active Architecture Only 五、Installation后面的内容删除 六、Skip Install 选择NO 七、Strip Debug Symbols During Copy 中"Release"项设置为 "YES" 八、COM…

书生·浦语 大模型(学习笔记-7)LMDeploy 量化部署 LLM-VLM 实践

目录 一、模型的部署 二、模型部署面临的问题 三、如何解决(两种方法) 四、LMDeploy相关知识 创建conda环境(漫长的等待) 五、使用LMDeploy与模型对话 六、设置最大KV Cache缓存大小 七、W4A16量化 八、客户端连接API服务器 一、模型的部署 二、…

leetcode-二叉树的镜像-91

题目要求 思路1 1.遍历一遍二叉树,将左边的结点对应创建一个右边的结点 2.用此方法空间复杂度O(n),并不是最优 思路2 1.将一个结点的左右子树进行交换,如果左子树还有左右结点,就再交换左子树的左右结点,以此递归下去…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序: https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办(调节音量)树莓派上的音乐播放器(可选)命令行直接放歌(尝试放mp3歌曲) …

linux 上 jps 列出一堆 jar,如何快速定位 jar 文件启动位置?

例如,在 /data下有一个 xxx.jar ,如果是通过 "java -jar /data/xxx.jar" 方式启动,则 jps会列出的名字中带 xxx.jar,这时再 "ps -ef | grep xxx.jar" 就会列出 更详细的信息,例如 "java -ja…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中,Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系: Homebrew (Brew):Homebrew 是 macOS 上的包管理器,用于安装和管理各种开源软件包。它使您能够轻松地从…

Windows 本地直接使用 SSH,SFTP 以及 SFTP下载文件到 Windows/mac 本地或上传(没有客户端时)

windows 本地打开 ssh 以及 sftp 等的方式 1.win(windows图标那个键) r 直接搜 然后从打开的位置运行 如果是打开 sftp 前面的 ssh 换一下成sftp 就行 直接从地址栏输入也可以直接转过去 通过 windows 的工具直接访问 sftp 后将文件下载到自己的windows 或 mac 上 先通过…

微软在汉诺威工业博览会上推出新制造业Copilot人工智能功能,强化Dynamics 365工具集

在近日于德国汉诺威举行的盛大工业博览会上,微软向全球展示了其最新推出的制造业人工智能功能,这些功能以Dynamics 365工具集为核心,旨在通过先进的AI技术为制造业带来前所未有的变革。 此次推出的新功能中,最为亮眼的是支持AI的…

Linux之ebpf(1)基础使用

Linux之ebpf(1)基础使用 Author: Once Day Date: 2024年4月20日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可以参考专栏:Linux基础知识_Once-D…

Linux系统网络---DNS域名解析服务

目录 一、DNS的简介 DNS系统的分布式数据结构👇 DNS系统类 两种查询方式 二.正向解析实验 1.先关闭防火墙、selinux 2.安装bind 3.查看配置、修改配置 4.修改区域配置文件 正向解析👇 反向解析👇 5.修改 正向解析&#x1f…

装饰品模式介绍

装饰器模式是一种结构型设计模式,它允许用户在不改变现有对象的情况下向一个对象添加新的功能。在 Java 中,装饰器模式经常用来动态地给对象添加额外的行为,如日志记录、事务管理、安全检查等。 装饰器模式涉及四个主要角色:组件&…

公司服务器中的kafka消息中间件挂了,我是如何修复的?

今天的公司的system系统服务在运行过程中,提示连接不上kafuka的消息中间件。但是负责kafka的同事已经离职了,询问公司开发也不知道如何处理,我是如何重启kafka消息中间件使system系统服务正常运行? 查看kafka的安装位置 在下面的…
最新文章