【100天精通python】Day43:python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

目录

1 urlib 库

2 Beautiful Soup库

3 使用代理

3.1 代理种类 HTTP、HTTPS 和 SOCKS5

3.2 使用 urllib 和 requests 库使用代理

3.3 案例:自建代理池

4 实战 提取视频信息并进行分析


1 urlib 库

   urllib 是 Python 内置的标准库,用于处理URL、发送HTTP请求和处理网络数据。它包含多个模块,如 urllib.request 用于发送请求,urllib.parse 用于解析URL,urllib.error 用于处理异常等。

  • urllib.request:用于发送 HTTP 请求和获取响应。
  • urllib.parse:用于解析 URL,拆分和合并 URL 的各个部分。
  • urllib.error:处理异常,如连接错误、HTTP 错误等。

常用语法:

  1. 发送GET请求:
import urllib.requesturl = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

2 发送POST请求:

import urllib.requesturl = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

3 实战示例:

爬取网页内容:

import urllib.requesturl = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

下载文件:

import urllib.requesturl = "https://www.example.com/sample.pdf"
urllib.request.urlretrieve(url, "sample.pdf")
print("File downloaded.")

处理异常:

import urllib.errortry:response = urllib.request.urlopen("https://www.nonexistent-website.com")
except urllib.error.URLError as e:print("Error:", e)

解析URL:

import urllib.parseurl = "https://www.example.com/page?param1=value1&param2=value2"
parsed_url = urllib.parse.urlparse(url)
print(parsed_url.scheme)  # 输出协议部分
print(parsed_url.netloc)  # 输出域名部分
print(parsed_url.query)   # 输出查询参数部分

以上示例只是 urllib 库的一些用法。这个库非常强大,你可以在许多网络操作中使用它,包括爬虫、API调用等。在实际项目中,你可能需要处理更多的细节,如设置请求头、处理响应等。查阅官方文档可以帮助你更全面地了解 urllib 库的功能和用法。 

4 Handler 处理器和自定义 Opener:

处理器(Handler)允许你自定义请求的处理方式,以满足特定的需求。urllib.request 模块提供了一些默认的处理器,例如 HTTPHandler 和 HTTPSHandler,用于处理 HTTP 和 HTTPS 请求。你还可以通过创建自定义的 Opener 来组合不同的处理器,实现更灵活的请求配置。

自定义 Opener 示例:

import urllib.request# 创建自定义 Opener,组合不同的处理器
opener = urllib.request.build_opener(urllib.request.HTTPSHandler())# 使用自定义 Opener 发送请求
response = opener.open("https://www.example.com")
content = response.read().decode("utf-8")
print(content)

5 URLError 和 HTTPError

  URLErrorHTTPError 都是 urllib.error 模块中的异常类,用于处理与网络请求相关的错误情况。

  • URLError:用于捕获与URL相关的异常,如无法解析主机名、网络不可达等。
  • HTTPError:用于捕获 HTTP 错误响应,比如请求的网页不存在(404 Not Found)、服务器错误(500 Internal Server Error)等。

URLError 示例:

import urllib.errortry:response = urllib.request.urlopen("https://www.nonexistent-website.com")
except urllib.error.URLError as e:print("URLError:", e)

HTTPError 示例:

import urllib.errortry:response = urllib.request.urlopen("https://www.example.com/nonexistent-page")
except urllib.error.HTTPError as e:print("HTTPError:", e.code, e.reason)

 在示例中,e.code 是 HTTP 错误代码,e.reason 是错误原因。

总之,处理器和 Opener 允许你自定义网络请求的行为,URLErrorHTTPError 则帮助你处理请求中可能出现的错误情况。这些功能在实际网络请求和爬虫任务中都非常有用。

2 Beautiful Soup库

        Beautiful Soup 是一个用于解析HTML和XML文档的Python库,它可以从网页中提取数据,操作文档树,并帮助你浏览和搜索文档的不同部分。它能够帮助你处理标签、属性、文本内容等,使得数据提取和处理变得更加方便。

        Beautiful Soup 是一个强大的Python库,用于解析HTML和XML文档,提取其中的数据。以下是一些 Beautiful Soup 常用的语法和方法:

from bs4 import BeautifulSoup# HTML 示例
html = """
<html>
<head>
<title>Sample HTML</title>
</head>
<body>
<p class="intro">Hello, Beautiful Soup</p>
<p>Another paragraph</p>
<a href="https://www.example.com">Example</a>
</body>
</html>
"""# 创建 Beautiful Soup 对象
soup = BeautifulSoup(html, "html.parser")# 节点选择器
intro_paragraph = soup.p
print("Intro Paragraph:", intro_paragraph)# 方法选择器
another_paragraph = soup.find("p")
print("Another Paragraph:", another_paragraph)# CSS 选择器
link = soup.select_one("a")
print("Link:", link)# 获取节点信息
text = intro_paragraph.get_text()
print("Text:", text)# 获取节点的属性值
link_href = link["href"]
print("Link Href:", link_href)# 遍历文档树
for paragraph in soup.find_all("p"):print(paragraph.get_text())# 获取父节点
parent = intro_paragraph.parent
print("Parent:", parent)# 获取兄弟节点
sibling = intro_paragraph.find_next_sibling()
print("Next Sibling:", sibling)# 使用 CSS 选择器选择多个节点
selected_tags = soup.select("p.intro, a")
for tag in selected_tags:print("Selected Tag:", tag)# 修改节点文本内容
intro_paragraph.string = "Modified Text"
print("Modified Paragraph:", intro_paragraph)# 添加新节点
new_paragraph = soup.new_tag("p")
new_paragraph.string = "New Paragraph"
soup.body.append(new_paragraph)# 移除节点
link.extract()
print("Link Extracted:", link)

3 使用代理

3.1 代理种类 HTTP、HTTPS 和 SOCKS5

  • HTTP代理: 用于HTTP协议的代理,适用于浏览网页等HTTP请求。
  • HTTPS代理: 用于HTTPS协议的代理,能够处理加密的HTTPS请求。
  • SOCKS5代理: 更通用的代理协议,支持TCP和UDP流量,适用于各种网络请求。

  • 抓取免费代理:

    可以使用爬虫技术从免费代理网站获取代理IP和端口。

    使用付费代理:

    付费代理通常提供更稳定和更快速的连接,适用于需要高质量代理的情况。

3.2 使用 urllibrequests 库使用代理

urllib:

import urllib.requestproxy_handler = urllib.request.ProxyHandler({'http': 'http://proxy.example.com:8080'})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.example.com')

requests:

import requestsproxies = {'http': 'http://proxy.example.com:8080'}
response = requests.get('https://www.example.com', proxies=proxies)

3.3 案例:自建代理池

import requests
from bs4 import BeautifulSoup
import random# 获取代理IP列表
def get_proxies():proxy_url = "https://www.example.com/proxy-list"response = requests.get(proxy_url)soup = BeautifulSoup(response.text, "html.parser")proxies = [proxy.text for proxy in soup.select(".proxy")]return proxies# 从代理池中随机选择一个代理
def get_random_proxy(proxies):return random.choice(proxies)# 使用代理发送请求
def send_request_with_proxy(url, proxy):proxies = {'http': proxy, 'https': proxy}response = requests.get(url, proxies=proxies)return response.textif __name__ == "__main__":proxy_list = get_proxies()random_proxy = get_random_proxy(proxy_list)target_url = "https://www.example.com"response_content = send_request_with_proxy(target_url, random_proxy)print(response_content)

这个案例演示了如何从代理池中随机选择一个代理,并使用选定的代理发送请求。请注意,示例中的URL和方法可能需要根据实际情况进行修改。

这些概念和示例可以帮助你了解如何使用代理,从而在网络爬虫或请求中保护你的身份和数据。

4 实战 提取视频信息并进行分析

import urllib.request
from bs4 import BeautifulSoup# 定义目标网页的 URL
url = 'https://www.example.com/videos'# 定义代理(如果需要使用代理)
proxies = {'http': 'http://proxy.example.com:8080'}# 发起请求,使用代理
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req, proxies=proxies)# 解析网页内容
soup = BeautifulSoup(response, 'html.parser')# 创建一个空的视频列表
videos = []# 获取视频信息
video_elements = soup.find_all('div', class_='video')
for video_element in video_elements:title = video_element.find('h2').textvideo_link = video_element.find('a', class_='video-link')['href']videos.append({'title': title, 'video_link': video_link})# 输出提取到的视频信息
for video in videos:print(f"Title: {video['title']}")print(f"Video Link: {video['video_link']}")print()# 对视频信息进行分析
num_videos = len(videos)
print(f"Total Videos: {num_videos}")

        在这个实例中,我们假设目标网页包含多个视频的信息,每个视频都有标题和视频链接。我们使用 urllib 库获取网页内容,然后使用 Beautiful Soup 解析页面,从中提取视频的标题和链接。最后,我们输出提取到的视频信息并对其进行简单的分析,计算视频的数量。

        请注意,这个实例仅用于演示基本的数据提取和分析概念。在实际应用中,你可能需要根据目标网页的结构和内容,调整代码以适应实际情况。

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

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

相关文章

每天一道leetcode:1306. 跳跃游戏 III(图论中等广度优先遍历)

今日份题目&#xff1a; 这里有一个非负整数数组 arr&#xff0c;你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 **任一** 下标处。 注意&#xff0c;不管是什…

spring依赖注入详解(上)

一、Bean销毁的过程 如果bean销毁时会执行的场景 1、设置DestroyMethodName为(inferred) // 先把DestroyMethodName设置为(inferred) Component public class TestBeanPostProcessor implements MergedBeanDefinitionPostProcessor {Overridepublic void postProcessMergedBe…

