爬虫基础——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属性获取的是字符串响应数据
截图:
设置timeout参数抛出异常截图:
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通信的状态码
截图:
requests 模块响应对象的 json()方法作用
方法名:json()
语法:requests响应对象.json()
功能:将 json 格式的字符串【字典格式的字符串】转换为python格式的字典!
代码演示
不使用json()方法返回的数据类型
使用json()方法返回的数据类型
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(文件夹名)
→文件夹名可以是指定路径(绝对路径、相对路径)下的文件夹
代码演示:
三:利用 requests 模块抓取网站图片的步骤
第一步:找到图片的源地址(不是浏览器最上方的url)
第二步:利用 requests 模块向图片源地址发送请求,获取二进制(bytes)类型的网页源代码
实现语法:
res_obj = requests.get(url=图片源地址,headers=包装的请求头) →创建图片源地址响应对象
html_b_data = res_obj.content →利用对象的content获取网页二进制源代码
第三步:利用 os 模块判断图片待保存的路径(文件夹)是否存在,不存在创建这个路径文件夹
实现语法:
1 | if os.path.exists(图片待保存文件夹路径): |
第四步:根据自己的想法创建图片待保存的文件名,并且拼接图片待保存路径以及文件名
创建图片名实现语法:
1.根据图片源地址创建图片保存名称(源地址后缀必须是.jpg或者.png等): 图片源地址字符串 [ -10 : ] →获取图片源地址的最后10个字符串作为文件名
2:根据抓取的图片标题创建图片保存名称
3:单纯的遍历某个数字区间命名
拼接图片待保存路径以及文件名语法:带保存路径 + 图片带保存名
第五步:以二进制读写方法打开已经拼接好的的路径文件(不是路径文件夹)
实现语法:
1 | with open (拼装好的路径文件,“wb”)as f : |
实现代码截图(部分):
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只是属性!!!
截图演示:
安装爬虫相关的浏览器插件【重点】
目标:
1:掌握安装插件的两种方式
2:掌握与爬虫相关的插件都有哪些以及其功能
的两种方式
第一种方式:直接在浏览器对应的扩展商店里面搜索安装即可
第二种方式:如果浏览器里面的扩展商店没有目标插件,可去第三方插件网站将插件下载至计算机内,在进行离线安装
推荐第三方插件网:极简插件_Chrome扩展插件商店_优质crx应用 (zzzmh.cn)
关的插件都有哪些以及其功能
插件1:xpath helper (解析网页源代码中的html(xml)代码,提取相应数据)
插件2:JSONView (解析网页源代码中的json文档)
插件3:Proxy SwitchyOmega (轻松切换代理)
插件截图
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子标签)的文本内容(字符串类型)
整体图示
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 | from lxml import etree 导入模块 |
注意事项:
1:只要 lxml 对象调用了 xpath 方法,那么获取的数据类型一定是列表!!!!
2:在 html 文档中提取数据最常用法中通过 for 循环遍历数据结点对象里面那个xpath语法(第二个xpath)开头要以 . 开头,表示在当前标签结点下查找标签数据!
代码体验(提取数据使用步骤):
最常用法截图:
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,但是要包含最后的 ?
代码演示:
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服务器图示:
本机IP与出口IP的区别
本机IP:局域网内的IP地址,只能在局域网中使用(内网IP),在windows终端内通过 ipconfig 指令查看的 IP 即本机IP,需要上网的话会通过NET出口,分配出口IP进行上网
出口IP:外网IP,是你的计算机真正的IP地址(可以显示IP的具体地理位置)
代理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 | proxies = {“http”:“http://123.51.56.124:8695”, |
实例(独享 | 私密 代理IP):
1 | proxies = {“http”:“http://xxx:……@256.36.125.35:8695”, |
实现语法:
html_data = requests.get(url=url , headers=headers , params=params , proxies=proxies )
注意事项:
1:为什么设置代理IP时要设置两个协议的(http|https),当访问网站类型为http时,就用http协议的代理IP进行访问!
2:私密代理以及独享代理或者基本代理都是可以花钱买的,私密代理以及独享代理使用时需要验证用户名和密码!
3:爬虫最常用的是私密代理!!
代码演示:
没设置代理IP
设置了代理IP
搭建IP代理池【重点】
注意:再利用xpath语法提取数据时,右键检查发现数据所在的标签在 tbody下面这时就要小心了,因为很有可能网页源代码内没有这个tbody标签!!
目标:掌握搭建代理IP池的步骤(免费代理ip网站)
搭建代理IP池的步骤
第一步:从免费代理IP网站提取出代理IP以及端口号(xpath提取目标ip以及端口号)
第二步:通过代理ip向测试网站发送请求(设置timeout)如果超过timeout设置的时间则认为当前代理IP不可用!
第三步:将可用的代理IP以及端口号保存到列表内或者txt文件内!
代码截图
requests的post请求【重中之重】
目标:
1:掌握控制台抓包的具体步骤以及参数功能
2:掌握什么是post请求
3:掌握利用requests模块向目标url发送post请求的语法
4:掌握利用pycharm正则批量处理字符串的步骤
控制台抓包的具体步骤以及参数功能
第一步:打开网站按下F12打开控制台
第二步:刷新网站,对网站进行一些操作后进行二次刷新(动态显示的网站无需二次刷新,数据包已经加载,比如有道翻译网站)
第三步:根据一些规则(响应数据)找到自己需要的数据包
第四步:分析请求的目标URL以及请求方式
注意事项:
1:如果待抓取的数据在网页源代码内没有,基本都是异步(动态)加载的,我们可以考虑抓取XHR的包
2:多多利用好数据包信息栏里面的Preview选项(对服务器响应数据的预览),可以根据这个快速找到我们待抓取的包
什么是post请求
答:post请求就是客户端带着Form data 表单数据(字典)向服务器发送的请求
利用requests模块向目标url发送post请求的语法
语法:requests.post(url=…….,headers={},data={}).text
重要参数:data data 参数就是客户端需要带着的Form data 表单数据
参数类型:字典
利用pycharm正则批量处理字符串的步骤(一般是将字符串变为字典形式)
第一步:在pycharm内新建txt文件
第二步:将待批量处理的字符串复制进来
第三步:按下快捷键 Ctrl + r
第四步:利用 pycharm 自己的正则对字符串进行批量处理
截图:
关于js加密【重中之重】
目标:
1:掌握 分析 js 加密的过程(打断点、控制台等)
2:掌握抓取有道翻译的注意事项
分析 js 加密的过程(打断点、控制台等)
分析背景:
答:在发送post请求时,要带着Form_data表单数据向目标服务器发送请求,因为网站反爬的原因,有的Form_data表单数据是经过js加密的,因此就要分析js加密的原理从而进行破解利用python实现
分析js加密过程示例:
第一步:查看post请求中哪几个表单数据是经过 js 加密的
第二步:在全部包中搜索表单数据的变量名(salt、sign、lts)
第三步:将一行代码进行格式化(多行代码)
第四步:在包含表单数据变量名的代码中搜索表单变量名,分析js加密原理
第五步:分析经过js加密后的表单数据变量(打断点、控制台)
控制台输出代码
对程序打断点
分析完成利用python实现这个几个字段的加密然后向目标url发送post请求即可
二:抓取有道翻译的注意事项
因为有道翻译反爬严重,请求标头要道带上所有的请求标头去发送请求
爬取民政部行政区号遇到的反爬【目标】
重点:掌握在爬取民政部行政区号遇到的反爬怎么解决
爬取民政部行政区号遇到了怎样的反爬
检查发现还他娘真有这段js跳转脚本代码
未完待续…….