urllib基础+xpath基础(爬虫基础_1)

news2024/5/18 18:29:18

文章目录

  • 1 urllib库的使用
    • 1.1 urllib.request
      • 发送请求获得响应数据
      • 一个类型六个方法
      • 内容下载
      • 定制请求对象
    • 1.2 urllib.parse
      • get请求编码
      • post请求编码
    • 1.3 ajax的get请求示例
    • 1.4 ajax的post请求示例
    • 1.5 Handler处理器
    • 1.6 代理服务器
  • 2 解析
    • 2.1 xpath
    • 2.2 JsonPath
    • 2.3 BeautifulSoup

1 urllib库的使用

urllib.request.urlopen() 模拟浏览器向服务器发送请求
response 服务器返回的数据
	response的数据类型是HttpResponse
	字节‐‐>字符串
		解码decode
	字符串‐‐>字节
		编码encode
	read() 字节形式读取二进制 扩展:rede(5)返回前几个字节
	readline() 读取一行
	readlines() 一行一行读取 直至结束
	getcode() 获取状态码
	geturl() 获取url
	getheaders() 获取headers
urllib.request.urlretrieve()
	请求网页
	请求图片
	请求视频

1.1 urllib.request

import urllib.request as req

发送请求获得响应数据

urlopen

import urllib.request as req
#要请求的url地址
url='https://blog.csdn.net/m0_58730471/article/details/128872792?spm=1001.2014.3001.5501'
#发送请求
res=req.urlopen(url)
#read是读取字节,这里设置其解码方式
contet=res.read().decode('utf-8')
print(contet)

一个类型六个方法

请求响应的类型HTTPResponse
方法:
read 按字节读取
readline 读取一行
readlines 按行读取所有
getcode 获取状态码 200/500/404…
geturl 获取当前的请求url地址
getheards 获取响应头内容

内容下载

urlretrieve

# urlretrieve(url,'名称.格式')

#下载一张图片,url为下载地址
url='https://img1.baidu.com/it/u=1605341541,1182642759&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750'
req.urlretrieve(url,'1.jpg')

定制请求对象

Request封装一下请求头的信息,包装成request类型

url='https://www.baidu.com/'
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
#定制请求头对象
request=req.Request(url=url,headers=headers)
#里面放的就不是直接的url,而是包装后的request
res=req.urlopen(request)

contet=res.read().decode('utf-8')

print(contet)

1.2 urllib.parse

get请求编码

单个参数编码(Unicode编码)
quote

import urllib.parse

name=urllib.parse.quote("张三")

print(name) #%E5%BC%A0%E4%B8%89

多个参数编码拼接
urlencode

url='https://www.baidu.com/'
data={
    'wd':'周杰伦',
    'age':18,
    'sex':'男'
}
url+=urllib.parse.urlencode(data)
print(url)
#https://www.baidu.com/wd=%E5%91%A8%E6%9D%B0%E4%BC%A6&age=18&sex=%E7%94%B7

post请求编码

urllib.parse.urlencode(data).encode(‘utf‐8’)

eg:百度翻译
import urllib.request
import urllib.parse
url = 'https://fanyi.baidu.com/sug'
headers = {
'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
keyword = input('请输入您要查询的单词')
data = {
'kw':keyword
}
data = urllib.parse.urlencode(data).encode('utf‐8')
request = urllib.request.Request(url=url,headers=headers,data=data)
response = urllib.request.urlopen(request)
print(response.read().decode('utf‐8'))

总结:post和get区别?
1:get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法
2:post请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用encode方法

1.3 ajax的get请求示例

# 爬取豆瓣电影前10页数据
# https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&start=0&limit=20
# 页码规律 (start变化(page-1)*20)
# 1 2 3 4
# 0 20 40 60
import urllib.request
import urllib.parse
# 下载前10页数据
# 下载的步骤:1.请求对象的定制 2.获取响应的数据 3.下载
# 每执行一次返回一个request对象
def create_request(page):
	base_url = 'https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&'
	headers = {
		'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
		like Gecko) Chrome/76.0.3809.100 Safari/537.36'
	}
data={
# 1 2 3 4
# 0 20 40 60
'start':(page‐1)*20,
'limit':20
}
	# data编码
	data = urllib.parse.urlencode(data)
	url = base_url + data
	request = urllib.request.Request(url=url,headers=headers)
	return request
# 获取网页源码
def get_content(request):
	response = urllib.request.urlopen(request)
	content = response.read().decode('utf‐8')
	return content