spring boot集成jasypt 并 实现自定义加解密

一. 技术需求 由于项目中的配置文件 配置的地方过多&#xff0c;现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中 项目中组件使用的版本环境如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 二. 技术实现 配置文…

68个Python内置函数,你不会不知道吧?

内置函数就是Python给你提供的&#xff0c;拿来直接用的函数&#xff0c;比如print.&#xff0c;input等。 截止到python版本3.6.2 &#xff0c;python一共提供了68个内置函数&#xff0c;具体如下&#x1f447; abs() dict() help() min() …

ARM开发(cortex-A7核,UART总线实验)

目标&#xff1a;键盘输入一个字符a,串口工具显示b&#xff1b; 键盘输入一个字符串"nihao",串口工具显示"nihao"&#xff1b; ---.h头文件--- #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1x…

根据Dockerfile创建容器案例讲解

-f为dokerfile的路径&#xff0c; -t为新镜像的名称及版本。 后面这个点是寻址路径。

阿里面试官常问的TCP和UDP,你真的弄懂了吗?

♥ 前 言 作为软件测试&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握的&#xff0c;面试的时候面试官也非常喜欢问一些协议相关的问题&#xff0c;其中有两个协议因为非常基础&#xff0c;出现的频率非常之高&#xff0c;分别是 ”TCP 协议“ 和 ”UDP 协…

漏洞指北-VulFocus靶场专栏-中级03

漏洞指北-VulFocus靶场专栏-初级03 中级009 &#x1f338;gxlcms-cve_2018_14685&#x1f338;step1&#xff1a;安装系统 密码rootstep2 进入后台页面 账号密码&#xff1a;admin amdin888step3 查看详细 有phpinfo() 中级010 &#x1f338;dedecms-cnvd_2018_01221&#x1f3…

2023国赛数学建模C题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

TypeError: Object of type int64 is not JSON serializable

TypeError: Object of type int64 is not JSON serializable 这个错误通常意味着你试图将一个Python对象转换为JSON&#xff0c;但是这个对象不能被序列化为JSON。在你的情况下&#xff0c;错误发生在尝试将一个int64类型的对象转换为JSON时。 在Pandas中&#xff0c;当你使用…

《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern

原型的定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏&#xff0c;这个游戏里有许多不同种类的怪物&#xff0c;鬼魂&#xff0c;恶魔和巫师。这些怪物通过“生产者”进入这片区域&#xff0c;每种敌人…

element文本域禁止手动拉伸、两种方式、textarea

文章目录 style方式element自带的禁止拉伸方法建议 style方式 html <el-inputv-model"content":rows"3"class"r_n"type"textarea"maxlength"40"placeholder""style"height: 100%;" />css style…

等保测评--安全计算环境--测评方法

安全子类--身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 一、测评对象 终端和服务器等设备中的操作系统(包括宿主机和虚拟机操作系统) 、网络设备(包括虚拟网络设备)、安全设备(包括虚拟安全设备)、移动终端…

Qt多线程开启定时任务

项目场景&#xff1a; 多线程执行一些耗时操作&#xff0c;并且需要固定时间去轮询。 代码&#xff1a; #include <QThread> #include <QTimer> #include <QtCore/QMutex>class pollingManager : public QObject {Q_OBJECTpublic:static pollingManager*get…

Linux 桌面版关闭GUI桌面环境

持久打开和关闭 通过CtrlAltF1-F6快捷键进入命令行界面 执行以下命令&#xff0c;持久关闭Ubuntu桌面版的GUI环境&#xff1a; sudo systemctl set-default multi-user.target执行以下命令&#xff0c;持久开启Ubuntu桌面版的GUI环境 通过CtrlAltF7快捷键进入GUI界面 sudo s…

Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理&#xff08;包括词的属性处理&#xff09;的简单整理 目录 Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理&#xff08;包括词的属性处理&#xff09;的简单整理 一、简单介绍 二、实现原理…

派森 #P122. 峰值查找

描述 给定一个长度为n的列表nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 &#xff08;1&#xff09;峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于&#xff1b; &…

Unity 之 RaycastHit(存储射线投射操作)

文章目录 总述具体使用场景 总述 RaycastHit 类是 Unity 中的一个结构&#xff0c;用于存储射线投射操作的结果。射线投射是一种常用的技术&#xff0c;用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。RaycastHit 提供了关于射线与场景中对象的交互信息&#xff0c…

Vue3中ref和reactive的使用

今天在项目中使用reactive过程中出现变量无法更新视图&#xff0c;reactive通常用于对象 <template><div class"wrapper"><el-checkbox :indeterminate"isInderterminate" v-model"checkAll" change"handleCheckAllChange&…

限制 el-input 输入 emoji

1. 电脑如何输入 emoji 表情 ? 快捷键 win; 或 win. 2. 代码实现 <template><el-input v-model"input" placeholder"请输入内容" input"inputChange"></el-input> </template><script> export default {name: D…