Python网络爬虫设计(一)

目录

一、网络爬虫

1、基本的爬虫

2、获取URL

3、查找网页源码关键字

4、代码实现

二、requests库

1、requests的优势和劣势

2、获取网页的其他库

(1)selenium库

(2)pyppeteer库

三、pyppeteer库

1、pyppeteer库的来历

2、pyppeteer库的工作原理

3、pyppeteer相关环境安装

四、协程

1、概念

2、注意事项

五、用pyppeteer获取网页


一、网络爬虫

网络爬虫,简称爬虫,它可以用来在网络上搜集一些数据(比如在搜索引擎上),也可以模拟浏览器的快速操作(比如我们可以用爬虫来实现抢课)

1、基本的爬虫

一个基本的爬虫写法如下:

(1)首先手动找出我们想要获取的网址(URL)

(2)在浏览器中搜索这个网址,查看网页的源代码,在源代码中找出我们想要的内容的字符串的模式(比如我们想要查找一些图片,在网页源码中,图片都有一些固定的关键字,我们通过抓取这些关键字,就可以获取图片)

(3)在程序中我们用URL得到对应的网页

(4)再根据程序中的正则表达式或者BeautifulSoup库来查找关键字,得到对应的内容并保存

2、获取URL

我们先在浏览器上搜索一个关键字:

我们观察这个网页对应的URL:

可以发现,在这个URL中,有一部分是“q = 乐高”,我们就可以猜想,是不是只要把q后面的文字改成我们想要搜索的关键字,就可以到达对应的页面?

我们直接在URL上把q后面的关键词改成“猫”,然后按下回车:

发现果然跳转到了猫的搜索页面!

这就意味着我们可以在代码中,通过修改q后面的数据,来到达对应的目标页面

3、查找网页源码关键字

当我们到达了目标页面,我们想要抓取几个图片,就需要通过页面源码的关键字:

我们在这个“猫”的搜索页面随便找一个图片,右键,选择“复制图像连接

我们会发现th(略缩图),id等具有标志性的东西,这些都指明了这可能是一个图片

当然,如果看不出来我们可以多复制几个图片的链接,来寻找共同点:

不难发现,很多图片都有/th/id/OIP-这一部分,这可能就是图片链接的共同特点:

右击网页空白处,点击“查看网页源码”,按ctrl + F , 

我们把这串字符复制进去:

按下回车,就能看见在源码的地方,很多处都被标记了这个关键字符串,我们就可以根据这个来爬取想要的图片;

4、代码实现

我们来找一个专门练习爬虫的页面来爬取几个图片(很多网页有反爬技术,最最基础的爬虫代码难以成功)

import re   #用来使用正则表达式
import requests     #用于HTTP请求
import os       #操作文件目录等def getHTML(url):       #用于获取目标页面的HTMLfakeHeader = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edg/81.0.416.77'}#定义了一个字典,用来模拟浏览器的请求头,欺骗浏览器try:r = requests.get(url, headers=fakeHeader)#发送一个GET请求到指定的url,并使用我们的假头部r.encoding = r.apparent_encoding#设置编码格式return r.text       #返回网页的HTML内容except Exception as e:print(e)return ""#------------------------以上内容可以固定的直接使用------------------------def getPicturePro(n):base_url = "https://spiderbuf.cn"   #基础的路径url = "https://spiderbuf.cn/web-scraping-practice/scraping-images-from-web"     #目标网页的URL(就是包含图片的)html = getHTML(url)     #调用函数,获取目标页面的HTML内容pt = r'<img[^>]+src="([^"]+)"'      #正则表达式,用于找到HTML里面的img标签的src属性的值i = 0   #图片个数(方便命名)for x in re.findall(pt, html):      #使用正则表达式pt找到html中所有符合的图片路径if x.startswith("/"):x = base_url + x     # 检查是否是相对路径,并转换为完整路径if not (x.lower().endswith(".jpg") or x.lower().endswith(".png")):      #拼接好后,如果不是jpg或png的图片,跳过不要continuetry:print(x)    #输出经过层层筛选的图片路径r = requests.get(x, stream=True)    #发送GET请求,获取图片,并以流式下载,防止一次性到内存pos = x.rfind(".")      #找到文件扩展名的起始位置if not os.path.exists(r"D:\学习\Python\temp"):os.makedirs(r"D:\学习\Python\temp")       #若不存在该目录就创建该目录f = open(r"D:\学习\Python\temp\{0}{1}{2}".format("image", i, x[pos:]), "wb")#打开该目录,并且以image和i来命名f.write(r.content)      #把图片写入文件f.close()except Exception as e:print(f"Error downloading {x}: {e}")    #若报错就返回错误信息i += 1getPicturePro(1)    #传入参数,表示开始执行

