爬虫基础——requests模块与xpath语法

本文主讲:爬虫请求库requests的使用与xpath语法解析数据、User-agent随机生成库、代理IP、搭建代理IP池、关于js加密那些事等等…..

requests模块的使用【重点】

须知:一个网页右键检查(F12)所看到的代码是浏览器最终渲染完成的代码,它和网站服务器给你相应的源代码不一定相同,抓取数据的时候一定要以源代码为主,检查可以帮助你快速查找数据!!!

目标:

1:掌握 requests 模块的基本使用(获取url响应数据)

2:掌握 requests 模块响应对象一些基本属性

3:掌握 requests 模块响应对象的 json()方法作用


requests 模块的基本使用(获取url响应数据)

实现功能:向指定url发送请求(User-Agent经过包装)获取响应数据

语法:

1:res_obj = requests.get(url = url,headers = headers) →向目标url发送get请求,返回响应对象

html_data = res_obj.text →利用响应对象的text属性获取响应源代码

2:html_data = requests.get(url = url,headers = headers,timeout=3).text → 向目标url发送get请求,获取响应源代码

参数:

1.url:请求的目标url

2.headers:包装的请求标头信息

3.timeout:设置请求时间,如果向指定网站发送请求,等待的响应时间超过3秒,则抛出异常(可捕获用!)

注意事项:

1:在 requests 模块内的响应对象没有方法,全都是属性,例如 text 属性

2:requests 模块是第三方模块安装语法 pip3 install requests

3:响应对象的text属性获取的是字符串响应数据

截图:

image-20211013105030475

设置timeout参数抛出异常截图:

image-20211013105037895

requests 模块响应对象一些基本属性

res_obj = requests.get(url = url,headers = headers) →创建指定url服务器的响应对象

下面是响应对象的一些常用属性

res_obj.text:获取指定url的响应源代码(字符串类型的)

res_obj.content:获取指定url的响应源代码(bytes类型的,也就是二进制的响应源代码)

res_obj.url:获取服务器响应数据的真实url地址

res_obj.status_code:获取客户端与服务端进行http通信的状态码

截图:

image-20211013105054440

requests 模块响应对象的 json()方法作用

方法名:json()

语法:requests响应对象.json()

功能:将 json 格式的字符串【字典格式的字符串】转换为python格式的字典!

代码演示

不使用json()方法返回的数据类型

image-20211013105105938

使用json()方法返回的数据类型

image-20211013105112398

requests模块抓取图片、视频等【重点】

须知:一个网页右键检查(F12)所看到的代码是浏览器最终渲染完成的代码,它和网站服务器给你相应的源代码不一定相同,抓取数据的时候一定要以源代码为主,检查可以帮助你快速查找数据!!!

目标:

1:掌握抓取网站图片、视频的一些注意事项

2:掌握怎么利用 os 标准库判断一个路径是否存在以及怎么创建文件夹!

2:掌握利用 requests 模块抓取网站图片的步骤

抓取网站图片、视频的一些注意事项

图片、视频在计算机内的存储方式:图片、视频、音频均以二进制(bytes)数据的方式进行存储

图片、视频等的 url 地址:图片、视频等文件的源url地址不是浏览器最上方的地址,而是在图片上右击选择复制图片源地址的地址

抓取注意事项:

1:因此在向图片、视频等 url 源地址发送请求获取源代码数据时,应该获取二进制(bytes)网页源代码

2:获取到二进制网页源代码后,保存文件时,只要是图片、视频等,都要以二进制的方式打开指定文件!!

怎么利用 os 标准库判断一个路径是否存在以及怎么创建文件夹!

判断路径是否存在功能语法实现:

1.import os →导入模块
2.is_no = os.path.exists(指定路径文件夹或文件) →判断指定路径文件夹(文件)是否在计算机存在,是返回True,不在返回False

创建文件夹语法实现:

1.import os →导入模块
2.os.mkdir(文件夹名) →文件夹名可以是指定路径(绝对路径、相对路径)下的文件夹

代码演示:

image-20211013105138508

