当前位置: 首页 > news >正文

Python爬虫系列(一)

目录

一、urllib

1.1 初体验

1.2 使用urllib下载网页、图片、视频等 

 1.3 反爬介绍

1.4 请求对象定制

1.5 get请求的quote方法

1.6 多个参数转成ascii编码

1.7 post请求

1.8 综合案例演示


一、urllib

1.1 初体验

# urllib是python默认带的,无需额外下载
import urllib.requesturl = 'http://www.baidu.com'response = urllib.request.urlopen(url)# print(type(response))
# <class 'http.client.HTTPResponse'># 读取n个字节
# content = response.read(5)
# 读取一行
# content = response.readline()
# 读取全部行
# content = response.readlines()# 读取全部并解析为utf-8字符集
content = response.read().decode('utf-8')
print(content)
# 返回url地址
print(response.geturl())
# 获取请求头
print(response.getheaders())

1.2 使用urllib下载网页、图片、视频等 

import urllib.request# 下载网页
url_page = 'https://blog.csdn.net/YuanFudao/article/details/139655676'
# def urlretrieve(url, filename=None, reporthook=None, data=None):
urllib.request.urlretrieve(url_page, '自己的文章.html')

import urllib.request# 下载网页
url_page = 'https://blog.csdn.net/YuanFudao/article/details/139655676'
# def urlretrieve(url, filename=None, reporthook=None, data=None):
#
urllib.request.urlretrieve(url_page, '自己的文章.html')# 下载图片
url_img = 'https://img2.baidu.com/it/u=3317400103,1801697482&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=498'
urllib.request.urlretrieve(url=url_img, filename='人物.jpg')

import urllib.request# 下载网页
url_page = 'https://blog.csdn.net/YuanFudao/article/details/139655676'
# def urlretrieve(url, filename=None, reporthook=None, data=None):
#
urllib.request.urlretrieve(url_page, '自己的文章.html')# 下载图片
url_img = 'https://img2.baidu.com/it/u=3317400103,1801697482&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=498'
urllib.request.urlretrieve(url=url_img, filename='人物.jpg')# 下载视频
url_video = 'https://vdept3.bdstatic.com/mda-ph856bw9kuvxfq8n/360p/h264/1691552893804719248/mda-ph856bw9kuvxfq8n.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1718881046-0-0-42919dd1325bf8705f23299eec6f8cba&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=3446619467&vid=3701907759041297688&klogid=3446619467&abtest='
urllib.request.urlretrieve(url_video, '好看视频.mp4')

 1.3 反爬介绍

一些网站,我们没法直接这样获取到资源,大概率是这些网站做了反爬手段,例如上述下载视频,如果是b站视频,直接这样是下载不到的。

再举个例子:

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

我们发现访问https的百度和访问http协议的百度,我们返回的结果是不一样的。https://www.baidu.com的结果明显少了很多内容。这其实就是因为反爬的原因。 为什么返回的结果很少?是因为我们提供的数据不完整。那么如何做到无差别浏览器呢?我们慢慢来~

1.4 请求对象定制

UA介绍

User Agent 中文名为用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言等。

import urllib.requesturl = 'https://www.baidu.com'
# f12打开百度的network控制台,查看请求头里面携带的user-agent内容,复制过来进行伪造
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
# 请求对象定制
# 因为urlopen中不能传入字典,不能直接传入headers
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

ok,现在可以正常访问了。

这是我们遇到的第一个反爬,ua反爬! 

1.5 get请求的quote方法

案例演示

我们模拟百度搜索周杰伦

import urllib.requesturl = 'https://www.baidu.com/s?wd=周杰伦'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}requests = urllib.request.Request(url=url, headers=headers)response = urllib.request.urlopen(requests)content = response.read().decode('utf-8')print(content)

运行报错:

 默认情况下只检索ascii码,因此需要把‘周杰伦’转换成Unicode编码,怎么转呢?

使用quote方法!

import urllib.request
# 需要提前引入
import urllib.parseparam ='周杰伦'
param = urllib.parse.quote(param)
url = 'https://www.baidu.com/s?wd=' + paramheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}requests = urllib.request.Request(url=url, headers=headers)response = urllib.request.urlopen(requests)content = response.read().decode('utf-8')print(content)

此时就不在报错了,但是弹出的页面是安全验证,这又是百度的一个反爬手段!我们后续再说

