爬虫学习

Yiran Lv1

爬虫笔记

君子协议:”robots.txt” 协议

聚焦爬虫

数据解析分类

数据解析原理概述

1.HTTP协议

常用请求头:

​ User-Agent:请求载体的身份标识

​ Connection:请求完毕后是断开连接还是 保持连接

常用响应头信息:

​ Content-Type:服务器响应回客户端的数据类型

text,json…………

HTTPS协议

​ 安全的超文本传输协议

加密方式

​ 对称密钥加密

​ 非对称密钥加密-公钥私钥

​ 证书密钥加密-数字签名

2.requests模块

python中原生基于网络请求的模块

作用:模拟浏览器发请求

使用流程:

  1. 指定url
  2. 发起请求
  3. 获取响应数据
  4. 持久化存储

技巧:

  1. User-Agent伪装
  2. AJAX局部刷新特性:XHR

3.数据解析

1. 正则
1. bs4
1. xpath(*)

原理:

​ 解析的局部文本内容都会在标签之 间或者标签对应的属性中进行存储

  1. 进行指定标签的定位
  2. 标签或标签对应的属性中存储的数据值进行提取

1.正则匹配

import re

2.bs4

  1. 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
  2. 调用BeautifulSoup对象中的相关属性或者方法进行标签定位或数据提取

环境:bs4,lxml

对象实例化:

  1. 将本地的html文档中的数据加载到该对象中

    fp=open(“./test.html”,”r”,encoding=”ytf-8”)

    soup=BeautifulSoup(fp,”lxml”)

  2. 将互联网上获取的页面源码加载到该对象中

    page_text=response.text

    soup=BeatifulSoup(page_text,”lxml”)

提供的用于数据解析的方法和属性:

  1. soup.tagName:返回文档中第一次出现的tagName对应的标签
  2. soup.find():
    1. find(“tagName”):等同于soup.div
    2. 属性定位:
      1. soup.find(“div”,class_/id/attr=”song”)
    3. soup.find_all(“tagName”):返回符合要求的所有标签(列表)
  3. select:
    1. select(“选择器(id,class,标签…选择器)”),返回的是一个层级
    2. 层级选择器:
      1. soup.select(“.tang > ul > li > a”): >表示的是一个层级#从class开始
      2. oup.select(“.tang > ul a”): kong
  4. 获取标签之间的文本
    1. string:只可以获取该标签下面直系的文本内容
    2. text/get_text():可以获取某一个标签中所有的文本内容
    3. soup.a.text
  5. 获取标签中的属性
    1. soup.a[“href”]

3.xpath解析:最常用简单高效的解析方式

​ 解析原理:

  1. 实例化一个etree对象,把要解析的页面源码数据加载到该对象中
  2. 调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的获取

​ 环境:lxml

from lxml import etree