三:利用 requests 模块抓取网站图片的步骤

第一步:找到图片的源地址(不是浏览器最上方的url)

image-20211013105157588

第二步:利用 requests 模块向图片源地址发送请求,获取二进制(bytes)类型的网页源代码

实现语法:

res_obj = requests.get(url=图片源地址,headers=包装的请求头) →创建图片源地址响应对象
html_b_data = res_obj.content →利用对象的content获取网页二进制源代码

第三步:利用 os 模块判断图片待保存的路径(文件夹)是否存在,不存在创建这个路径文件夹

实现语法:

1
2
3
4
5
if  os.path.exists(图片待保存文件夹路径):
print(“路径存在”)
else
print(“路径不存在即将创建”)
os.mkdir(图片待保存的文件夹路径)

第四步:根据自己的想法创建图片待保存的文件名,并且拼接图片待保存路径以及文件名

创建图片名实现语法:

1.根据图片源地址创建图片保存名称(源地址后缀必须是.jpg或者.png等): 图片源地址字符串 [ -10 : ] →获取图片源地址的最后10个字符串作为文件名

2:根据抓取的图片标题创建图片保存名称

3:单纯的遍历某个数字区间命名

拼接图片待保存路径以及文件名语法:带保存路径 + 图片带保存名

第五步:以二进制读写方法打开已经拼接好的的路径文件(不是路径文件夹)

实现语法:

1
2
with open (拼装好的路径文件,“wb”)as f :
f.wither(向图片源地址请求的二进制源代码)

实现代码截图(部分):

image-20211013105224121

User-Agent库随机生成用户代理【重点】

目标:掌握怎么用 Python 库 fake_useragent(非标准库) 生成随机的用户代理

Python 库 fake_useragent(非标准库)生成随机的用户代理

安装:pip3 install fake_useragent

功能:随机生成用户代理(User-Agent)

语法:
导入模块:from fake_useragent import UserAgent
生成随机代理:UserAgent().random

爬虫用法:

导入模块:from fake_useragent import UserAgent

生成随机代理:headers = {“User-Agent”:UserAgent().random}

注意事项:生成随机用户代理时,利用的是UserAgent方法,不是random方法,random只是属性!!!

截图演示:

image-20211013105241914

安装爬虫相关的浏览器插件【重点】

目标:
1:掌握安装插件的两种方式
2:掌握与爬虫相关的插件都有哪些以及其功能

的两种方式

第一种方式:直接在浏览器对应的扩展商店里面搜索安装即可

第二种方式:如果浏览器里面的扩展商店没有目标插件,可去第三方插件网站将插件下载至计算机内,在进行离线安装
推荐第三方插件网:极简插件_Chrome扩展插件商店_优质crx应用 (zzzmh.cn)

关的插件都有哪些以及其功能

插件1:xpath helper (解析网页源代码中的html(xml)代码,提取相应数据)

插件2:JSONView (解析网页源代码中的json文档)

插件3:Proxy SwitchyOmega (轻松切换代理)

插件截图

image-20211013105329439

xpath语法详解【重点】

目标:
1:掌握什么是 xpath
2:掌握 xpath 匹配数据的几种语法格式
3:使用 xpath 的一些注意事项

xpath

答:xpath 是在 xml 文档中匹配数据的一种查询语言(俗称xml路径语言),因为 xml 文档与 html 文档结构非常类似,所以 xpath 也可以用在匹配 html 文档数据中(爬虫提取数据)

xpath匹配数据的几种语法格式

/div匹配文档中所有的 div 标签,返回匹配的内容对象

/div/p匹配文档中所有的div标签下的一级 p 标签,返回 p 标签下(包括p标签子标签)的所有的文本内容对象(是文本结点对象,不是字符串类型的文本)

/div//p匹配文档中所有 div 标签下的所有级别 p 标签(包含在div标签内其他标签下p标签),返回 p 标签下(包括p标签内子标签)的所有的文本内容对象(是文本结点对象,不是字符串类型的文本)

