爬虫学习
爬虫笔记
君子协议:”robots.txt” 协议
聚焦爬虫
数据解析分类
数据解析原理概述
1.HTTP协议
常用请求头:
User-Agent:请求载体的身份标识
Connection:请求完毕后是断开连接还是 保持连接
常用响应头信息:
Content-Type:服务器响应回客户端的数据类型
text,json…………
HTTPS协议
安全的超文本传输协议
加密方式
对称密钥加密
非对称密钥加密-公钥私钥
证书密钥加密-数字签名
2.requests模块
python中原生基于网络请求的模块
作用:模拟浏览器发请求
使用流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
技巧:
- User-Agent伪装
- AJAX局部刷新特性:XHR
3.数据解析
1. 正则
1. bs4
1. xpath(*)
原理:
解析的局部文本内容都会在标签之 间或者标签对应的属性中进行存储
- 进行指定标签的定位
- 标签或标签对应的属性中存储的数据值进行提取
1.正则匹配
import re
2.bs4
- 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
- 调用BeautifulSoup对象中的相关属性或者方法进行标签定位或数据提取
环境:bs4,lxml
对象实例化:
将本地的html文档中的数据加载到该对象中
fp=open(“./test.html”,”r”,encoding=”ytf-8”)
soup=BeautifulSoup(fp,”lxml”)
将互联网上获取的页面源码加载到该对象中
page_text=response.text
soup=BeatifulSoup(page_text,”lxml”)
提供的用于数据解析的方法和属性:
- soup.tagName:返回文档中第一次出现的tagName对应的标签
- soup.find():
- find(“tagName”):等同于soup.div
- 属性定位:
- soup.find(“div”,class_/id/attr=”song”)
- soup.find_all(“tagName”):返回符合要求的所有标签(列表)
- select:
- select(“选择器(id,class,标签…选择器)”),返回的是一个层级
- 层级选择器:
- soup.select(“.tang > ul > li > a”): >表示的是一个层级#从class开始
- oup.select(“.tang > ul a”): kong
- 获取标签之间的文本
- string:只可以获取该标签下面直系的文本内容
- text/get_text():可以获取某一个标签中所有的文本内容
- soup.a.text
- 获取标签中的属性
- soup.a[“href”]
3.xpath解析:最常用简单高效的解析方式
解析原理:
- 实例化一个etree对象,把要解析的页面源码数据加载到该对象中
- 调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的获取
环境:lxml
from lxml import etree
实例化:
本地加载
etree.parse(filePath)
互联网加载
etree.HTML(page_text)
xpath(“xpath表达式”)
xpath表达式:
层级选择:
- / 表示根目录和一个层级
- // 表示多个层级,在开头表示从任意位置定位
属性定位:例子://div[@class=”song”] tag[@attrName=”attrValue”]
索引定位:r=etree.xpath(“//div[@class=”song]”/p[3])
#获取所有位置div标签下class属性=song中第三个p标签
#xpath中索引是从一开始的
获取文本:
- /text()获取的是标签中的直系文本内容
- //text()获取的是标签中所有文本内容(非直系)
获取属性:/@attrName
例子/img/@src —>获取链接
@herf
4.模拟登录
1.验证方法
验证打码平台:云码,超级鹰
2.post方法模拟登录
3.cookie状态维持
cookie来自模拟post请求后由服务器端创建
session:可以进行请求的发送,如果请求过程中产生了cookie,那么该cookie会被自动存储/携带在该session对象中
步骤:
- 创建对象:session=requests.Session()
- 用session对象进行模拟登录post请求(cookie被存储到当中)
- 用session对象携带cookie对想要界面发送get请求
4.代理
防止ip被封,隐藏id
proxies={“https”:”x.x.x.x”}
平台:快代理
5.异步
对多个url进行请求时,例如get函数等会造成进程阻塞,是一种单线程的步骤,必须等上一个url请求成功后才能开始请求下一个url
异步爬虫方式:
- 多进程,多线程(不建议):可以为相关阻塞操作单独开通线程,但无法无限制开启,占用资源大
- 进程池,线程池(适当使用):可以降低系统开销,但池中线程时有限的
from multiprocessing.dummy import Pool
pool=Pool(进程数)
pool.map(阻塞函数,对象)
协程:
单线程+异步协程(推荐)
import asyncio
event_loop:事件循环,想当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件时,函数就会被循环执行。
coroutine:协程对象,我们可以将协程对象注册到事件循环中,他会被事件循环调用。我们可以使用async关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。
task:任务,他是对协程对象的进一步封装,包含了任务的各个状态
future:代表将来执行或者还没有执行的任务,实际上和task没有本质区别
async定义一个协程
await用来挂起阻塞方法的执行
异步和多线程都是用于处理并发任务的编程概念,但它们有以下区别:
- 执行方式:在多线程中,任务是通过多个线程并行执行的,每个线程在独立的执行流中运行。而在异步编程中,任务可以通过单个线程以非阻塞的方式进行执行。异步任务通常采用事件循环或回调机制来管理任务的执行顺序。
- 编程模型:在多线程编程中,开发者需要自行管理线程的创建、同步和通信等方面的细节,例如使用锁、条件变量等。而在异步编程中,通常使用高级的异步框架或语言特性来简化并发编程,例如使用协程、异步函数、Promise 对象等。
- 并发性:多线程可以实现真正的并行,因为多个线程可以在多个 CPU 核心上同时执行。而异步编程通常在单个线程中进行,并利用事件循环等机制在任务之间切换,从而实现伪并行,即看起来同时执行多个任务。
- 资源消耗:多线程需要为每个线程分配独立的内存空间,并且线程之间的切换会引入一定的开销。相比之下,异步编程只需要一个线程(或者少量线程),减少了线程上下文切换的开销,并且可以更高效地利用系统资源。
- 错误处理:在多线程编程中,错误处理可能会更加复杂,因为不同线程之间的异常处理和错误传递需要特别关注。而在异步编程中,通过合理地使用回调、错误处理机制和异常处理器,可以更容易地进行错误处理。
总的来说,多线程适合于 CPU 密集型任务和需要真正并行执行的情况,但需要更多的系统资源和更复杂的同步机制。而异步编程适合于 I/O 密集型任务和需要高效利用单个线程的情况,它提供了更简化的编程模型和更低的资源消耗。选择使用哪种方式取决于具体的应用场景和需求。
6.selenium模块
selenium可以便捷地获取网站中动态加载的数据,便捷地实现模拟登录
什么是selenium模块?
基于浏览器的一个自动化操作
使用流程:
- pip install selenium
- 下载一个浏览器的驱动程序
- 将所对应的浏览器的驱动添加到环境变量中
- 实例化一个浏览器对象
- 编写基于浏览器自动化代码
元素定位方式:
.find_element()
- By.ID
- By.CLASS_NAME
- By.TAG_NAME
- By.NAME
- By.LINK_TEXT(文本匹配)
- By.PARTIAL_LINK_TEXT(模糊文本匹配)
- By.CSS_SELECTOR(方法见文档)
- By.XPATH(见文章上面的xpath解析)
交互:
- 模拟点击 .click()
- 发送字段 .send_keys(“xxx”)
- 执行js程序 excute_script(“”)
iframe的处理:
.switch_to.frame(“”)#切换标签作用域到iframe内
动作链:
from selenium.webdriver import ActionChains
实例化:action=ActionChains(浏览器对象)
click_and_hold(div):长按并点击
move_by__offset(x,y)
prtform()立即执行
action.release()释放
无头浏览器
把浏览器变成无可视化界面
option=Options()
bro=webdriver.浏览器(options=option)
防止检测
option里添加参数,见网上文章
- 标题: 爬虫学习
- 作者: Yiran
- 创建于 : 2024-04-16 13:05:26
- 更新于 : 2024-04-16 21:35:32
- 链接: http://example.com/2024/04/16/爬虫学习/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。