网络爬虫之爬虫原理

**

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.mzph.cn/pingmian/3150.shtml

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

相关文章

通过本机端口映射VMware中虚拟机应用(例如同一局域网别人想远程连接你虚拟机中的数据库)

需要 虚拟机中安装一下达梦数据库,并且以后大家都连接你虚拟机中达梦数据库进行开发。。。。。。在不改动自己虚拟机配置,以及本地网卡任何配置的情况下如何解决?本虚拟机网络一直使用的NAT模式。 解决 找到NAT设置添加端口转发即可解决。…

高级IO—多路转接

🎬慕斯主页: 修仙—别有洞天 ♈️今日夜电波:Cupid - Twin Ver. (FIFTY FIFTY) - Sped Up Version 0:20━━━━━━️💟──────── 2:25 🔄 …

【FFmpeg】视频与图片互相转换 ( 视频与 JPG 静态图片互相转换 | 视频与 GIF 动态图片互相转换 )

文章目录 一、视频与 JPG 静态图片互相转换1、视频转静态图片2、视频转多张静态图片3、多张静态图片转视频 二、视频与 GIF 动态图片互相转换1、视频转成 GIF 动态图片2、 GIF 动态图片转成视频 一、视频与 JPG 静态图片互相转换 1、视频转静态图片 执行 ffmpeg -i input.mp4 …

《浪潮之巅》:时代的巨轮与公司的兴衰

《浪潮之巅》是一部引人深思的作品,作者吴军通过对AT&T等公司的兴衰历程的叙述,展现了在科技浪潮之巅,公司如何成长、兴盛,并最终可能面临困境或转型。读完这部作品,我对公司的发展、企业经营者的战略眼光以及硅谷…

linux-1-shell

shell脚本(本文以Bash为基础) 要特别注意空格!!! shell一般用于数据的导入导出、文本传输、作业调度 只有单行注释 shell大多数命令可以直接在linux内运行在shell脚本中写入代码时要先写入 #!/bin/bash #! 告诉系统其…

保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库

离线在银河麒麟高级操作系统v10安装mysql5.7 下载mysql5.7 MySQL :: Download MySQL Community Server (Archived Versions) 2、把下载好的包上传到服务器 3、解压 [root1-0001 ~]# cd /data/mysql[root1-0001 mysql]# tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz…

artifactory配置docker本地存储库

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

Entropy 题解 Huffman编码 优先队列

Entropy 题目描述 An entropy encoder is a data encoding method that achieves lossless data compression by encoding a message with “wasted” or “extra” information removed. In other words, entropy encoding removes information that was not necessary in t…

Mac和VScode配置fortran

最近更换了mac电脑,其中需要重新配置各类软件平台和运行环境,最近把matlab、gmt、VScode、Endnote等软件全部进行了安装和配置。但是不得不说,mac系统对于经常编程的人来说还是非常友好的! 由于需要对地震位错的程序进行编译运行…

【继承和多态】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

KEITHLEY(吉时利)2440源测量单位(SMU)数字源表

KEITHLEY(吉时利)2440源测量单位(SMU)数字源表 主要特性 50W 时性能高达 5A / 40V0.012% 基本测量精度,具有 6 位分辨率10pA / 100nV 测量分辨率与 KickStart 软件结合使用美国2440吉时利keithley数字源表特点 2400系列提供宽动…

动态链接是什么?在JVM中,类、对象、方法是如何交互的?

什么是动态链接? 常量池是JVM中存储字面量(literal)和符号引用(symbolic reference)的地方。在类加载的过程中,类文件的常量池中的符号引用会被解析成直接引用,这个过程就是动态链接。 动态链接…

windows10 安装iis 跑asp.net

场景 有个asp.net 需要部署在普通的windows10电脑上,电脑没有启用iis。需要配置下iis,这里记录下应用程序中必须要选中的一些选项。 步骤 打开控制面板,然后选择 程序 -> 启用或关闭 Windows 功能 -> Internet Information Services…

需求 分析

需求分析的任务 需求分析的任务 1、需求分析是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么?”这个问题。 2、确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。 3、系统分析员应该写出软件需求…

Spring Boot 集成 tk.mybatis

一 Spring Boot 集成 tk.mybatis tk.mybatis 是 MyBatis 的一个插件&#xff0c;用于简化 MyBatis 的开发。 1.添加依赖 Spring Boot 项目中的 pom.xml 文件中添加 MyBatis、TkMyBatis 和 MySQL的依赖。 <dependency><groupId>tk.mybatis</groupId><a…

17:缓存机制-Java Spring

目录 17.1 为什么需要缓存17.2 Redis 简介17.3 不同类型的缓存技术对比17.4 缓存机制在Java Spring框架中的应用17.5 应用场景17.6 注意事项 17.1 为什么需要缓存 1. 提升性能 缓存的核心价值在于将数据临时存储在快速访问的介质&#xff08;如内存&#xff09;中&#xff0c…

Xbox VR头盔即将推出,但它是Meta Quest的‘限量版’。

&#x1f4f3;Xbox VR头盔即将推出&#xff0c;但它是Meta Quest的‘限量版’。 微软与Meta合作推出限量版Meta Quest VR头映射Xbox风格&#xff0c;可能是Meta Quest 3或未来版本的特别定制版&#xff0c;附带Xbox控制器。这一合作是Meta向第三方硬件制造商开放其Quest VR头盔…

conda出现http429报错:CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url <xxx>

我的报错信息如下&#xff1a; CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url <https://mirrors.ustc.edu.cn/anaconda/pkgs/main/linux-64/current_repodata.json> Elapsed: 00:46.305607An HTTP error occurred when trying to retrieve this URL. HTTP errors…

ros程序项目打包deb 详细过程以及报错解决

需要注意,最好是 ubuntu 20的 系统, 18 的系统支持不足够 CMakeLists.txt 最后添加, xxxxx 是你的节点或者程序的名称,也就是最后运行的ros节点名称: install(TARGETS xxxxxx ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKI…

C语言如何⽤指针表示多维数组?

一、问题 如何⽤指针表示多维数组&#xff1f; 二、解答 这⾥就是以⼆维数组为例进⾏多维数组的操作演示。 ⾸先定义⼀个⼆维数组 int a[3][3] &#xff0c;数组名代表的是数组的起始地址&#xff0c;因此数组名 a 和第⼀个元素 a[0][0] 的地址是相同的&#xff0c;但是意义却…