输出:

我们再看看文件夹:

二、requests库

在上面的代码中,我们可以看见,requests库的作用是用来发送HTTP请求的,可以完成大量的网络层面的任务

1、requests的优势和劣势

①优势:速度快,且安装简单,我们只需要使用pip命令就能安装requests库,很容易把自己的代码分享给别人使用,即共享性强

②劣势:requests库很容易被反爬虫手段屏蔽,可能一个有一点反爬虫手段的网页就能把这个代码屏蔽掉(比如我们用上面的代码去爬百度的搜索图片,是不能成功的,会被反爬),而且不能获取JavaScript的生成的动态网页

2、获取网页的其他库

面对刚刚上面requests的缺陷,我们在Python中,也提供了很多库来弥补它的不足

(1)selenium库

selenium库虽然比requests库更强一些,但是它的速度很慢,而且已经被许多网站反爬,可能还是无法成功

(2)pyppeteer库

速度很快,而且目前还没有被很多网站反爬,是一个比较好的选择

三、pyppeteer库

1、pyppeteer库的来历

pyppeteer是puppeteer的Python版本,而puppeteer是谷歌公司推出的可以控制Chrome浏览器的一套编程工具

2、pyppeteer库的工作原理

①启动一个浏览器Chromium,用浏览器装入网页,并且浏览器可以用无头模式(隐藏模式)或者显式模式启动(就是在执行爬取操作的时候用户能否看见浏览器操作页面的具体过程)

②从浏览器中可以获得网页的源代码,若网页就JavaScript程序,获得到的就是JavaScript被浏览器执行后的网页源码

③pyppeteer可以向浏览器发送命令,模拟用户在浏览器上的键盘,鼠标等操作

④selenium和pyppeteer的工作原理相同

3、pyppeteer相关环境安装

我们先在cmd窗口用pip命令下载pyppeteer

pip install pyppeteer

(要求Python版本在3.6及3.6以上)

当然,我们上面提到,我们需要启动一个特殊的浏览器Chromium,所以我们需要下载它:

在安装之前,我们需要确定我们安装了Node.js

安装官网:Node.js — 在任何地方运行 JavaScript

进入之后,我们点击下载LTS版本的(更加稳定)

在安装完成后,我们可以在cmd窗口检查一下是否安装完成:

node -v
npm -v

若安装成功,应该会类似如下:

安装完成之后,我们输入以下命令来安装:

npx @puppeteer/browsers install chrome@stable

在上图中的第六行,显示了安装的位置,我们定位到具体的目录,找到exe文件,可以创建一个快捷方式到桌面:

四、协程

1、概念

协程就是在代码中,前面加了async的函数

async def scy() :return 0

在调用协程时,必须在前面添加await

    await scy()

2、注意事项

(1)协程只能在协程里面调用,也就是说await关键字只能出现在协程里面,出现在外面就会报错!

(2)协程是一种特殊的函数,多个协程可以并行

(3)pyppeteer中的所有函数都是协程

五、用pyppeteer获取网页

代码如下:

