1.什么是爬虫

·解释1:通过一个程序,根据网页进行爬取网页,获取有效信息;

·解释2:使用程序模拟浏览器,去向服务器发送请求,来获取响应信息;

2.爬虫核心:

(1)爬取网页:爬取整个网页,包含了网页中所有的内容;

(2)解析数据:将网页中得到的数据,进行解析;

(3)难点:爬虫与反爬虫之间的博弈;

【反爬虫:网站用来阻止爬虫程序自动抓取数据的技术】

3.爬虫的用途:

(1)数据分析/人工数据集

(2)社交软件冷启动

(3)舆情监控(企业/机构)

(4)竞争对手监控(电商,出行等行业)

4.爬虫分类:

(1)通用爬虫:

·实例:百度,360,搜狗等搜索引擎

·核心流程:访问页面-抓取数据-数据存储-数据处理-提供检索服务

·缺点:数据无用,不能根据用户的需求来精准获取数据

 (2)聚焦爬虫:

·功能:根据你的需求编写爬虫程序,只抓取你需要的目标数据,精准高效。

·设计思路:

确定要爬取的URL:找到目标网站的地址/接口

发送HTTP请求,获取HTML代码:模拟浏览器向服务器发送请求,拿到网页的原始内容(所有内容)

解析HTML字符串:按照规则从网页里提取你需要的数据

5.反爬手段

(1)User-Agent(UA):

·作用:服务器通过UA识别客户端信息(操作系统,浏览器版本等),判断是否为正常浏览器访问

(2)代理IP:

·作用:隐藏真实IP,防止被网站封禁

·三种代理的区别

代理类型

网站是否知道你用了代理

网站是否知道你的真实IP

透明代理

匿名代理

高匿代理

(3)验证码访问
(4)动态加载网页:

网站返回的是JS数据,不是网页的真实数据

(5)数据加密:

·原理:请求参数或返回数据被JS加密,无法直接解析

·应对方法:分析JS数据

6.urllib库使用:

(1)基本使用:

·urlopen:python标准库urllib.request模块里的一个核心函数

  功能:完成“连接服务器——发送请求——接收响应”的流程

·read()方法:读取服务器返回的响应内容

  直接调用read()返回的是字节类型,要用decode()方法解码成字符串

·decode()方法:把二进制的字节数据转换成字符串

    常见编码格式:utf-8:通用编码,支持几乎所以语言;

                             gbk :中文常用编码,主要在Windows系统中使用。

(2)1个类型和6个方法:

.read( )  :读取响应体,返回字节类型(一个字节 一个字节的读)

     content=response.read()

.read(n) : 读取前n个字节

     content=response.read(100)

c  .readline( ) : 读取1行内容

     line=response.readline()

.readlines( )  按行读取所以内容,返回列表list

     lines=response.readlines()

.getcode( )  获取HTTP状态码

     print(response.getcode())

     ·常见HttP状态码:

       200——正常拿到网页

       403——被反爬拦住了

       404——网站写错了

       500——网站服务器炸了

.geturl( )  获取最终返回url地址

      print(response.geturl())