​ 实例化:

  1. 本地加载

    etree.parse(filePath)

  2. 互联网加载

    etree.HTML(page_text)

  3. xpath(“xpath表达式”)

  4. xpath表达式:

    1. 层级选择:

      1. / 表示根目录和一个层级
      2. // 表示多个层级,在开头表示从任意位置定位
    2. 属性定位:例子://div[@class=”song”] tag[@attrName=”attrValue”]

    3. 索引定位:r=etree.xpath(“//div[@class=”song]”/p[3])

      #获取所有位置div标签下class属性=song中第三个p标签

      #xpath中索引是从一开始的

    4. 获取文本:

      1. /text()获取的是标签中的直系文本内容
      2. //text()获取的是标签中所有文本内容(非直系)
    5. 获取属性:/@attrName

      例子/img/@src —>获取链接

      @herf

4.模拟登录

1.验证方法

​ 验证打码平台:云码,超级鹰

2.post方法模拟登录

3.cookie状态维持

​ cookie来自模拟post请求后由服务器端创建

​ session:可以进行请求的发送,如果请求过程中产生了cookie,那么该cookie会被自动存储/携带在该session对象中

​ 步骤:

  1. 创建对象:session=requests.Session()
  2. 用session对象进行模拟登录post请求(cookie被存储到当中)
  3. 用session对象携带cookie对想要界面发送get请求

4.代理

​ 防止ip被封,隐藏id

​ proxies={“https”:”x.x.x.x”}

​ 平台:快代理

5.异步

对多个url进行请求时,例如get函数等会造成进程阻塞,是一种单线程的步骤,必须等上一个url请求成功后才能开始请求下一个url

异步爬虫方式:

  1. 多进程,多线程(不建议):可以为相关阻塞操作单独开通线程,但无法无限制开启,占用资源大
  2. 进程池,线程池(适当使用):可以降低系统开销,但池中线程时有限的

from multiprocessing.dummy import Pool

pool=Pool(进程数)

pool.map(阻塞函数,对象)

协程:

单线程+异步协程(推荐)

import asyncio

event_loop:事件循环,想当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件时,函数就会被循环执行。

coroutine:协程对象,我们可以将协程对象注册到事件循环中,他会被事件循环调用。我们可以使用async关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。

task:任务,他是对协程对象的进一步封装,包含了任务的各个状态

future:代表将来执行或者还没有执行的任务,实际上和task没有本质区别

async定义一个协程

await用来挂起阻塞方法的执行

异步和多线程都是用于处理并发任务的编程概念,但它们有以下区别:

  1. 执行方式:在多线程中,任务是通过多个线程并行执行的,每个线程在独立的执行流中运行。而在异步编程中,任务可以通过单个线程以非阻塞的方式进行执行。异步任务通常采用事件循环或回调机制来管理任务的执行顺序。
  2. 编程模型:在多线程编程中,开发者需要自行管理线程的创建、同步和通信等方面的细节,例如使用锁、条件变量等。而在异步编程中,通常使用高级的异步框架或语言特性来简化并发编程,例如使用协程、异步函数、Promise 对象等。
  3. 并发性:多线程可以实现真正的并行,因为多个线程可以在多个 CPU 核心上同时执行。而异步编程通常在单个线程中进行,并利用事件循环等机制在任务之间切换,从而实现伪并行,即看起来同时执行多个任务。
  4. 资源消耗:多线程需要为每个线程分配独立的内存空间,并且线程之间的切换会引入一定的开销。相比之下,异步编程只需要一个线程(或者少量线程),减少了线程上下文切换的开销,并且可以更高效地利用系统资源。
  5. 错误处理:在多线程编程中,错误处理可能会更加复杂,因为不同线程之间的异常处理和错误传递需要特别关注。而在异步编程中,通过合理地使用回调、错误处理机制和异常处理器,可以更容易地进行错误处理。

总的来说,多线程适合于 CPU 密集型任务和需要真正并行执行的情况,但需要更多的系统资源和更复杂的同步机制。而异步编程适合于 I/O 密集型任务和需要高效利用单个线程的情况,它提供了更简化的编程模型和更低的资源消耗。选择使用哪种方式取决于具体的应用场景和需求。

6.selenium模块

selenium可以便捷地获取网站中动态加载的数据,便捷地实现模拟登录

什么是selenium模块?

基于浏览器的一个自动化操作

使用流程:

  1. pip install selenium
  2. 下载一个浏览器的驱动程序
  3. 将所对应的浏览器的驱动添加到环境变量中
  4. 实例化一个浏览器对象
  5. 编写基于浏览器自动化代码

元素定位方式:

.find_element()

  1. By.ID
  2. By.CLASS_NAME
  3. By.TAG_NAME
  4. By.NAME
  5. By.LINK_TEXT(文本匹配)
  6. By.PARTIAL_LINK_TEXT(模糊文本匹配)
  7. By.CSS_SELECTOR(方法见文档)
  8. By.XPATH(见文章上面的xpath解析)

交互:

  1. 模拟点击 .click()
  2. 发送字段 .send_keys(“xxx”)
  3. 执行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 进行许可。