python爬虫

一.爬虫介绍

爬虫在使用场景中的分类
    - 通用爬虫:
        抓取系统重要组成部分。抓取的是一整张页面数据。
    - 聚焦爬虫:
        是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。
    - 增量式爬虫:
        检测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。

爬虫的矛与盾​​​​​​​

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

反反爬策略
    爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。
robots.txt协议:
    君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取。

http协议

- 概念:就是服务器和客户端进行数据交互的一种形式。

 常用请求头信息
    - User-Agent:请求载体的身份标识
    - Connection:请求完毕后,是断开连接还是保持连接

常用响应头信息
    - Content-Type:服务器响应回客户端的数据类型

https协议:

 - 安全的超文本传输协议

加密方式
    - 对称秘钥加密
    - 非对称秘钥加密
    - 证书秘钥加密

requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。

如何使用:(requests模块的编码流程)
    - 指定url
        - UA伪装
        - 请求参数的处理
    - 发起请求
    - 获取响应数据
    - 持久化存储

环境安装:
    pip install requests

1. get方法和post方法

respons = requests.get(url=url,params=参数,headres=UA伪装)

respons.text      # 标识获取text文件内容

respons = requests.post(url=url,data=参数,headres=UA伪装)

respons.json

fpname = open(文件名,'w',encoding='utf-8')

json.dump(respons,fp=fpname,ensuer_ascii=False)

二.数据解析

方法一、正则


<div class="thumb">

<a href="/article/121721100" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg" alt="指引我有前进的方向">
</a>

</div>

ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'

方法二、ds4

bs4进行数据解析
    - 数据解析的原理:
        - 1.标签定位
        - 2.提取标签、标签属性中存储的数据值
    - bs4数据解析的原理:
        - 1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
        - 2.通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
    - 环境安装:
        - pip install bs4
        - pip install lxml
    - 如何实例化BeautifulSoup对象:
        - from bs4 import BeautifulSoup
        - 对象的实例化
            - 1.将本地的html文档中的数据加载到该对象中
                    fp = open('./test.html','r',encoding='utf-8')
                    soup = BeautifulSoup(fp,'lxml')
            - 2.将互联网上获取的页面源码加载到该对象中
                    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'):>表示的是一个层级
                - oup.select('.tang > ul a'):空格表示的多个层级
        - 获取标签之间的文本数据
            - soup.a.text/string/get_text()
            - text/get_text():可以获取某一个标签中所有的文本内容
            - string:只可以获取该标签下面直系的文本内容
        - 获取标签中属性值:
            - soup.a['href']
 

方法三、xpath

- xpath解析原理:
        - 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
        - 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
    - 环境的安装:
        - pip install lxml
    - 如何实例化一个etree对象:from lxml import etree
        - 1.将本地的html文档中的源码数据加载到etree对象中:
            etree.parse(filePath)
        - 2.可以将从互联网上获取的源码数据加载到该对象中
            etree.HTML('page_text')
        - xpath('xpath表达式')
    - xpath表达式:
        - /:表示的是从根节点开始定位。表示的是一个层级。
        - //:表示的是多个层级。可以表示从任意位置开始定位。
        - 属性定位://div[@class='song']       tag[@attrName="attrValue"]
        - 索引定位://div[@class="song"]/p[3] 索引是从1开始的。
        - 取文本:
            - /text() 获取的是标签中直系的文本内容
            - //text() 标签中非直系的文本内容(所有的文本内容)
        - 取属性:
            /@attrName     ==>img/src

解决中文乱码问题:

方法一:

response = requests.get(url=url,headers=headers)
response.encoding = 'utf-8'

方法二:

img_name = 乱码数据.encode('iso-8859-1').decode('gbk')

cookie内容

http/https协议特性:无状态。
没有请求到对应页面数据的原因:
    发起的第二次基于个人主页页面请求的时候,服务器端并不知道该此请求是基于登录状态下的请求。
cookie:用来让服务器端记录客户端的相关状态。
    - 手动处理:通过抓包工具获取cookie值,将该值封装到headers中。(不建议)
    - 自动处理:
        - cookie值的来源是哪里?
            - 模拟登录post请求后,由服务器端创建。
        session会话对象:
            - 作用:
                1.可以进行请求的发送。
                2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中。
        - 创建一个session对象:session = requests.Session()
        - 使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
        - session对象对个人主页对应的get请求进行发送(携带了cookie)

代理:破解封IP这种反爬机制。
什么是代理:
    - 代理服务器。
代理的作用:
    - 突破自身IP访问的限制。
    - 隐藏自身真实IP
代理相关的网站:
    - 快代理
    - 西祠代理
    - www.goubanjia.com
代理ip的类型:
    - http:应用到http协议对应的url中
    - https:应用到https协议对应的url中

代理ip的匿名度:
    - 透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
    - 匿名:知道使用了代理,不知道真实ip
    - 高匿:不知道使用了代理,更不知道真实的ip

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

异步爬虫的方式:
    - 1.多线程,多进程(不建议):
        好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
        弊端:无法无限制的开启多线程或者多进程。
    - 2.线程池、进程池(适当的使用):
        好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。
        弊端:池中线程或进程的数量是有上限。

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

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

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

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

    async 定义一个协程.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值