.getheaders( )  获取一个状态信息

      print(response.getheaders()

(3)下载:

A.网络请求模块(不需要额外安装第三方库)

·核心用途:发送HTTP请求,获取网页内容,下载网络文件

·导入方式:Import urllib.request

B.核心函数(urlretrieve)

·导入方式:urllib.request.urlretrieve(url,filename=None,reporthook=None,date=None)

                  url:要下载的网路资源地址(网页/图片/视频的URL)

                  filename:保存到本地的文件名

·函数特点: 1.它会自动发送请求,把远程资源下载到本地,无需手动处理请求和响应

                     2.支持的文件格式:网页,图片,视频等几乎所有的网络资源

C.代码展示用法

·下载网页

·下载图片

·下载视频

7.请求对象的定制:

(1)为什么要【请求对象的定制】

直接用urllib.request.urlopen(url)访问网站,会遇到这些问题

  1. 403 Forbidden:网站识别出你是爬虫,拒绝访问
  2. 没有浏览器标识:默认请求头没有User-Agent,服务器一看就知道不是正常用户
  3. 无法带自定义信息:不能直接传递headers,data,method等参数

所以我们要用Request对象来伪装成浏览器,绕过基础反爬

(2)基础语法

A.  import urllib.request

·作用:导入Python自带的网络请求模块,写的所有urllib代码,都必须导入它

B.  url=”https://www.baidu.com”

·作用:定义你要访问的目标地址(url)

C.  Headers={“User-Agent”:”XXX”}

·作用:定义请求头,模拟浏览器的身份信息

·User-Agent:它是浏览器的“身份证”

·格式:是一个python字典(键值对),键是请求头名称,值是具体内容

D.  rep=urllib.request.Request(url=url,headers=headers)语法核心

  • urllib.request.Request:

           ·它是一个类,专门用来创建“请求对象”

           ·作用:把url/ headers/data 这些信息打包成一个完整的请求包,方便发送

  • 参数url=url:

           ·把你定义的目标地址传给Request对象

  • 参数headers=headers:

           ·把你的请求头传给Request对象

  • 执行完代表什么

         ·python会创建一个Request实例对象,里面装好了地址url/浏览器身份headers

         ·这个对象就是后面urlopen要发送的请求包

E.  Response=urllib.request.urlopen(rep)

          ·作用:把Request对象发送给服务器,并接受服务器返回的响应

          ·细节:Urlopen只能接受两种参数:纯url字符串/Request对象

                      执行完这一行,服务器会返回一个“响应对象”,存在response里

F.  html=response.read().decode(“utf-8”)

           ·response.read():读取响应里的原始内容(二进制数据)

          ·decode(“utf-8”):把二进制数据解码成正常的字符串

     (3)url的组成

a.协议:

·写在最前面,用://结尾

·常见:http://  https://(加密,更安全)

·作用:告诉程序用什么规则访问资源

b.主机名:

·就是域名/IP地址

·作用:找到目标服务器在哪

c.端口名:

·格式:主机名:端口

·http默认80  https默认443(平时可以省略)

d.路径:

·主机名后面,问号前面的部分

·作用:定位服务器上具体哪个文件/页面

e.查询参数:

·以?开头,键=值格式,多个用&连接

·作用:给服务器传参数(搜索关键词,页码,筛选条件)

f.锚点:

·以#开头

·作用:跳到页面内某个位置

g.例子:

https://www.bilibili.com/video/BV123456/?p=2#reply

·协议:https

·主机:www.bilibili.com

·路径:/video/BV123456/

·查询参数:p=2

·锚点:#reply

8.编解码(get请求+post请求):

(1)为什么要使用编解码:

·URL只能包含字母,数字,少数符号,不能直接出现中文,空格,特殊字符

·直接把中文放进URL会报错or乱码,所有必须编码转义

(2)get请求的quote方式:【单个字符串】

·导入模块:import urllib.parse

a.   urllib.parse.quote (字符串)

作用:对单个独立字符串完成 URL 编码

b.   urllib.parse.unquote (编码字符串)

作用:URL 解码,将%xx格式还原为正常中文

(3)get请求的urlencode方式:【多个参数】

a. 归属导入:import urllib.parse

b. 核心作用:·把字典参数转为url格式

                       ·Key1=value1&key2=value2

                       ·自动编码中文/特殊符号,解决get请求乱码报错

c. 基础语法:

d. 整个流程:

(4)post请求:

a. 模块导入:

·urllib.request: 负责发送网络请求,创建请求对象,获取响应

·urllib.parse: 负责URL编码,处理请求参数

b. 基础配置

c. post参数核心编码

·第一步urlencode(data):将python字典转为key = value&key2=value2格式的URL字符串,自动编码中文/特殊符号

·第二步.encode(‘utf_8’):将字符串转为bytes字节流

·核心结论:post参数必须两步编码,缺一不可

d. 创建请求对象

·data参数:传入编码后的bytes参数,post专属,GET请求不需要传data

·headers参数:挂载请求头,必须传入Request,不能直接传给urlopen

e. 发送请求与响应处理

(5)get请求和post请求的区别:

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