网络爬虫之爬虫原理

news2024/12/28 23:32:02

**

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.coloradmin.cn/o/1624678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oceanbase体验之(一)运维管理工具OCP部署(社区版4.2.2)

资源规划建议 ocp主机1台 内存:64G CPU1:2C及以上 硬盘大于500G observer服务器3台 内存32G CPU:4C以上 硬盘大于1T 建议存储硬盘与操作系统硬盘隔开实现IO隔离 一、OBD、OCP安装包准备 [rootobserver /]# chown -R admin:admin /software/ [rootobserver /]# …

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

30 OpenCV 点多边形测试

文章目录 点多边形测试pointPolygonTest示例 点多边形测试 pointPolygonTest pointPolygonTest( InputArray contour,// 输入的轮廓 Point2f pt, // 测试点 bool measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上&a…

汽车信息安全--如何理解TrustZone(2)

目录 1.概述 2 如何切换安全状态 3 TrustZone里实现了什么功能? 4. 与HSM的比较 1.概述 汽车信息安全--如何理解TrustZone(1)-CSDN博客讲解了什么是Trustzone,下面我们继续讲解与HSM的区别。 2 如何切换安全状态 在引入安全扩展后,Arm…

【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解

前端创造的图片粒子动画效果:HTML5 Canvas 技术详解 我们将深入探讨如何通过 HTML5 的 Canvas 功能,将上传的图片转换成引人入胜的粒子动画效果。这种效果将图片分解成小粒子,并在用户与它们交互时产生动态变化。我们将分步骤详细解析代码&a…

vue快速入门(四十三)axios模块的安装与引入

步骤很详细,直接上教程 上一篇 在项目目录打开终端 输入以下命令安装axios npm i axios重新打开项目即可完成按照 测试 源码 main.js import Vue from vue import App from ./App.vue//全局引入axios // 引入axios import axios from axios; // 挂载到vue原型…

HarmonyOS har制作与引用

1. HarmonyOS har制作与引用 1.1 介绍 HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上&#…

Linux 进程概念和状态

目录 一、冯诺依曼体系结构 二、操作系统 1.概念 2.理解操作系统的管理 硬件和管理 为什么要有操作系统 三、进程的概念 PCB: 进程的删除和子进程的创建 删除 创建子进程 四、进程的状态 七种状态: 实验查看部分状态: R&#x…

2.7设计模式——Proxy 代理模式(结构型)

意图 为其它对象提供一种代理以控制这个对象的访问。 结构 Proxy保存一个引用使得代理可以访问实体;提供一个与Subject的接口相同的接口,使代理可以用来替代实体;控制实体的存取,并可能负责创建和删除它;其他功能依赖…

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT!无限多…

【draw.io的使用心得介绍】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

K8S--常用的命令

原文网址:K8S--常用的命令-CSDN博客 简介 本文介绍K8S常用的命令。 官网 简略用法:https://kubernetes.io/zh-cn/docs/reference/kubectl/ 详细用法(有示例):https://kubernetes.io/docs/reference/generated/kub…

JS设计模式-透过现象看本质

JS设计模式-透过现象看本质 设计模式SOLID设计原则创建型构造器模式工厂模式 - 简单工厂工厂模式 - 抽象工厂(开发封闭原则)构造器和简单、抽象工厂的区别 单例模式原型模式 结构型装饰器模式适配器模式代理模式事件代理 - 事件冒泡虚拟代理 - 通过Image…

前端开发攻略---用原生JS在网页中也能实现语音识别

1、语音识别的过程 语音识别涉及三个过程:首先,需要设备的麦克风接收这段语音;其次,语音识别服务器会根据一系列语法 (基本上,语法是你希望在具体的应用中能够识别出来的词汇) 来检查这段语音;最后&#xf…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Text Edit的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 输入类控件 | Text Edit的使用及说明 文章编号&#xff…

Jsoncpp搭建交叉编译环境(移植到arm)

1. 官网下载源码 github地址:GitHub - open-source-parsers/jsoncpp at update 2. 交叉编译环境 当前平台/开发平台-编译环境: [rootlocalroot ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalroot ~]# uname -a Lin…

大型语言模型LLM的数据管理与应用

大型语言模型(LLM)风靡全球,尤其是 OpenAI 的最新发展。LLMs 的魅力来自于其理解、解释和生成人类语言的能力,而这曾被认为是人类的专属领域。像 CoPilot 这样的工具正在迅速融入开发人员的日常生活,而以 ChatGPT 为动…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架,状态可以跨组件共享,状态更新后,调用监听器。其实状态可以认为就是个全局对象,为什么要做一个框架来管理呢?如果我们自己使用一个全解字典来管理状态是不是也行?如果不做任何控…

不同语言在算法使用方面的差异(Java 、C++篇)

由于我认为的会了是能得到结果了,所以我亲自去把题解的C代码给改成了Java的,尽管代码和逻辑上的高度统一。编译器还是报错了。 第三个死都过不去。而且后面的还超时了。 这使我十分怀疑是不是超时或者空间不够所导致的。但是去问讯飞星火,它…