1.6 多个参数转成ascii编码

当然了,我们可以把参数&参数整体作为一个参数通过quote方法转。

不过不建议,这里推荐使用urlencode方法!

import urllib.parsedata = {'wd': '周杰伦','sex': '男'
}a = urllib.parse.urlencode(data)print(a)

 ok,我们再测试一下

import urllib.parse
import urllib.request
data = {'wd': '周杰伦','sex': '男'
}a = urllib.parse.urlencode(data)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}url = 'https://www.baidu.com/s?' + arequests = urllib.request.Request(url=url, headers=headers)response = urllib.request.urlopen(requests)content = response.read().decode('utf-8')print(content)

还是遇到了这个安全验证的反爬,说明可能服务器不知道我是谁,那么试试把cookie带上呢。这个留到下面再去实现吧~

1.7 post请求

post请求传参通常不应该也不推荐拼接再url请求路径后,而是放在请求体中。

下面以百度翻译为例,介绍post请求爬虫翻译。

import json
import urllib.request
import urllib.parseurl = 'https://fanyi.baidu.com/sug'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}# 参数
data = {'kw': '玫瑰'
}
data = urllib.parse.urlencode(data).encode('utf-8')# 检查参数拼接是否正确
# print(data)request = urllib.request.Request(url=url, data=data, headers=headers)response = urllib.request.urlopen(request)content = response.read().decode('utf-8')# {"errno":0,"data":[{"k":"\u73ab\u7470","v":"rose; [\u690d] rugosa rose; rosa rugosa; hep"},{"k":"\u73ab\u7470\u56ed","v":"rosary; rosarium; [\u7535\u5f71]Roseland"},{"k":"\u73ab\u7470\u6728","v":"rose wood"},{"k":"\u73ab\u7470\u679c","v":"fructus rosae"},{"k":"\u73ab\u7470\u6c34","v":"[\u533b] aquae rosae; rose water"}],"logid":65895191}
# print(content)# 字符串 -> json对象
obj = json.loads(content)
# {'errno': 0, 'data': [{'k': '玫瑰', 'v': 'rose; [植] rugosa rose; rosa rugosa; hep'}, {'k': '玫瑰园', 'v': 'rosary; rosarium; [电影]Roseland'}, {'k': '玫瑰木', 'v': 'rose wood'}, {'k': '玫瑰果', 'v': 'fructus rosae'}, {'k': '玫瑰水', 'v': '[医] aquae rosae; rose water'}], 'logid': 148055707}
print(obj)

1.8 综合案例演示

// todo 🫢

相关文章:

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…...

# vim那些事...... vim删除文件全部内容

vim那些事… vim删除文件全部内容 1、在 Vim 中删除整个文件的内容&#xff0c;可以使用以下命令&#xff1a; 1&#xff09;打开 Vim&#xff0c;并编辑你想要清空的文件。 2&#xff09;按 Esc 确保你不在插入模式&#xff0c;而在命令模式。 3&#xff09;输入 gg 跳转到…...

Selinux及防火墙

一&#xff0c;selinux简介&#xff1a; SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个Linux内核安全模块&#xff0c;旨在提供强制访问控制&#xff08;MAC&#xff09;机制&#xff0c;以增强系统的安全性。由美国国家安全局&#xff08;NSA&#xff09;开…...

业绩代码查询实战——php

一、一级代码显示职员 foreach($data_职员信息 as $key > $value){//$where_查询分类$where_查询通用;//$dat分类one $业绩提成->where($where_查询分类)->order("CreateDate desc")->select();if($value[haschildname]0 && $value[key] !"…...

内网穿透技术选型PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)

PPTP&#xff08;点对点隧道协议&#xff09;和 FRP&#xff08;Fast Reverse Proxy&#xff09;是两种实现内网穿透的技术&#xff0c;但它们的工作原理、使用场景和特点有很大区别。以下是它们的详细比较&#xff1a; PPTP&#xff08;Point-to-Point Tunneling Protocol&am…...

信号与噪声分析——第三节:随机过程的统计特征

随机过程的定义&#xff1a; 随机过程是一种数学模型&#xff0c;用来描述系统或现象在时间或者空间上随之变化的不确定性。 一个随机过程的数字特征 1.数学期望&#xff08;统计平均值&#xff09;&#xff1a; 表示为 数学期望是随机过程在时间 t 上的平均值&#xff0c;通常…...