def down_load(page,content):
	# with open(文件的名字,模式,编码)as fp:
	# fp.write(内容)
	with open('douban_'+str(page)+'.json','w',encoding='utf‐8')as fp:
	fp.write(content)
if __name__ == '__main__':
	start_page = int(input('请输入起始页码'))
	end_page = int(input('请输入结束页码'))
	for page in range(start_page,end_page+1):
	request = create_request(page)
	content = get_content(request)
	down_load(page,content)

1.4 ajax的post请求示例

KFC官网

简介:1.HTTPError类是URLError类的子类
2.导入的包urllib.error.HTTPError urllib.error.URLError
3.http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出
了问题。
4.通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try‐
except进行捕获异常,异常有两类,URLError\HTTPError

import urllib.request
import urllib.error
url = 'https://blog.csdn.net/ityard/article/details/102646738'
# url = 'http://www.goudan11111.com'
headers = {
	'Cookie': '...',
	'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/77.0.3865.120 Safari/537.36',
}
try:
	request = urllib.request.Request(url=url,headers=headers)
	response = urllib.request.urlopen(request)
	content = response.read().decode('utf‐8')
	print(content)
except urllib.error.HTTPError:
	print(1111)
except urllib.error.URLError:
	print(2222)

1.5 Handler处理器

为什么要学习handler?
urllib.request.urlopen(url)
不能定制请求头
urllib.request.Request(url,headers,data)
可以定制请求头
Handler
定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理
不能使用请求对象的定制)

import urllib.request
url = 'http://www.baidu.com'
headers = {
	'User ‐ Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML,likeGecko) Chrome / 74.0.3729.169Safari / 537.36'
}
request = urllib.request.Request(url=url,headers=headers)
handler = urllib.request.HTTPHandler()
opener = urllib.request.build_opener(handler)
response = opener.open(request)
print(response.read().decode('utf‐8'))

1.6 代理服务器

1.代理的常用功能?

1.突破自身IP访问限制,访问国外站点。
2.访问一些单位或团体内部资源
扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务
器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
3.提高访问速度
扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲
区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
4.隐藏真实IP
扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击。

2.代码配置代理

创建Reuqest对象
创建ProxyHandler对象
用handler对象创建opener对象
使用opener.open函数发送请求

import urllib.request
url = 'http://www.baidu.com/s?wd=ip'
headers = {
	'User ‐ Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML,likeGecko) Chrome / 74.0.3729.169Safari / 537.36'
}
request = urllib.request.Request(url=url,headers=headers)
proxies = {'http':'117.141.155.244:53281'}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf‐8')
with open('daili.html','w',encoding='utf‐8')as fp:
	fp.write(content)

2 解析

2.1 xpath

xpath使用:

注意:提前安装xpath插件

(1)打开chrome浏览器
(2)点击右上角小圆点
(3)更多工具
(4)扩展程序
(5)拖拽xpath插件到扩展程序中
(6)如果crx文件失效,需要将后缀修改zip
(7)再次拖拽
(8)关闭浏览器重新打开
(9)ctrl + shift + x
(10)出现小黑框

1.安装lxml库

pip install lxml ‐i https://pypi.douban.com/simple

2.导入lxml.etree

from lxml import etree

3.etree.parse() 解析本地文件

html_tree = etree.parse(‘XX.html’)

4.etree.HTML() 服务器响应文件