import asyncio      #是Python的异步 I/O 框架,用于编写单线程并发代码
import pyppeteer as pyp#通过输入的url,获取指定的HTML内容
async def getHTML(url) :    #构造一个异步函数browser = await pyp.launch(headless = False , executablePath=r'C:\Users\23639\AppData\Local\Google\Chrome\Application\chrome.exe')    #启动一个浏览器,headless就是无头模式,设置成False就会显示浏览器,反之就不会#executablePath指明了Chrom浏览器的可执行路径page = await browser.newPage()      #等打开了浏览器,再在浏览器中获取我们想要的页面await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64;  x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 safari/537.36')#模拟浏览器的请求头await page.evaluateOnNewDocument(' () => Object. defineProperties (navigator, { webdriver: {get:()=> false } })}')#页面在加载的时候会被执行里面JavaScript代码,目的是防止浏览器检测自动化工具await page.goto(url)    #导航到指定的URLtext = await page.content()     #获取页面的HTML代码await browser.close()   #关闭浏览器return text     #返回text内容def getHTMLpro(url) :return asyncio.run(getHTML(url))   #返回页面的HTML内容HTML_result = getHTMLpro("https://cn.bing.com")   #调用函数
print(HTML_result)

执行结果:

这就是把我们输入的那个URL的网页给爬取了下来,如果把这个复制到一个文本文档中,把后缀改成.html,就是我们想要的那个页面

以上就是Python网络爬虫设计(一)的全部内容:)

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

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

相关文章

BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目录 一、规范要求 1、协议章节 2、测试目的 二、测试方法 1、样机初值条件&#xff1a; 2、测试步骤: 方法一&#xff1a;频谱仪 方法二&#xff1a;综测仪CMW500 3、预期结果 一、规范要求 1、协议章节 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知识库的构建

一、简介 我们在实现了一系列功能之后&#xff0c;终于来到了rag的部分&#xff0c;下面我们将基于langchain来实现一个rag检索。 关于rag方面的知识&#xff0c;可以查看这两篇文章&#xff1a; 大模型应用之RAG详解 什么是 RAG&#xff08;检索增强生成&#xff09; 或者是去…

CentOS7执行yum命令报错 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7执行yum命令报错 引更新yum源备份原有源创建新的源文件清理并重建缓存 引 CentOS 7 系统无法连接到 CentOS 的官方镜像站点。这通常是由于网络问题或 CentOS 7 已停止维护导致的&#xff08;2024年6月30日后 CentOS 7 已进入 EOL&#xff09; 报错明细&#xff1a; 已…

VSCode安装与环境配置(Mac环境)

20250419 - 概述 大概是非常久之前了&#xff0c;装了VSCode&#xff0c;估计都得21的时候了&#xff0c;电脑上也没更新过。当时安装也直接装上就完事了。这次把版本更新一下&#xff0c;同时记录一下这个安装过程。 安装 mac下安装非常简单&#xff0c;直接从官网下载&am…

QML动画--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行执行多个动画的容器动画类型&#xff0c;可以同时运行多个子动画。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?

一、什么是「对齐税」(Alignment Tax)? 所谓「对齐税」(Alignment Tax),指的是在使人工智能系统符合人类偏好的过程中,所不可避免付出的性能损失或代价。换句话说,当我们迫使AI遵循人类价值观和规范时,AI系统往往无法达到其最大理论性能。这种性能上的妥协和折衷,就…

速查手册:TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies(重叠指标)

速查手册&#xff1a;TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies&#xff08;重叠指标&#xff09; TA-Lib&#xff08;Technical Analysis Library&#xff09;是广泛使用的金融技术分析库&#xff0c;实现了超过150种技术指标计算函数&#xff0c;适用于股票…

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论&#xff1a;从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…

Git 中修改某个特定的commit提交内容