/div/p[1]匹配文档中所有div标签内的第一个 p 标签,返回这个 p 标签下的所有文本内容对象

/div[@class="name"]匹配文档中属性包含 class=”name”的所有div标签,返回这个div标签下的所有文本内容对象

/div/p@src匹配文档内所有div标签下的p标签,获取p标签中src属性的值(是字符串类型不是文本对象类型)

/div[@class="byd"] | //div[@class="bm"]匹配文档内class属性为“byd”或者“bm”的所有div标签,返回下面所有标签的文本内容对象(不是字符串类型)

/li[ contains(@class,"car_")]匹配class属性中包含“car_”内容的所有 li 标签,返回下面所有标签的文本内容对象(不是字符串类型)

/li[@class="name"]/text()匹配 class 属性值为“name’”的所有 li 标签,并且返回 li 标签中(不包括li子标签)的文本内容(字符串类型)

整体图示

image-20211013105409947

path 的一些注意事项

最重要一条:xpath语法的开头查找标签必须要加两条//,一条/不能成功匹配

1.xpath语法中只要与条件有关,就要在条件两侧加上 [ ]

2.xpath语法内只要与标签属性有关,就要在属性前面加上@

3.xpath语法中末尾是 /text()或者 /@属性值,那么获取的值就是字符串类型的文本内容,除此之外获取的全部都是文本内容对象(不是字符串)

4.xpath语法是 //div/p/text(),只匹配所有div标签下p标签中的文本内容(字符串),不能匹配p标签下其他子标签的文本内容!!!

5.xpath语法是 //div/p,匹配所有div标签下p标签中(包含p标签下的其他子标签)的文本内容对象(不是字符串)

6.html一段文档是 <p class=”name”, id=6> 姓名

,其中class与id都是属性,匹配的文本内容是姓名,不是其他的!

lxml库搭配xpath语法实现数据提取【重点】

目标:
1:掌握 python 的第三方库 lxml 搭配 xpath 语法在 html 文档内提取数据的使用方法!
2:掌握 for 循环的另外一种用法以及怎么将列表内元素拼接为一个字符串

on 的第三方库 lxml 搭配 xpath 语法在 html 文档内提取数据的使用方法!

lxml库功能:与 xpath 语法搭配使用从而在 html 或者 xml 文档中提取出自己想要的数据

lxml库安装(unubtu):pip3 install lxml

lxml库在html文档代码内提取数据使用步骤:

from lxml import etree 导入模块
lxml_obj = etree.HTML( 网页的html源代码 ) 创建 lxml 对象用于提取数据

data_list = lxml_obj.xpath(xpath语法) 利用 xpath 语法从网页的html源代码中提取数据

lxml库搭配xpath语法在html文档中提取数据(电影、汽车等)最常用法如下:

1
2
3
4
5
6
from lxml import etree                                                导入模块
lxml_obj = etree.HTML( 网页的html源代码 ) 创建 lxml 对象用于提取数据
lable_obj_list = lxml_obj.xpath(xpath语法) 利用 xpath 语法从网页的 html 源代码中 提取 数据存在的 标签结点对象
for lable in data_list: for循环遍历这个标签结点对象
data_list = lable.xpath(xpath语法) 调用这个标签结点对象的xpath方法,在当前路径下匹配数据
print(data_list) 打印数据

注意事项:

1:只要 lxml 对象调用了 xpath 方法,那么获取的数据类型一定是列表!!!!

2:在 html 文档中提取数据最常用法中通过 for 循环遍历数据结点对象里面那个xpath语法(第二个xpath)开头要以 . 开头,表示在当前标签结点下查找标签数据!

代码体验(提取数据使用步骤):

image-20211013105447337

最常用法截图:

image-20211013105454198

requests模块的高级参数【重点】

目标:
1:掌握 requests 模块 params 参数的功能
2:掌握 http与https有什么不同
3掌握 requests 模块 verify 参数的功能

requests 模块 params 参数的功能

参数名:params

参数类型:字典

功能:对目标 url 的查询参数(中文或英文)进行编码然后拼接整体 url

