如何用Python编写简单的网络爬虫(页面代码简单分析过程)

     

  一、什么是网络爬虫

       在当今信息爆炸的时代,网络上蕴藏着大量宝贵的信息,如何高效地从中获取所需信息成为了一个重要课题。网络爬虫(Web crawler)作为一种自动化工具,可以帮助我们实现这一目标,用于数据分析、搜索引擎优化、信息监测等目的。由于Python语言有易学、丰富的库和爬虫框架、多线程支持、跨平台支持和强大的数据处理能力等特点,在编写爬虫方面具有得天独厚的优势,这些优势使得Python成为爬虫开发的首选语言。本文介绍了一般网络爬虫的实现过程,并介绍如何Python语言编写一个简单的网络爬虫。

二、网络爬虫的实现步骤

网络爬虫的实现可概括为以下几个步骤:

  1. 发送HTTP请求: 网络爬虫首先向目标网站发送HTTP请求,请求特定的页面内容。这通常是使用Python中的requests库或类似工具来完成的。

  2. 获取页面内容: 网络爬虫接收到服务器的响应后,获取页面的HTML内容。这个内容可能包含文本、图片、视频、链接等信息。

  3. 解析页面内容: 爬虫将获取到的HTML内容进行解析,通常使用HTML解析器(如BeautifulSoup)来提取出需要的信息,比如链接、文本、图片等。

  4. 链接提取: 在解析页面内容的过程中,爬虫会提取出页面中的链接。这些链接可以是其他页面的URL,也可以是资源文件(如图片、视频)的URL。

  5. 递归爬取: 爬虫将提取到的链接作为新的目标,继续发送HTTP请求并获取页面内容。这样就形成了一个递归的过程,爬虫不断地发现新的页面,并从中提取出更多的链接。

  6. 数据处理与存储: 爬虫在提取到数据后,可能需要进行进一步的处理和清洗,然后将数据存储到本地文件或者数据库中供后续使用。

  7. 异常处理与反爬虫策略: 在爬取过程中,可能会遇到各种异常情况,如网络连接错误、页面解析错误等。爬虫需要考虑这些异常情况并进行适当的处理,同时也需要应对目标网站可能采取的反爬虫策略,如设置User-Agent、使用代理IP、降低爬取速度等。

总的来说,网络爬虫的原理就是模拟人类用户的行为,通过发送HTTP请求获取页面内容,然后解析页面内容提取出需要的信息。通过不断地递归爬取和处理,爬虫可以从互联网上收集到大量的数据。

三、如何用python编写一个简单的爬虫?

在Python中,我们可以使用第三方库如requestsBeautifulSoup来编写一个最简单的网络爬虫。以下是一个简单的示例,用于爬取西安电子科技大学研究生院的通知公告栏目第一页中的标题及相应链接:

第一步:安装所需库

首先,我们需要安装requestsBeautifulSoup库。如果这两个库没有安装,可以进入命令行,

使用以下命令来安装:

pip install requests 
pip beautifulsoup4 

第二步:分析要爬取的页面

1、查看robots.txt

爬取页面前,首先要确定该网站是否允许通过爬虫获取数据。网站是否允许爬虫爬取数据,以及允许爬取哪些资源,一般都是通过robots.txt来确定。

比如知乎,只允许一些知名搜索引擎去爬取特定目录,其他的爬虫,则不允许爬取其网站数据。

西安电子科技大学研究生院的网址是https://gr.xidian.edu.cn/,加上robots.txt,就是链接就是https://gr.xidian.edu.cn/robots.txt,未设置robots.txt文件进行说明,未做限制,那就拿它来试一下吧。经测试,西电网站确实比较友好,即使不修改,将爬虫伪装成浏览器,获取信息也没有什么困难。

2、使用开发者工具对目标页面进行分析

打开网站通知公告栏目,可以看到网址是https://gr.xidian.edu.cn/tzgg1.htm

在浏览器中按F12,进入开发者工具。

在开发者工具中选择“网络”-“全部”,然后再点击浏览器中左上角的刷新按钮。你会发现,刷新这一页面后,下载了好多东西,既有htm文件,又有css文件,还有js文件以及jpg图像文件等。一般来说,HTML文件(或htm文件)负责网页的架构;CSS文件负责网页的样式和美化;JavaScript(JS)则是负责网页的行为。正是因为这些文件相互配合,才使得页面能够正常显示。