在 Git 中修改某个特定的提交&#xff08;commit&#xff09;通常需要使用 交互式变基&#xff08;Interactive Rebase&#xff09; 或 修改提交&#xff08;Commit Amend&#xff09;。以下是不同场景下的具体操作步骤&#xff1a; 一、修改最近的提交&#xff08;最新提交&am…

ZLMediaKit流媒体服务器

ZLMediaKit 简介 ZLMediaKit 是一个基于 C11 开发的高性能流媒体服务器框架&#xff0c;支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多种流媒体协议。 主要特性 多协议支持&#xff1a; 支持 RTSP/RTMP/HLS/HTTP-F…

数字电子技术基础(五十)——硬件描述语言简介

目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…

SQL系列:常用函数

1、【MySQL】合并字段函数&#xff08;列转行&#xff09; 它可以将两个字段中的数据合并到一个字段中。 1&#xff09;CONCAT函数 CONCAT函数可以将多个字段中的数据合并到一个字段中。它的语法格式如下&#xff1a; SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多线程和线程同步

多线程在项目开发中使用频率高,使用多线程能够提高程序的并发性 提高程序的并发性:1.多线程,对系统资源的消耗更小一些 2.多进程 系统的cpu资源有线,cpu时间片被分好后,由系统进行调度,每个线程在执行的时候都需要抢这个cpu的时间片。如果抢到了,就执行,如果没抢到,…

时序数据预测:TDengine 与机器学习框架的结合(一)

一、引言 在当今数字化时代&#xff0c;时序数据如潮水般涌来&#xff0c;广泛存在于物联网、工业监控、金融交易、气象监测等众多领域。这些按时间顺序记录的数据蕴含着丰富的信息&#xff0c;对其进行准确预测&#xff0c;能够为企业和组织的决策提供有力支持&#xff0c;带…

elementUI中MessageBox.confirm()默认不聚焦问题处理

在项目中使用elementUI的MessageBox.confirm()出现了默认不聚焦的问题&#xff0c;默认确认按钮是浅色的&#xff0c;需要点击一下才会变成正常。面对这种问题&#xff0c;创建新组件&#xff0c;实现聚焦。替换默认的MessageBox.confirm() 解决 创建components/MessageBoxCo…

yarn的定义

YARN 即 Yet Another Resource Negotiator&#xff0c;它是 Apache Hadoop 2.x 及后续版本中的集群资源管理系统&#xff0c;也是 Hadoop 生态系统的核心组件之一。 YARN 的诞生是为了解决 Hadoop 1.x 中 MapReduce 框架将资源管理和作业调度任务耦合在一起所带来的可扩展性差等…

http、https、TLS、证书原理理解,对称加密到非对称加密问题,以及对应的大致流程

http 超文本传输协议 存在问题&#xff1a; 安全性、隐私性、数据完整性 易被中间人&#xff08;黑客之类的&#xff09;对数据进行劫持、篡改、隐私泄露 引出了 https &#xff08;source&#xff09; http 在网络模型中的应用层 Application > transport > inter…

深度补全网络:如CSPN++填补稀疏点云的深度信息

深度补全网络&#xff1a;CSPN填补稀疏点云的深度信息 深度补全(Depth Completion)是计算机视觉中的一个重要任务&#xff0c;旨在从稀疏的深度测量中恢复密集的深度图。CSPN(Convolutional Spatial Propagation Network)是这一领域的前沿方法之一。 CSPN概述 CSPN是对原始CSPN…

QT网络拓扑图绘制实验

前言 在网络通讯中&#xff0c;我qt常用的是TCP或者UDP协议&#xff0c;就比方说TCP吧&#xff0c;一台服务器有时可能会和多台客户端相连接&#xff0c;我之前都是处理单链接情况&#xff0c;最近研究图结构的时候&#xff0c;突然就想到了这个问题。那么如何解决这个问题呢&…

DNS主从同步实验

dns域名解析原理 实验步骤1、主dns要完成dns解析&#xff1a;192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…