python爬虫(基础)

本文详细介绍了Python爬虫的基础知识,包括爬虫流程、http/https协议、请求头和响应头的要点、requests模块的使用、数据提取方法(如jsonpath和lxml)以及Selenium的介绍和使用。此外,还探讨了反爬策略,如常见的反爬机制和应对方法,强调了验证码处理和浏览器使用技巧。最后,强调了状态保持和处理数据加密的反爬策略。
摘要由CSDN通过智能技术生成

目录

系列文章目录

前言

一、爬虫基础

1.爬虫流程:

2.htttp/https协议复习:

3.爬虫特别关注的请求头和响应头:

(1)请求头:后3个最重要

(2)响应头:

(3)常见的响应码:

(4)浏览器请求过程与爬虫的区别:

4.requests模块

(1)基础:

(2)发送请求:

(3)超时参数timeout的使用:

(4)代理proxies的使用:

(5)使用verify参数忽略CA证书

(6)发送POST请求:

        实例:实现爬虫模拟金山翻译:(未做完)

(7)利用requests.session进行状态保持

5.数据提取:

(1)概要:

(2)jsonpath模块:

(3) lxml模块:

6.Selenium:

(1)selenium的介绍:

(2)工作原理

(3)安装与配置:

(4)driver对象的常用属性和方法:

(5)driver对象定位标签元素获取标签对象的方法

(6)selenium的其它使用方法:

7.反爬:(重中之重)

(1)常见概念

(2)常见的反爬:

(3)验证码

8.chrome浏览器的使用

(1)新建隐身窗口

(2)Chrome中network的更多功能

(3)js解析

        实例-有道翻译:

总结



前言

python爬虫(进阶):https://blog.csdn.net/qwerdftgu/article/details/120136508


提示:以下是本篇文章正文内容,下面案例可供参考




一、爬虫基础

1.爬虫流程:

  •  url -----> 发起请求 ------->获取响应 ------->解析响应 -------->保存数据(文件、数据库)
     




2.htttp/https协议复习:

  • 区别:https比http更安全,但是性能更低!
  • HTTP:超文本传输协议,默认端口号80
  • HTTPS:HTTP + SSL(安全套接字层),默认端口号443,SSL对传输的内容(也就是请求体或响应体)进行加密!!

3.爬虫特别关注的请求头和响应头:

(1)请求头:后3个最重要

  •  host : 域名
  • Connection : keep-alive(长连接)--->每次TCP连接/释放都需要三次/四次握手,我们让它一直处于连接状态,就只需要一次连接和释放!!!
  • Upgrade-Insecure-Requests: 升级为 https请求
  • User-Agent : 用户代理,表明自己的身份(通常通过这个模仿浏览器访问服务器,羊皮)
  • Referer: 页面跳转处(从那个页面跳转过来的),有些网站可能用这个来检测是不是爬虫;防盗链(图片/视频)----->你直接复制这个图片的链接到其他地方时,图片将显示不了!
  • Cookie: 状态保持,通常用于判断用户和其权限!像有些推送就是通过识别Cookie来进行的。

(2)响应头:

  • 只关注Set-Cookie : 对方服务器设置cookie到用户浏览器的缓存!!!

(3)常见的响应码:

  • 200:成功 302:跳转 403:资源不可用 404:找不到该页面
  • 503:服务器由于维护或者负载过重未能响应,有可能是因为爬虫频繁访问url,使服务器忽视爬虫请求,最终返回503响应码。

(4)浏览器请求过程与爬虫的区别:

  • 浏览器:发送所有请求,进行渲染! 因为返回的HTML静态文件中会引用其他数据,这些数据又是一个个url!

  • 爬虫:只发送指定请求,不会渲染!

  • 三部分:骨骼(HTML静态文件) ------> 肌肉(js/ajax请求) -------> 皮肤(css/font/图片等)

4.requests模块

(1)基础:

  1. response.text 和 response.content的区别:

          requests.text:           类型:str 解码类型:requests模块------>推测!

          requests.content:      类型:bytes 解码类型:没有指定

     2.response.content进行decode,来解决中文乱码:

response.content.decode()  默认utf-8
response.content.decode(‘GBK’)

      3.response响应对象的其它常用属性或方法:

response.url                   # 响应的url,有时候响应的url和请求的url不相同
response.staus_code            # 响应状态码
response.requests.header       # 响应对应的请求头
response.header                # 响应头
response.request._cookies      # 响应对应请求的cookies;返回cookiesJar类型
response.cookies               # 响应的cookies;经过了set-cookies动作;
response.json()                # 自动将json字符串类型的响应内容转换为python对象(dict  or  list)

(2)发送请求:

  • 发送带header的请求: 当我们以爬虫的身份去请求和加上header模拟浏览器去请求,获得的数据可能是不相同的!!!!
requests.get(url, header={})
  • 通过params携带参数字典
requests.get(url, header=header, params=kw)
  • 在header中携带cookie:cookies的目的是状态保持和用户鉴别!
  • cookies参数的使用:
# 将cookies字符串转换为cookies参数所需的字典:
cookies_dict = { cookies.split('=')[0] : cookies.split('=')[-1]  for cookie in cookies_str.split(';')}
requests.get(url, header=header, cookies=cookies_dict)