从浏览器的网址来看,通知公告的首页网址对应的文件应该是tzgg1.htm,从文件大小来比较,它的信息量也是最大的,点击它后,点击标头进行查看。

可以看到,标头中包含许多重要信息,是编写爬虫是必须要注意的部分。从标头中可以看到请示链接方法是用的GET方法,状态码是200为正常结束,GET方法相对于POST方法而言相对简单。发现这里使用了strict-origin-when-cross-origin的Referrer Policy,原以为这个策略会给我们的爬虫增加一些麻烦,结果并没有。

3、"strict-origin-when-cross-origin" 策略

"strict-origin-when-cross-origin" 是一种比较严格的 Referrer Policy 策略。它的行为如下:

  1. 当请求从一个页面 A 跳转到同一源的页面 B 时,Referrer 首部会包含完整的 URL 信息,包括路径和查询参数。这是为了确保目标页面 B 能够获取足够的信息来处理请求。
  2. 当请求从页面 A 跳转到不同源的页面 C 时,Referrer 首部只包含请求源的 origin 信息,而不包含路径或查询参数等详细信息。这是为了减少敏感信息的泄露。

      可以看到通知公告首页面的Referer是主页面https://gr.xidian.edu.cn,我们正是从主页面进行通知公告栏目的,再点击下一页,可以看到Referer变成https://gr.xidian.edu.cn/tzgg1.htm,在站内不同页面之间的链接,是完全遵守"strict-origin-when-cross-origin" 策略的

       原以为"strict-origin-when-cross-origin" 策略的引用可能是为防爬策略,不在Request Head中设置正确的Referer无法爬取正确的数据,结果似乎没什么影响,也许是因为动作太小吧。

     编写网络爬虫相较于一般程序而言,性价比是比较低的,一是因为其一般没有什么通用性,一个网站的代码一种风格,规则也不一样;二是对于防爬做的好的网站,想将其分析透彻或是进行破解,可能要花费大量的时间。

4、源代码分析,查找链接对应的源代码

下面,我们要做的是,在页面源代码中找到有关通知标题对应的代码。

(1)源代码查找法

     点击“响应”,可以看到网站服务器返回的响应信息,也就是文件tzgg1.htm的源代码,看到原页面中第一条通知包含“少数民族高层次骨干人才",点击代码,然后按Ctrl+F,输入“少数民族高层次骨干人才”回车,立即找到了相关的网页代码。

      学习网络爬虫,是必须对HTML有一定了解的,但不需要精通,如果不太了解,可通过我写的另一篇博客快速了解HTML有关知识:HTML超详细教程_html教程-CSDN博客。

从代码中可以看到,通知都集中在<DIV class="main-right-list"> 中的 <UL>内,每条通知的标题和链接都包含在一个<li>的<a>内,

<DIV class="main-right-list">
 <UL>
  <li id="lineu10_0">
     <a href="info/1073/13315.htm" target="_blank">西安电子科技大学关于2024年硕士研究生“少数民族高层次骨干人才”专项计划调剂的...
     </a>
     <span> &nbsp;2024-04-03&nbsp; </span>
  </li>
  <hr id="duannumu10_0" style="display:none;height:1px;border:none;border-top:1px dashed #CCCCCC;">

   <li id="lineu10_1">
    <a href="info/1073/13313.htm" target="_blank">研究生院2024年(清明节)值班安排表
    </a>
    <span> &nbsp;2024-04-03&nbsp;</span></li>
   </UL>
</DIV>
(2)元素查找定位法

在开发工具中,点击“元素”,就可以将鼠标放在相应代码上,直接查看代码在左边页面上对应哪些模块。可也明显看到,通知的链接都在<div class="main-right-list">内,这样查找,更直观也更方便。

第二步:编写爬虫代码

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup


def get_links(url):
    # 发送HTTP请求获取页面内容
    response = requests.get(url)

    #使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(response.content, "html.parser",from_encoding='utf-8')

    #定位到class名为main-right-list的div
    rightlist=soup.find('div', class_='main-right-list')

    # 找到div中所有链接并提取标题和URL
    links = rightlist.find_all("a")
    #链接只包含路径,未包含域名,将其补上
    return [(link.text, "https://gr.xidian.edu.cn/"+link.get("href")) for link in links]


# 要爬取的网页URL
url = "https://gr.xidian.edu.cn/tzgg1.htm"

# 获取链接并打印标题和URL
links = get_links(url)
for title, link in links:
    print(f"{title}: {link}")

在这个示例中,我们首先使用requests库发送HTTP请求获取网页内容,然后使用BeautifulSoup库解析HTML内容。最后,我们提取所有链接的标题和URL,并将其打印出来。

在爬到的链接最后,列出了下一頁的网址,通过它就可以进行下一页的爬取,一直循环到将全部内容爬完,这里不再赘述。

四、爬虫使用注意事项

在编写爬虫时,还有一些注意事项需要注意:

  • 尊重网站规则: 爬虫应该遵守网站的robots.txt文件,以确保不会对网站造成过度负荷或侵犯其隐私政策。
  • 处理异常情况: 在爬取过程中,可能会遇到各种异常情况,如网络错误或页面解析错误。在编写爬虫时,应该考虑这些情况并进行适当处理。本文的爬虫比较简单,未进行异常处理。
  • 频率控制: 为了避免对网站造成过度负荷,爬虫应该控制访问频率,并遵守网站的访问频率限制。

以上为个人爬虫学习的一点体会,如不当或不正确之处,欢迎指出,以便及时更正。

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

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

相关文章

发挥自定义表单开源优势,助力实现流程化办公!

在数字化发展进程中&#xff0c;利用低代码技术平台、自定义表单开源的优势特点&#xff0c;可以让企业实现流程化办公&#xff0c;从而实现提质增效的办公目的。作为一种新兴的应用开发模式&#xff0c;低代码技术平台获得了很多新老客户朋友的青睐和喜爱&#xff0c;正以它自…

静力水准仪如何进行数据获取及转换?

静力水准仪作为现代测量技术中的一项重要工具&#xff0c;通过利用磁致伸缩效应实现了对被测物体沉降量的高精度测量。本文将介绍磁致式静力水准仪数据获取的原理与方法&#xff0c;以及数据转换的过程&#xff0c;探讨其在工程安全监测领域的应用价值。 数据获取原理 静力水准…

【QT入门】 Qt自定义控件与样式设计之QPushButton点击按钮弹出菜单

往期回顾&#xff1a; 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关-CSDN博客 【QT入门】 Qt自定义…

ai智能问答免费API接口

智能对话API接口&#xff0c;可以为网站或其他产品提供强大的智能交互功能&#xff0c;无需自行开发复杂的语义分析和自然语言处理算法。这使得开发者能够更专注于产品的核心功能和用户体验&#xff0c;加速产品上线速度并降低开发成本。 智能对话API接口的功能还包括对话内容…

德勤:《中国AI智算产业2024年四大趋势》

2023年《数字中国建设整体布局规划》的发布&#xff0c;明确了数字中国是构建数字时代竞争优势的关键支撑&#xff0c;是继移动互联网时代以来经济增长新引擎。当我们谈论数字中国的构建&#xff0c;不仅仅是在讨论一个国家级的技术升级&#xff0c;而是关乎如何利用数字技术来…

AI时代,搜索引擎的巨头地位恐怕不保了

兄弟们&#xff0c;你们使用搜索网站的频率有降低吗&#xff1f; ChatGPT 已经流行了一年多了&#xff0c;这期间数个大模型都发展了起来。 搜索引擎本质上也属于问答系统&#xff0c;所以&#xff0c;在大模型成熟之后&#xff0c;我使用搜索的频率越来越低了。 主要是因为…

苍穹外卖Day12——总结12

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…

C语言 文件函数

目录 1. 文件的打开和关闭 2. 文件的顺序读写 2.1 顺序读写函数介绍 2.2读文件&#xff08;读文件只能读一次&#xff09; 2.3写文件 3. 文件的随机读写 3.1 fseek 3.2 ftell 3.3 rewind 4.文件读取结束的判定 4.1 被错误使误的 feof 我对读写的理解&#xff1a;(从…

