网络爬虫之爬虫原理

news/2024/5/19 18:54:57

**

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")# 批量获取各城市房价涨跌幅top10for city_name, city_url in city_dict.items():# 城市首页处理city_html = process_index(city_url)# 房价涨跌top10plot_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")# 批量获取各城市房价涨跌幅top10for city_name, city_url in city_dict.items():# 城市首页处理city_html = process_index(city_url)# 房价涨跌top10plot_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.mrgr.cn/p/88117116

相关文章

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

React 《组件间通信》

React组件通信概念:组件通信就是组件之间的数据传递, 根据组件嵌套关系的不同,有不同的通信手段和方法A-B 父子通信 B-C 兄弟通信 A-E 跨层通信父子通信-父传子基础实现 实现步骤父组件传递数据 - 在子组件标签上绑定属性 子组件接收数据 - 子组件通过props参数接收数据funct…

vue3打包js内存溢出

第一步:npm install -g increase-memory-limit第二步:npm install increase-memory-limit —save-dev第三步:package.json文件中修改 "build:win32": "cross-env LIMIT=2048 increase-memory-limit BUILD_TARGET=win32 node .electron-vue/build.js",//添…

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章: Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚,那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding,我们不妨看一眼Transformer的…

1小时学会SpringBoot3+Vue3前后端分离开发

首发于Enaium的个人博客 引言 大家可能刚学会Java和Vue之后都会想下一步是什么?那么就先把SpringBoot和Vue结合起来,做一个前后端分离的项目吧。 准备工作 首先你需要懂得Java和Vue的基础知识,环境这里就不多说了,直接开始。 …

C++初阶之入门

零、什么是C C是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 C缺点之一,是相对许多语言复杂,而且难学难精。许多人说学…

实验三——软件测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例;…

amCharts粒状梯度柱形图

代码案例<!DOCTYPE html> <html><head><script src="https://cdn.amcharts.com/lib/5/index.js"></script><script src="https://cdn.amcharts.com/lib/5/xy.js"></script><script src="https://cdn.am…

实验三:单元测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例;…

MQTT 数据包格式简介(V5.0)

MQTT 数据包格式简介(V5.0) 目录MQTT 数据包格式简介(V5.0)前言概览固定头(Fixed Header)可变头(Variable Header)包序号(Packet Identifier)特性(Properties)载荷(Payload)原因码(Reason Code)名词解释双字节(Two Byte Integer)、四字节数(Four Byte Integ…

JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

一、Spring配置优先级 不同配置文件&#xff0c;配置同一个属性谁有效 properties>yml>yaml 命令行参数>Java系统属性 项目打包后要改变属性&#xff1a; 红色是Java系统属性&#xff0c;绿色是命令行参数 ‘ 二、Bean管理 1.获取bean 获取IOC容器&#xff1a;ap…

实验三:软件测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例;…

公司新来的00后真是卷王,工作没两年,跳槽到我们公司起薪18K都快接近我了

​都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他一次聊天才知道,原来这位小老弟家里条件不好,一大家子指望他…

做梦我都没想过,我会在软件测试行业一干就是10年【避坑指南】

我是14年毕业的,普通本科,计算机系也算是一个对口专业。那时候互联网行业是个很不错的发展方向,也是机缘巧合之下,让我走上了测试工程师的道路。但是我没想到,在这个行业一干就是10年。 第一份工作 还记得我刚入行的时候,进了一家社交平台公司做测试,公司最开始只我人一…

智能生产新纪元:化工厂生产可视化引领行业变革

在现代化工业领域,化工厂作为重要的生产基地,其生产过程的监控与管理一直是行业关注的焦点。随着信息技术的飞速发展,可视化技术应运而生,为化工行业的安全生产和高效运营提供了有力支持。在现代化工业领域,化工厂作为重要的生产基地,其生产过程的监控与管理一直是行业关…

OmniPlan Pro for Mac v4.8.0中文激活版 项目流程管理工具

OmniPlan Pro for Mac是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。 OmniPlan Pro for Mac v4.8.0中文激活版 通过OmniPlan Pro&#xff0c;用户可以轻松创建任务&#xff0c;设置任务的开始和结束时…

React 《入门案例》

一、案例二、创建项目 npm init vite@latest # 选择react # 删除不必要的css,文件等 # 安装依赖classnames、sass、uuid、dayjs、lodash npm i -S classnames # 处理className属性 npm i -S uuid #生成uuid npm i -S dayjs # 日期处理 npm i -S lodash # 操作数组 npm i -D…

【数据结构|C语言版】算法效率和复杂度分析

前言1. 算法效率2. 大O的渐进表示法3. 时间复杂度3.1 时间复杂度概念3.2 时间复杂度计算举例 4. 空间复杂度4.1 空间复杂度的概念4.2 空间复杂度计算举例 5. 常见复杂度对比结语 ↓ 个人主页&#xff1a;C_GUIQU 个人专栏&#xff1a;【数据结构&#xff08;C语言版&#xff09…

java反汇编命令手册

1. 栈和局部变量操作 1.1 将常量压入栈的指令指令 功能描述aconst_null 将null对象引用压入栈iconst_m1 将将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型常量1压入栈iconst_2 将int类型常量2压入栈iconst_3 将int类型常量3压入栈iconst_4 将int类型常…

实验3-软件测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例;…