# cookieJar对象转换为cookies字典:
dict_cookies = requests.utils.dict_from_cookiejar(response.cookies)
  • 注意:cookie一般是有过期时间的,一旦过期需要重新获取!!

(3)超时参数timeout的使用:

在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错。、

# 超时参数timeout的使用

response = requests.get(url , timeout=3)      # 单位是秒,发送请求后,3秒内返回响应,否则就抛出异常!

(4)代理proxies的使用:

  1. 含义:
    代理ip是一个ip,指向的是一个代理服务器,代理服务器能够帮我们向目标服务器发送请求,起中转作用;
    分为:正向代理和反向代理
  2. 分类:

    透明
    匿名
    高匿 ---->让别根本无法发现你是代理ip,是我们使用爬虫最好的选择!!!

(5)使用verify参数忽略CA证书

因为一些网站上的CA证书是未认证的,而我们在发送请求时,requests会默认对其CA证书进行对比认证,此时可能会报错,请求不成功!只需要忽略其CA证书即可!

response = requests.get(url, verify=False)    # 一般默认是True!

(6)发送POST请求:

  • 实现方法:
requests.post(url, data)

# data是一个字典
  • post数据来源!!!
1.固定值       抓包比较不变值
2.输入值       抓包比较根据自身变化的值
3.预设值 {
    * 静态文件    需要提前从HTML中获取
    * 发请求      需要提前对指定地址发送请求获取
}
4.在客户端生成的------>  最难!!!!

  • 实例:实现爬虫模拟金山翻译:(未做完)

    import requests
    
    class King(object):
        def __init__(self, word):
            self.url = 'https://ifanyi.iciba.com/index.php?'
            self.headers = {
                'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Mobile Safari/537.36 Edg/92.0.902.55'
            }
            self.word = word
            self.data = {
                'from': 'en',
                'to': 'zh',
                'q': self.word
            }
        def get_data(self):
            response = requests.post(self.url, headers=self.headers, data=self.data)
            return response.content
        def run(self):
            response = self.get_data()
            print(response)
    
    if __name__ == '__main__':
        king = King('Chain')
        king.run()
    

(7)利用requests.session进行状态保持

requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。

  1. requests.session的作用:
    自动处理cookie,即下一次会带上前一次的cookkie
  2. 应用场景:
    自动处理连续多次请求过程中产生的cookie

requests.session使用方法:

session = requests.session()  # 实例化session对象
response = session.get(url, header, ..)
response = session.post(url, data, ...)

5.数据提取:

(1)概要:

  • 结构化:信息能够用数据或统一的结构加以表示!
json数据(高频出现):
    json模块
    re模块                            //处理
    jsonpath模块(json模块的一些补充)

xml数据(低频出现):
    re模块      --->正则表达式
    lxml模块    --->xpath语法
  • 非结构化:无法用数字或统一的结构表示,如文本、图像、声音、网页等信息
html:
    re模块        **重点**
    lxml模块      **重点**
    beautifulsoup{
        -正则表达式
        -xpath
        -css选择器
    pyquery ---->css选择器
  • xml与html

xml:一种可扩展标记语言,样子和html很像,功能更专注于对传输和存储数据,它与html一点不同是:xml的标签可以自己定义

区别:

数据格式         描述                     设计目的
XML 可扩展标记语言 被设计为传输和存储数据,其焦点是数据内容
HTML  超文本标记语言 显示数据以及然后更好显示数据

(2)jsonpath模块:

1.场景:
        多层次嵌套的复杂字典直接提取数据
2.安装:
        pip install jsonpath
3.使用:
        from jsonpath import jsonpath
        ret = jsonpath(a,  'jsonpath语法规则字符串')
   jsonpath和json一般一起使用!!!
4.语法:
        $       根节点(最外层的大括号)
        .        子节点
        ..        内部任意位置,子孙节点
        其它语法及示例:链接

from jsonpath import jsonpath
data = {'key1':{'key2':{'key3':{'key4':'python'}}}}

# 注意:jsonpath的结果为列表,获取数据需要索引!!
print(jsonpath(data, '$..key4')[0])


# 与上面的无关:获取根节点下所有key为name的值:
list = jsonpath(data, '$..name')

(3) lxml模块:

  • 处理html/xml格式内容时需要用到lxml模块和xpath语法:

  • xpath helper的安装与使用:

    • 1.安装:

           是Google浏览器的插件,需要到Google应用商店下载,或者去网上找方法下载

      2.作用:

              对当前页面测试xpath语法规则,可以直接在网页上运行xpath语句,更直观快捷。

  • xpath语法:

下面所说的元素,标签和节点都是指同样的东西!!!

1.基础节点选择语法:

表达式                                          描述
nodename 选中该元素
/ 根节点选取、或者是元素和元素间的过滤,相对于整个文本
// 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
. 选择当前节点
.. 选取当前节点的父节点
@ 选取属性
text() 选取文本

 eg:
      //title/text()       从开闭标签中选取文本内容
        //link/@href      从选中的节点标签中获取指定属性的值

2.节点修饰语法:选取特定节点

  • 通过索引修饰节点&#x
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值