【机器学习】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法&#xff0c;它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点&#xff0c;在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理&#xff0c;包括熵和信息熵的相关概念&#xff0c;以及几种经典的…

Git分布式版本控制系统——Git常用命令(一)

一、获取Git仓库--在本地初始化仓库 执行步骤如下&#xff1a; 1.在任意目录下创建一个空目录&#xff08;例如GitRepos&#xff09;作为我们的本地仓库 2.进入这个目录中&#xff0c;点击右键打开Git bash窗口 3.执行命令git init 如果在当前目录中看到.git文件夹&#x…

el-table合计行添加按钮操作

针对于el-table中合计功能中的操作栏也可以按钮&#xff0c;并且可以添加点击事件 ElTable源码里footer部分是&#xff0c;这种方式渲染的&#xff0c;也就是 支持传递VNode。使用h第一个参数传递 组件&#xff0c;可以把组件转成VNode&#xff0c;比如现在要在右下角加一个 详…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.2 月末操作:GR/IR重组

2.6.2 月末操作&#xff1a;GR/IR重组 SAP在采购订单收货和发票校验时分别产生凭证&#xff0c;中间采用GR/IR过渡。GR即为收货&#xff0c;IR即为收票。月末&#xff0c;GR/IR的余额根据收货和收票的情况进行判断&#xff0c;转入“应付暂估”或“在途物资”&#xff0c;次月自…

CFS: A Distributed File System for Large Scale Container Platforms——论文泛读

SIGMOD 2019 Paper 分布式元数据论文阅读笔记整理 问题 随着容器化和微服务的出现&#xff0c;越来越多的应用程序转移到容器化环境中。在每组容器上运行的微服务通常独立于本地磁盘存储&#xff0c;虽然将计算与存储脱钩允许更有效的扩展容器资源&#xff0c;但也带来了对单…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

【Spring进阶系列丨第八篇】Spring整合junit 面向切面编程(AOP)详解

文章目录 一、Spring整合junit1.1、导入spring整合junit的jar1.2、在测试类上添加注解1.3、说明 二、面向切面编程(AOP)2.1、问题引出2.2、AOP2.2.1、概念2.2.2、作用2.2.3、优势2.2.4、实现方式2.2.5、专业术语2.2.5.1、连接点2.2.5.2、切入点2.2.5.3、通知/增强2.2.5.4、织入…

梯度下降小结

1.梯度下降法&#xff08;Batch Gradient Desent&#xff0c;BGD&#xff09;&#xff1a; 总体m个样本&#xff0c;损失函数&#xff1a; 计算损失函数梯度&#xff1a; 参数更新&#xff1a; 2.随机梯度下降法&#xff08;Stochastic Gradient Desent&#xff0c;SGD&#x…

GEE图表案例——不同区域各地类面积直方图分布图表(矢量面积叠加直方图图)

简介 在GEE中对不同区域面积统计的直方图绘制具体流程如下: 数据准备: 首先,需要准备用于面积统计的地理数据,可以是矢量数据,如行政边界、土地使用类型等。也可以是栅格数据,如分类结果、土地覆盖数据等。 区域划分: 根据需要统计的区域,将数据进行区域划分。可以使用…

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言&#xff1a;LLMs在强化学习中的探索能力探究 研究背景&#xff1a;LLMs的在情境中学习能力及其重要性 实验设计&#xff1a;多臂老虎机环境中的LLMs探索行为 实验结果概览&#xff1a;LLMs在探索任务中的普遍失败 成功案例分析&#xff1a;Gpt-4在特定配置下的探…

基于Java+SpringBoot+Vue幼儿园管理系统(源码+文档+部署+讲解)

一.系统概述 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种教 学生信息、学生考勤、健康记录…

智慧粮仓监测系统解决方案

一、概述 粮食储备是每个国家战略物资中最为重要的一项储备&#xff1b;而随着现代化农业的快速发展以及国家经济发展的需要&#xff0c;我国粮食产量和储备量长期处于世界前列。传统的粮仓由于修建年代久远&#xff0c;可能存在着设施落后&#xff0c;实时监控不到位的现象&am…