首页 > 编程语言 >【python爬虫】80页md笔记0基础到scrapy项目高手,第(4)篇:requests和网络数据获取进阶

【python爬虫】80页md笔记0基础到scrapy项目高手,第(4)篇:requests和网络数据获取进阶

时间:2023-11-06 22:39:46浏览次数:42  
标签:session md 进阶 python jsonpath 模块 requests data 请求

本阶段主要学习requests这个http模块,该模块主要用于发送请求响应,该模块有很多的替代模块,比如说urllib模块,但是在工作中用的最多的还是requests模块,requests的代码简洁易懂,相对于臃肿的urllib模块,使用requests编写的爬虫代码将会更少,而且实现某一功能将会简单。因此建议大家掌握该模块的使用。

整套爬虫笔记直接地址: 请移步这里


共 8 章,37 子模块,总计近6w字


接上一篇

4. requests模块发送post请求

思考:哪些地方我们会用到POST请求?

1. 登录注册( 在web工程师看来POST 比 GET 更安全,url地址中不会暴露用户的账号密码等信息)
2. 需要传输大文本内容的时候( POST 请求对数据长度没有要求)

所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求

4.1 requests发送post请求的方法

  • response = requests.post(url, data)

  • data参数接收一个字典

  • requests 模块发送post请求函数的其它参数和发送get请求的参数完全一致

4.2 POST请求练习

下面面我们通过金山翻译的例子看看post请求如何使用:

1. 地址:<ht://fy.iciba.com/>
思路分析
1. 抓包确定请求的url地址

2. 确定请求的参数

3. 确定返回数据的位置

4. 模拟浏览器数据
4.2.3 抓包分析的结论
1. url地址:`ht://fy.iciba.com/`

2. 请求方法:POST

3. 请求所需参数:


data = {
'f': 'auto', # 表示被翻译的语言是自动识别
't': 'auto', # 表示翻译后的语言是自动识别
'w': '人生苦短' # 要翻译的中文字符串
}
  1. pc 端User-Agent
4.2.4 代码实现

了解requests模块发送post请求的方法,以及分析过移动端的百度翻译之后,我们来完成代码

import requests
import json
class King(object):

    def __init__(self, word):
        self.url = "http://fy.iciba.com/ajax.php?a=fy"
       self.word = word
        self.headers = {
            "User-Agent": ""
       }
       self.post_data = {
           "f": "auto",
            "t": "auto",
           "w": self.word
        }   
    def get_data(self):
        response = requests.post(self.url, headers=self.headers, data=self.post_data)
    # 默认返回bytes类型,除非确定外部调用使用str才进行解码操作
        return response.content

    def parse_data(self, data):
        # 将json数据转换成python字典
        dict_data = json.loads(data)

        # 从字典中抽取翻译结果
        try:
            print(dict_data['content']['out'])
        except:
            print(dict_data['content']['word_mean'][0])

    def run(self):
        # url
        # headers
        # post----data
        # 发送请求
        data = self.get_data()
        # 解析

        self.parse_data(data)

if __name__ == '__main__':
	# king = King("人生苦短,及时行乐")
	king = King("China")
    king.run()
    # python标准库有很多有用的方法,每天看一个标准库的使用

知识点:掌握 requests模块发送post请求

5. 利用requests.session进行状态保持

requests模块中的Session类能够自动处理发送请求响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它

5.1 requests.session的作用以及应用场景

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

5.2 requests.session使用方法

session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

session = requests.session() # 实例化session对象
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
  • session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致

5.3 课堂测试

使用requests.session来完成github登陆,并需要登陆后才能访问的页面

5.3.1 提示
1. 对github登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包
2. 确定登陆请求的url地址、请求方法和所需的请求参数

* 部分请求参数在别的url对应的响应内容中,可以使用re模块