nginx(四):如何在 Nginx 中配置以保留真实 IP 地址

如何在 Nginx 中配置以保留真实 IP 地址 1、概述2、nginx配置示例2.1、配置说明2.2、客户端获取真实IP2.2.1、代码说明 3、插曲4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、概述 当使用nginx作为…...

docker对nginx.conf进行修改后页面无变化或页面报错

可能是因为没有重启nginx容器 可以执行 docker restart nginx 重启nginx试试 引入了其他的配置文件 本人安装的是docker默认的nginx&#xff0c;自带了一个default.conf的配置文件&#xff0c;并且在nginx.conf中还引入了这个文件&#xff0c;后面我还对nginx.conf添加了一个…...

SpringCloudGateway — 网关路由

Spring Cloud Gateway 是 Spring 提供的一个高效、灵活的 API 网关解决方案&#xff0c;基于 Spring 5、Spring Boot 2 和 Project Reactor&#xff0c;具有高并发和低延迟的特点。它用于在微服务架构中对外提供统一的入口&#xff0c;处理请求的路由、过滤、负载均衡等功能。 …...

docker pull 拉取镜像失败,使用Docker离线包

1、登录并注册Github&#xff0c;然后在Github中搜索并打开“wukongdaily/DockerTarBuilder” 项目&#xff0c;在该项目主页点击“Fork”。 然后点 “Create Fork”&#xff0c;将项目创建到自己的Github主页。 2、接着在自己创建过来的这个项目中点击“Actions” 3、然后…...

轻松理解操作系统 - 轻松了解 inode 是如何管理文件的

Linux 由于其开源、比较稳定等特点统治了服务端领域。也因此&#xff0c;学习Linux 系统相关知识在后端开发等岗位中变得越来越重要&#xff0c;甚至可以说是必不可少的。 因为它的广泛应用&#xff0c;所以在程序员的日常工作和面试中&#xff0c;它都是经常出现的。它的开源特…...

go中Println和Printf的区别

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 go中Println和Printf的区别 package mainimport ( "fmt" )//TIP To run your code, right-click the c…...

C++现代教程七之模块

优点 编译时间减少&#xff1a;模块消除了重复解析和编译头文件的需要&#xff0c;从而显著减少了编译时间。特别是在大型项目中&#xff0c;这一点尤为重要。更好的封装性&#xff1a;模块允许更严格的封装&#xff0c;可以明确地控制哪些符号对外可见。这有助于减少命名冲突和…...

AVLTree

1.AVL树的概念 二叉搜索树虽然可以提高查找的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。为了解决该问题&#xff0c;于是就有了AVLTree。即当向二叉搜索树中插入…...

Java面向对象 C语言字符串常量

1. &#xff08;1&#xff09;. package liujiawei;public class Phone {String brand;double price;public void call(){System.out.println("手机打电话");}public void play(){System.out.println("手机打游戏");} } public class phonetest {public…...

SpringBoot+Thymeleaf电商系统

> 这是一个基于SpringBootThymeleafBootstrap实现的简单电商系统。 > 实现了用户浏览、添加购物车、商品管理等功能&#xff0c;并支持响应式布局。 > 本项目适合JAVA初学者作为入门学习项目 一、部分界面演示 二、技术栈 技术栈中文描述Spring Boot快速开发框架…...

了解数据库并发产生的问题

在数据库管理系统中&#xff0c;并发控制是一个至关重要的方面。随着多个用户或进程同时访问和修改数据库中的数据&#xff0c;如果没有适当的并发控制机制&#xff0c;就可能导致数据不一致、丢失更新、脏读、不可重复读和幻读等问题。在单用户系统中&#xff0c;数据库操作是…...

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…...

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大 时间&#xff1a;2023年 机构:北京邮电大学 发表在&#xff1a;IEEE TRANSACTIONS ON MULTIMEDIA, VOL. 25, 2023 代码源码地址&#xff1a; pytorch版本&#xff1a;https://github.com/dyh…...

SAP ABAP开发学习——RFC

目录 RFC接口 定义 调用过程 RFC的通信 RFC通信情况 RFC接口系统 RFC的通信模式 RFC版本 RFC调用方式 Web Service接口 SAP创建Web Service示例 远程目标的维护 创建远程目标 外部系统访问设置 RFC的调用 RFC接口 定义 调用过程 RFC的通信 RFC通信情况 RFC接…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...