语法:requests对象.get(url=基准url,headers=headers,params={“查询参数名1”:“查询参数值1”,查询参数名2”:“查询参数值2”})

注意事项:利用 requests 库加上 params 参数向目标url发送请求时,url是基准url,也就是不包含查询参数的url,但是要包含最后的 ?

代码演示:

image-20211013105520303

http与https有什么不同以及http怎么变为https

第一:http端口号是80,https端口号是443

第二:https就是在http基础加上了安全套接层(ssl),就是客户端向https协议的网站服务器发送请求,请求报文会被加密,目标url服务器响应的报文也就进行加密

http怎么升级为https:http协议网站向第三方数字证书认证机构进行ssl认证即可,注意必须是要经过第三方数字证书认证机构认证,个人做的ssl证书,浏览器是不信任的!

requests 模块 verify 参数的功能

参数名称:verify

参数类型:bool 类型( True【默认】 | False )

功能:是否对目标 url (https协议的)进行 ssl 检查,默认检查,如果目标 https协议的url 没有经过第三方数字证书认证机构认证,会抛出 SSLError错误

适用场景:向未经过第三方数字证书认证机构的https网站发送请求时,如果出现SSLError异常,可将verify参数值设置为False

语法:requests对象.get(url=基准url,headers=headers,verify=False)

代理IP的使用【重点】

目标:
1:掌握为什么要用代理IP访问web服务器
2:掌握本机IP与出口IP的区别
3:掌握代理IP分类以及代理IP的网站
4:掌握利用requests库如何实现代理IP请求web服务器

为什么要用代理IP访问web服务器

答:如果利用自身IP频率过高的访问web服务器,网站一般都有反爬措施,会将自身的IP(出口IP)封掉,这是我们就提现出代理IP的重要性了

利用代理IP访问web服务器图示:

image-20211013105558759

本机IP与出口IP的区别

本机IP:局域网内的IP地址,只能在局域网中使用(内网IP),在windows终端内通过 ipconfig 指令查看的 IP 即本机IP,需要上网的话会通过NET出口,分配出口IP进行上网

image-20211013105617724

出口IP:外网IP,是你的计算机真正的IP地址(可以显示IP的具体地理位置)

image-20211013105647739

代理IP分类以及代理IP的网站

高匿代理IP:通过高匿代理IP访问网站服务器,服务器不知道这是用户通过代理IP访问的(知道代理IP地址),不知道真实用户的IP

普通代理IP:通过普通代理IP访问网站服务器,服务器知道这是用户通过这个代理IP进行访问的(知道代理IP地址),但是不知道用户的真实IP

透明代理IP:通过透明代理IP访问网站服务器,服务器知道代理IP地址以及用户的真实IP地址

常用的免费代理IP网站:

快代理:快代理 - 企业级代理云服务提供商 (kuaidaili.com)

66代理:免费代理ip_服务器http代理_最新ip代理_免费ip提取网站_国内外代理_66免费代理ip (66ip.cn)

利用requests库如何实现代理IP请求web服务器

实现参数:proxies

参数类型:字典

参数设置:

设置基本代理IP → proxies = {“协议类型”,“协议类型://代理IP地址:代理IP端口号”}

设置专享 | 私密 代理IP → proxies = {“协议类型”,“协议类型://用户名:密码@代理IP地址:代理IP端口号”}

实例(基本代理IP):

1
2
proxies = {“http”:“http://123.51.56.1248695”,
“https”:“https://123.51.56.1248695”}

实例(独享 | 私密 代理IP):

1
2
proxies = {“http”:“http://xxx:……@256.36.125.358695”,
“https”:“https://xxx:……@256.36.125.358695”}

实现语法:

html_data = requests.get(url=url , headers=headers , params=params , proxies=proxies )

注意事项:

1:为什么设置代理IP时要设置两个协议的(http|https),当访问网站类型为http时,就用http协议的代理IP进行访问!

2:私密代理以及独享代理或者基本代理都是可以花钱买的,私密代理以及独享代理使用时需要验证用户名和密码!

3:爬虫最常用的是私密代理!!

代码演示:

没设置代理IP

image-20211013105737207

设置了代理IP

image-20211013105743874

搭建IP代理池【重点】

注意:再利用xpath语法提取数据时,右键检查发现数据所在的标签在 tbody下面这时就要小心了,因为很有可能网页源代码内没有这个tbody标签!!

目标:掌握搭建代理IP池的步骤(免费代理ip网站)

搭建代理IP池的步骤

第一步:从免费代理IP网站提取出代理IP以及端口号(xpath提取目标ip以及端口号)

第二步:通过代理ip向测试网站发送请求(设置timeout)如果超过timeout设置的时间则认为当前代理IP不可用!

第三步:将可用的代理IP以及端口号保存到列表内或者txt文件内!

代码截图

image-20211013105800933

image-20211013105809267

image-20211013105819657

requests的post请求【重中之重】

目标:
1:掌握控制台抓包的具体步骤以及参数功能

2:掌握什么是post请求

3:掌握利用requests模块向目标url发送post请求的语法

4:掌握利用pycharm正则批量处理字符串的步骤

控制台抓包的具体步骤以及参数功能

第一步:打开网站按下F12打开控制台

第二步:刷新网站,对网站进行一些操作后进行二次刷新(动态显示的网站无需二次刷新,数据包已经加载,比如有道翻译网站)

第三步:根据一些规则(响应数据)找到自己需要的数据包

第四步:分析请求的目标URL以及请求方式

注意事项:

1:如果待抓取的数据在网页源代码内没有,基本都是异步(动态)加载的,我们可以考虑抓取XHR的包

2:多多利用好数据包信息栏里面的Preview选项(对服务器响应数据的预览),可以根据这个快速找到我们待抓取的包

image-20211013105858633

什么是post请求

答:post请求就是客户端带着Form data 表单数据(字典)向服务器发送的请求

利用requests模块向目标url发送post请求的语法

语法:requests.post(url=…….,headers={},data={}).text

重要参数:data data 参数就是客户端需要带着的Form data 表单数据

参数类型:字典

image-20211013105908065

利用pycharm正则批量处理字符串的步骤(一般是将字符串变为字典形式)

第一步:在pycharm内新建txt文件

第二步:将待批量处理的字符串复制进来

第三步:按下快捷键 Ctrl + r

第四步:利用 pycharm 自己的正则对字符串进行批量处理

截图:

image-20211013105922519

关于js加密【重中之重】

目标:
1:掌握 分析 js 加密的过程(打断点、控制台等)
2:掌握抓取有道翻译的注意事项

分析 js 加密的过程(打断点、控制台等)

分析背景:

答:在发送post请求时,要带着Form_data表单数据向目标服务器发送请求,因为网站反爬的原因,有的Form_data表单数据是经过js加密的,因此就要分析js加密的原理从而进行破解利用python实现

分析js加密过程示例:

第一步:查看post请求中哪几个表单数据是经过 js 加密的

image-20211013110011885

第二步:在全部包中搜索表单数据的变量名(salt、sign、lts)

image-20211013110021162

第三步:将一行代码进行格式化(多行代码)

image-20211013110030164

第四步:在包含表单数据变量名的代码中搜索表单变量名,分析js加密原理

image-20211013110038526

第五步:分析经过js加密后的表单数据变量(打断点、控制台)

image-20211013110047499

控制台输出代码

image-20211013110054831

对程序打断点

image-20211013110103415

分析完成利用python实现这个几个字段的加密然后向目标url发送post请求即可

二:抓取有道翻译的注意事项

因为有道翻译反爬严重,请求标头要道带上所有的请求标头去发送请求

image-20211013110114786

爬取民政部行政区号遇到的反爬【目标】

重点:掌握在爬取民政部行政区号遇到的反爬怎么解决

爬取民政部行政区号遇到了怎样的反爬

image-20211013110131351

image-20211013110139384

检查发现还他娘真有这段js跳转脚本代码

image-20211013110149295

未完待续…….