3. 确定登陆后才能访问的页面的的url地址和请求方法
4. 利用requests.session完成代码
5.3.2 参考代码
import requests
import re
# 构造请求头字典
headers = {
    'User-Agent': '',
}
# 实例化session对象
session = requests.session()
# 访问登陆页登陆请求所需参数
response = session.get('https://github.com/login', headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # 使用正则登陆请求所需参数
# 构造登陆请求参数字典
data = {
    'commit': 'Sign in', # 固定值
    'utf8': '✓', # 固定值
    'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
    'login': input('输入github账号:'),
    'password': input('输入github账号:')
}
# 发送登陆请求(无需关注本次请求的响应)
session.post('https://github.com/session', headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get('https://github.com/1596930226', headers=headers)
print(response.text)

知识点:掌握 利用requests.session进行状态保持

数据提取概

本阶段本文主要学习响应之后如何从响应中提取我们想要的数据,在本阶段本文中我们会讲解一些常用的方法和模块,基本上我们以后遇到的情况在掌握本阶段本文之后都能搞定

数据提取概述

知识点
  • 了解 响应内容的分类
  • 了解 xml和html的区别

1. 响应内容的分类

在发送请求响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据

  • 结构化的响应内容

    • json字符串

      • 可以使用re、json等模块来提取特定数据
      • json字符串的例子如下图
    • xml字符串

      • 可以使用re、lxml等模块来提取特定数据

      • xml字符串的例子如下

        <bookstore>
        <book category="COOKING">
        
          <title lang="en">Everyday Italian</title> 
        
          <author>Giada De Laurentiis</author> 
          <year>2005</year> 
          <price>30.00</price> 
        </book>
        <book category="CHILDREN">
        
          <title lang="en">Harry Potter</title> 
        
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
        </book>
        <book category="WEB">
        
          <title lang="en">Learning XML</title> 
        
          <author>Erik T. Ray</author> 
          <year>2003</year> 
          <price>39.95</price> 
        </book>
        </bookstore>
        
  • 非结构化的响应内容

    • html字符串

      • 可以使用re、lxml等模块来提取特定数据
      • html字符串的例子如下图

知识点:了解 响应内容的分类

2. 认识xml以及和html的区别

要搞清楚html和xml的区别,首先需要我们来认识xml

2.1 认识xml

xml是一种可扩展标记语言,样子和html很像,功能更专注于对传输和存储数据

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

上 面的xml内容可以表示为下面的树结构:

xml树结构

2.2 xml和html的区别

二者区别如下图

xml和html的区别

  • html:
    • 超文本标记语言
    • 为了更好的显示数据,侧重点是为了显示
  • xml:
    • 可扩展标记语言
    • 为了传输和存储数据,侧重点是在于数据内容本身

知识点:了解 xml和html的区别

2.3 常用数据解析方法

常用数据解析方法

数据提取-jsonpath模块

知识点
  • 了解 jsonpath模块的使用场景
  • 掌握 jsonpath模块的使用

1. jsonpath模块的使用场景

如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的。jsonpath模块就能解决这个痛点,接下来我们就来学习jsonpath模块

jsonpath 可以按照key对python字典进行批量数据提取


知识点:了解 jsonpath模块的使用场景

2. jsonpath模块的使用方法

2.1 jsonpath模块的安装

jsonpath是第三方模块,需要额外安装

pip install jsonpath

2.2 jsonpath模块提取数据的方法

​ from jsonpath import jsonpath ​ ret = jsonpath(a, 'jsonpath语法规则字符串')

2.3 jsonpath语法规则

jsonpath的方法

2.4 jsonpath使用示例


​ book_dict = { ​ "store": { ​ "book": [ ​ { "category": "reference", ​ "author": "Nigel Rees", ​ "title": "Sayings of the Century", ​ "price": 8.95 ​ }, ​ { "category": "fiction", ​ "author": "Evelyn Waugh", ​ "title": "Sword of Honour", ​ "price": 12.99 ​ }, ​ { "category": "fiction", ​ "author": "Herman Melville", ​ "title": "Moby Dick", ​ "isbn": "0-553-21311-3", ​ "price": 8.99 ​ }, ​ { "category": "fiction", ​ "author": "J. R. R. Tolkien", ​ "title": "The Lord of the Rings", ​ "isbn": "0-395-19395-8", ​ "price": 22.99 ​ } ​ ], ​ "bicycle": { ​ "color": "red", ​ "price": 19.95 ​ } ​ } ​ } ​
​ from jsonpath import jsonpath ​
​ print(jsonpath(book_dict, '$..author')) # 如果取不到将返回False # 返回列表,如果取不到将返回False

jsonpath使用示例

3. jsonpath练习

我们以拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,所有城市的名字的列表,并写入文件。

参考代码:

​ import requests ​ import jsonpath ​ import json

# 拉勾网城市json字符串
url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
headers = {"User-Agent": ""}
response =requests.get(url, headers=headers)
html_str = response.content.decode()
# 把json格式字符串转换成python对象
jsonobj = json.loads(html_str)
# 从根节点开始,所有key为name的值
citylist = jsonpath.jsonpath(jsonobj,'$..name')
# 写入文件
with open('city_name.txt','w') as f:
    content = json.dumps(citylist, ensure_ascii=False)
    f.write(content)

知识点:掌握 jsonpath模块的使用

未完待续 下一期下一章

完整笔记请看文章开头

标签:session,md,进阶,python,jsonpath,模块,requests,data,请求
From: https://blog.51cto.com/u_13578013/8217656

相关文章

  • python3使用sqlite3构建本地持久化缓存
    环境:Windows10_x64python版本:3.9.2sqlite3版本:3.34.0日常python开发中会遇到数据持久化的问题,今天记录下如何使用sqlite3进行数据持久化,并提供示例代码及数据查看工具。一、背景描述python应用程序在运行过程中被kill掉(比如版本升级等情况),内存中的运行数据将会丢失,如果能够......
  • Python 利用pandas和matplotlib绘制双柱状图
    在数据分析和可视化中,常用的一种图形类型是柱状图。柱状图能够清晰地展示不同分类变量的数值,并支持多组数据进行对比。本篇文章将介绍如何使用Python绘制双柱状图。准备工作在开始绘制柱状图之前,需要先安装matplotlib和pandas这两个Python库。可以通过pip安装:pipinstallmatp......
  • 【Python基础练习】实验3:列表、字典、集合
    实验3:列表、字典、集合姓名:萌狼蓝天时间:2023年11月6日Python:3.12博客:https://wwww.mllt.cc实验目的(1)了解列表、元组、字典和集合的概念(2)学习列表、元组、字典和集合对象的创建(3)学习列表、元组、字典和集合函数的使用实验内容及原理1.已有列表lst=[1,2,3,4],lst2=l......
  • python--------------paramiko远程控制模块学习
    importparamikodefsshExeCMD():ssh_client=paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect(hostname="192.168.8.200",port=22,username="root",password="123")stdi......
  • Python 文件处理指南:打开、读取、写入、追加、创建和删除文件
    文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。文件处理在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。有四种不同的方法(模式)可以打开文件:"r"-读取-默认值。打开一个文件以进行读取,如果文......
  • Python 文件处理指南:打开、读取、写入、追加、创建和删除文件
    文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。文件处理在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。有四种不同的方法(模式)可以打开文件:"r"-读取-默认值。打开一个文件以进行读取,如果文......
  • Python50days
    筛选器方法document.getElementById()-------标签对象-------标签jQuery对象$(document.个体、ElementById())----------jQuery对象----------可以使用jQuery对象提供的方法如何把jQuery对象转为标签对象  $===jQuery$()[0]$("#id")===jQuery("#id") 菜单例子 hide—......
  • `Python 2.x` 与 `3​​.x` 版本简介
    目前市场上有两个Python的版本并存着,分别是Python2.x和Python3.x新的Python程序建议使用Python3.0版本的语法Python2.x是过去的版本解释器名称是pythonPython3.x是现在和未来主流的版本解释器名称是python3相对于Python的早期版本,这是一个较大的升级为了不......
  • Python_Flask视图类和蓝图
    Flask视图类1.设置路由的新方法:将URL路径和一个视图类关联将URL路径和一个函数关联,这个函数又被称为视图函数在Flask中,也可以使用类来处理相关的URL,这样的也被称为视图类。使用类视图的好处是支持继承,可以把一些共性的东西放在父类中,其他子类可以继承###......
  • 如何防止用户阅读Python代码?
    内容来自DOChttps://q.houxu6.top/?s=如何防止用户阅读Python代码?我正在使用Python开发一款软件,该软件将被分发给我雇主的客户。我的雇主希望通过受限时许可证文件来限制软件的使用。如果我们分发.py文件或甚至.pyc文件,那么将很容易(反编译和)删除检查许可证文件的代码。另一......