杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

爬虫概述

学自路飞学城樵夫

爬虫概述

爬虫分为善意的爬虫和恶意的爬虫

  • 善意的爬虫, 不破坏被爬取的?站的资源(正常访问, 一般频率不高, 不窃取用户隐私)

  • 恶意的爬虫, 影响网站的正常运营(抢票, 秒杀, 疯狂solo网站资源造成网站宕机)

    要安分守己. 时常优化爬虫程序避免干扰到网站的正常运行. 并且在使爬取到的数据时,发现涉及到用户隐私和商业机密等敏感内容时, 一定要及时终止爬取和传播。

爬虫的予与盾

反爬机制 门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。

反反爬策略爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据

robots.txt协议:君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取

在网站网址后加上 /robots.txt可查看协议

如:查看B站https://www.bilibili.com/ 的爬虫协议 https://www.bilibili.com/robots.txt

image-20220118155704342

爬虫程序样例

1
2
3
4
5
6
7
8
from urllib.request import urlopen	# 一般爬虫不直接使用这个库了

url = "http://www.baidu.com"
resp = urlopen(url)

with open("mybaidu.html", mode="w") as f:
f.write(resp.read().decode("utf-8")) # 读取到网页的页面源代码
print("over!")

网络数据请求过程

  • C/S Client 客户端 Server服务器端
    • 安全,避免大量数据的传输
  • B/S Brower 浏览器 Server服务器端

爬虫究竟是合法还是违法的?

  • 在法律中是不被禁止
  • 具有违法风险
  • 善意爬虫 恶意爬虫

爬虫带来的风险可以体现在如下2方面:

  • 爬虫干扰了被访问网站的正常运营
    • 爬虫抓取了收到法律保护的特定类型的数

如何在使用编写爬虫的过程中避免进入局子的厄远

  • 时常的优化自己的程序,避免干扰被访问
    • 在使用,传播爬取到的数据时,审查抓取到的内容,如果发现了涉及到用户隐私商业机密等敏感内容需要及时停止爬取或传播

爬虫在使用场景中的分类

- 通用爬虫:
    - 抓取系统重要组成部分
  • 聚焦爬虫:
  • 增量式爬虫:

模拟登录:

- 基于某些用户的用户信息。

需求:对人人网进行模拟登录。

- 点击登录按钮之后会发起一个post请求
- post请求中会携带登录之前录入的相关的登录信息(用户名,密码,验证码,,,,,,)
  • 验证码:每次请求都会变化

http:/httpst协议特性:无状态

没有请求到对应页面数据的原因:

- 发起第二次请求的时候,服务器端并不知道该此请求是基于登录状态下的请求。

cookie:用来让服务器端记录客户端的相关状态

- 手动处理:通过抓包工具获取 cookie值,将该值封装到 headers中。(不建议)

- 自动处理:
        - cookie值的来源是哪里?

    - 模拟登录post请求后,由服务器端创建

- session会话对象:

  - 作用:

    1.可以进行请求的发送

    2.如果请求过程中产生了 cookie,则该 cookies会被自动存储/携带在该session对象

- 创建一个session对象: `session=requests.Session()`

  使用session对象进行模拟登录post请求的发送( cookie就会被存储在 session中)

代理:破解封IP这种反爬机制
什么是代理:

  • 代理服务器

代理的作用:

  • 突破自身IP访问的限制
  • 隐藏自身真实的IP

代理相关网站:

  • 快代理
  • 西祠代理
  • www.goubanjia.com

代理IP的类型:

  • http:应用到http协议对应的url中
  • https:应用到https协议对应的url中

代理IP的匿名度:

  • 透明:服务器知道请求使用了代理,也知道真实IP
  • 匿名:知道使用了代理,不知道真实IP
  • 高匿:不知道使用了代理,更不知道真实IP

高性能异步爬虫

目的:在爬虫中使用异步实现高性能的数据爬取操作

异步爬虫的方式:

  • 多线程,多进程(不推荐)
    好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行
    弊端:无法无限制的开启多线程或者多进程

  • 线程池,进程池(适当使用)
    好处:可以降低系统对进程或者线程创建和销毁的频率,从而降低系统的开销
    弊端:池中线程或进程的数量是有上限

  • 单线程+异步协程(推荐)
    event_loop: 事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上当满足某些条件的时候,函数就会被循环执行

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

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

future代表将来执行或还没有执行的任务,实际上和task没有本质区别
async定义一个协程
await用来挂起阻塞方法的执行

selenium模块的基本使用

问题: selenium模块和爬虫之间具有怎样的关联?

  • 便捷的获取网站中动态加载的数据
  • 便捷实现模拟登录

什么是 selenium模块?

- 基于浏览器自动化的一个模块

selenium使用流程:

  • 环境安装:pip install selenium
  • 下载浏览器驱动程序
  • 实例化浏览器对象
  • 编写基于浏览器的自动化代码
    • 发起请求:get(url)
    • 标签定位:find系列
    • 标签交互:send_keys(‘xxx’)
    • 执行js程序:execute_script(‘jsCode’)
    • 前进,回退 forward() back()
    • 关闭浏览器:quit()
  • selenium处理iframe
    • 如果定位的标签在iframe标签中,则必须使用switch_to.frame(id)
    • 动作链(拖动):from selenium.webdriver import ActionChains
      • 实例化一个动作链对象:action = ActionChains(bro)
      • click_and_hold(div) 长按且点击操作
      • move_by_offset(x,y)
      • perform() 让动作链立即执行
      • action.release() 释放动作链对象
  • 无头浏览器
    option = Options()
    option.add_argument(‘—headless’)
    option.add_argument(‘—disable-gpu’)
  • 规避检测(在抓包工具的控制台输入window.navigator.webdriver)
    option.addgument(‘—disable-blink-features=AutomationControlled’)

欢迎关注我的其它发布渠道