html_tree = etree.HTML(response.read().decode(‘utf‐8’)
html_tree.xpath(xpath路径)

xpath基本语法:

1.路径查询

//:查找所有子孙节点,不考虑层级关系
/ :找直接子节点

2.谓词查询

//div[@id]
//div[@id=“maincontent”]

3.属性查询

//@class

4.模糊查询

//div[contains(@id, “he”)]
//div[starts‐with(@id, “he”)]

5.内容查询

//div/h1/text()

6.逻辑运算

//div[@id=“head” and @class=“s_down”]
//title | //price

小练:
站长素材图片抓取并且下载http://sc.chinaz.com/tupian/shuaigetupian.html

2.2 JsonPath

转载:https://goessner.net/articles/JsonPath/

JSONPath - 是xpath在json的应用。

如果使用xpath来解析json:
1,可以在客户端上以交互方式找到数据并从JSON结构中提取数据,而无需编写特殊脚本
2,客户端请求的JSON数据可以减少到服务器上的相关部分,从而最大限度地减少服务器响应的带宽使用。

由于JSON是C系列编程语言数据的自然表示,因此,特定语言具有访问JSON结构的原生语法元素的可能性很高。
在Javascript、Python和PHP中,具有保持JSON结构的变量x。在这里我们观察到,特定语言通常已经内置了一个基本的XPath特性。(就是可以解析)

JOSNPath 表达式

在这里插入图片描述

举例:

在这里插入图片描述

jsonpath的安装及使用方式:

pip安装:

pip install jsonpath

jsonpath的使用:

obj = json.load(open(‘json文件’, ‘r’, encoding=‘utf‐8’))
ret = jsonpath.jsonpath(obj, ‘jsonpath语法’)

2.3 BeautifulSoup

1.基本简介

1.BeautifulSoup简称:
bs4
2.什么是BeatifulSoup?
BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据
3.优缺点?
缺点:效率没有lxml的效率高
优点:接口设计人性化,使用方便

2.安装以及创建

1.安装
pip install bs4
2.导入
from bs4 import BeautifulSoup
3.创建对象
服务器响应的文件生成对象
soup = BeautifulSoup(response.read().decode(), ‘lxml’)
本地文件生成对象
soup = BeautifulSoup(open(‘1.html’), ‘lxml’)
注意:默认打开文件的编码格式gbk所以需要指定打开编码格式

3.节点定位

1.根据标签名查找节点
	soup.a 【注】只能找到第一个a
		soup.a.name
		soup.a.attrs
2.函数
	(1).find(返回一个对象)
		find('a'):只找到第一个a标签
			find('a', title='名字')
			find('a', class_='名字')
	(2).find_all(返回一个列表)
			find_all('a') 查找到所有的a
			find_all(['a', 'span']) 返回所有的a和span
			find_all('a', limit=2) 只找前两个a
	(3).select(根据选择器得到节点对象)【推荐】
		1.element
			eg:p
		2..class
			eg:.firstname
		3.#id
			eg:#firstname
		4.属性选择器
			[attribute]
				eg:li = soup.select('li[class]')
			[attribute=value]
				eg:li = soup.select('li[class="hengheng1"]')
		5.层级选择器
			element element
				div p
			element>element
				div>p
			element,element
				div,p
					eg:soup = soup.select('a,span')

4.节点信息

(1).获取节点内容:适用于标签中嵌套标签的结构
	obj.string
	obj.get_text()【推荐】
(2).节点的属性
	tag.name 获取标签名
		eg:tag = find('li)
			print(tag.name)
		tag.attrs将属性值作为一个字典返回
(3).获取节点属性
	obj.attrs.get('title')【常用】
	obj.get('title')
	obj['title']

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

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

相关文章

自动驾驶感知——多传感器融合技术

文章目录1. 运动感知类与环境感知类传感器2. 为什么需要这么多传感器?2.1 从需求侧分析2.2 从供给侧分析3. 多传感器硬件系统的设计思路4. 多传感器系统的时序闭环4.1 传感器时钟闭环构建4.2 成像同步机制5. 多传感器融合算法5.1 多传感器融合问题建模5.2 后融合5.2…

OpenAI ChatGPT 人工智能机器人注册使用,能以中文对答如流的机器人

文章目录一、什么是 ChatGPT二、宇宙最强技术狂魔 马斯克 与 ChatGPT三、在中国大陆如何注册 ChatGPT1. 注册前准备(只适用于中国大陆)2. 注册方法与步骤四、GhatGPT 的使用方法1. 网页直接使用2. 使用 Google Chrome 浏览器插件3. CSDN 已经接入 ChatGP…

创业平台推荐 ⌈ 适和全部开发者 ⌋ | 成为一名开发者原来那么简单 | 获取收益不再困难 | 快来加入这个大家庭吧

💛 前情提要💛 本文是番外篇:在当今生活中,我们都想在业余时间通过不断学习去充实自己、提高自己 而本文就是为大家拓宽一种思路🤩,从身为开发者的角度出发,为大家提供一个全面的平台去开启“…

const在C和C++中的区别

昨天有个学生去做C/C软件工程师的笔试题,遇到了这么一个题目,来问我结果是多少? 看似非常普通的一道C语言题目,如果不指定编译器,还真不知道结果是多少。 不信我来演示给你看下。 首先是用gcc来编译,就是…

Linux系统安全:安全技术和防火墙

目录 一、安全技术 1、安全技术 2、防火墙分类 二、防火墙 1、iptables五表五链 2、黑白名单 3、iptables基本语法 4、iptables选项 5、控制类型 6、隐藏扩展模块 7、显示扩展模块 8、iptables规则保存 9、自定义链使用 一、安全技术 1、安全技术 ①入侵检测系统…

Node.js http 模块详解(1)

http 模块 使用 Node.js 中创建 Web 服务,主要依赖内置的 http 模块。经典的 express.js、koa.js 框架都是以 http 模块为核心,进行的不同程度的封装。 创建一个最简单的 Web 服务只需要几行代码。新建一个 index.js 文件,输入以下内容&…

【GCC】3: webrtc带宽(预估调整)和GCC模块

webrtc源码分析(8)-拥塞控制(上)-码率预估 bandwidth bitrate estimator 整体码控流程 webrtc源码分析(8)-拥塞控制(上)-码率预估 大神绘制的: TWCC TCC算法的流程 TccEstimator 大神用go写的:Transport-CC Algorithm Description This is a Goog

python小游戏——打砖块代码开源

♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好&#…

Redis单线程还快的原因

Redis单线程还快的原因 Redis Server是多线程的,Redis单线程指的是请求处理整个流程是单线程的! 单线程还快的原因 纯内存操作: Redis数据存储在内存中,速度很快。 非阻塞IO多路复用机制: Redis 采用了多路复用机制&a…

从事互联网行业,考一个PMP会有帮助吗?

PMP是项目管理类证书,不要求工作岗位,只要涉及项目、项目管理岗位,就可以考PMP证书,就会有帮助。但这里先说一下PMP的报名条件,先看能不能考,再说考了是否有帮助。 条件如下图,有两个&#xff…

睿智的目标检测64——目标检测中的MixUp数据增强方法

睿智的目标检测64——目标检测中的MixUp数据增强方法学习前言代码下载什么是MixUp数据增强方法实现思路全部代码1、数据增强与MixUp2、调用代码学习前言 哈哈哈!我再来一次数据增强! 代码下载 https://github.com/bubbliiiing/object-detection-augm…

HTML5+CSS3(八)-全面详解(学习总结---从入门到深化)

领取详细资料 请关注一下公众号 !!! 目录 领取详细资料 请关注一下公众号 !!! 关系选择器 关系选择器分类 后代选择器 定义 语法 子代选择器 定义 语法 相邻兄弟选择器 定义 语法 通用兄弟选择…

Python爬虫教你爬取视频信息

大家好,我是拉斯,今天分享一个爬取某音视频的一个小案例,大家一起学习 目录前言基本环境配置爬取目标视频获取视频链接1.查看网页源代码2.抓包工具捕捉下载视频(以mp4格式进行保存)获取其他信息并打印(作者名,作品名,…

沁恒CH32V307使用记录:GPIO与EXTI

文章目录目的GPIO(通用输入输出接口)基础说明初始化输出输入与电平读取锁定机制EXTI(外部中断)基础说明使用演示总结目的 GPIO是单片机最基础的功能,EXTI最常用的场景就是GPIO用于输入时使用。这篇文章将对CH32V307中…

【i18n】使用 vue-i18n 实现国际化多语言切换

学习关键语句: i18n 进行多语言国际化 使用 vue-i18n 语言切换 写在前面 由于以前没有过国际化的经验 , 所以第一次遇到的时候还是有点懵逼的 , 赶紧在网上转了一大圈 , 分享给大家一点点我的使用经验 我写这篇文章的目的是大家看了之后跟着步骤走就能完成多语言切换的任务 …

闭眼时长标准差脚本

闭眼时长标准差脚本 闭眼时长标准差 平均闭眼时长:识别一分钟内闭眼次数以及每次闭眼的时长,将每次闭眼的时长进行累计相加,最终再取平均值 闭眼标准差公式 闭眼标准差((n1−navg)2(n2−navg)2...)∗1/n闭眼标准差\sqrt{((n_1-n_{avg})^2(…

【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

jenkins打包构建springboot项目为docker镜像并上传nexus私服

前提:jenkins,docker,nexus都已经搭建完毕 一. 开启docker远程访问 1.修改docker.service文件 Docker 安装成功之后,首先需要修改 Docker 配置来开启允许远程访问 Docker 的功能。     文件位置:/lib/systemd/system/docker.service    …

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己…

使用比console.log更优质的前端调试方案

程序调试是程序开发必不可少的一环,刚开始接触前端调试时,最常用的就是 console.log 打印变量进行调试,本文会分享一些笔者学习到的前端调试方法,减少对 console.log 调试方式的依赖,选择更优质的前端调试方案。 本文中…