文章目录
- 前言
- 一、JSON数据解析
- 二、request模块的基本使用
- 三、requests 进阶
前言
这里会分条依次讲解各个板块的知识
一、JSON数据解析
json库的使用
在 Python 中,可以使用 json 库对 JSON 数据进行编解码。包含了四个函数:
①dumps 方法:
Python 数据结构转换为 JSON:
import json data = { 'name' : 'ruci', 'key' : 12, 'url' : 'http://127.0.0.1:8080/' } json_str = json.dumps(data) print ("JSON 对象:", json_str)
输出:
JSON 对象: {"name": "ruci", "key": 12, "url": "http://127.0.0.1:8080/"}
②loads 方法:
可以将一个 JSON 编码的字符串转换回一个 Python 数据结构,并取指定的值:
b=json.loads(json_str) # json_str 为上文的 JSON 对象,这里将其转换为了字典格式 print ("b['name']: ", b['name']) # 通过字典取值 print ("b['url']: ", b['url']) # 通过字典取值
输出:
b['name']: ruci b['url']: http://127.0.0.1:8080/
一些网页数据为 JSON 格式,爬取下来后,通常需要将其转化为字典格式,然后提取所需信息。
③dump 方法和④ load 方法
以上演示的是处理字符串,如果 JSON 数据保存在文件里,你可以使用 json.dump() 和 json.load() 来编码和解码 JSON 数据:
data = { 'name' : 'ruci', 'key' : 12, 'url' : 'http://127.0.0.1:8080/' } # 将字典写入 JSON 文件 with open('data.json', 'w') as f: json.dump(data, f) # 读取文件中的 JSON 数据 with open('data.json', 'r') as f: data = json.load(f) print(data)
以上代码演示了如何生成和读取 JSON 数据文件。
执行结果为:
{'name': 'ruci', 'key': 12, 'url': 'http://127.0.0.1:8080/'}
编程作业(一):
完善函数save_data(),使其实现如下功能:
- 能调用函数 request_sess()获取网页的 JSON 数据,再将 JSON 数据转换为 Python 的字典格式;
- 输出 JSON 数据中的 key 值为 code 对应的数据;
- 将爬取下来的 JSON 数据保存到本地,文件保存路径为参数 path。
参考代码如下:
import urllib.request from lxml import etree import http.cookiejar import json
def request_sess(url,headers): cj=http.cookiejar.CookieJar() opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) request = urllib.request.Request(url=url, headers=headers) r=opener.open(fullurl=request) html = r.read().decode('utf-8') return html
def save_data(path): ''' :param path: 文件保存路径 :return: 无 ''' url='http://127.0.0.1:8080/index' headers={ 'User-Agent':'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36' } # ********** Begin ************** # json_str=request_sess(url,headers) # 输出 JSON 数据中的 key 值为 code 对应的数据 b=json.loads(json_str) print(b['code'])
# 将爬取下来的 JSON 数据保存到本地 with open(path,"w") as f: json.dump(b,f) # ********** End ************** #
输出:
0
保存成功!
二、request模块的基本使用
我们使用 Python 程序,实现通过网页的 url,获得服务器返回的超文本文件,并保存到 txt 文件的功能。
访问 url 的get()和post()方法
当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的 url,例如在地址栏中输入百度搜索网站的首页 url:
https://www.baidu.com/
点击确认后,浏览器将向服务器发出一个对该网页的请求;服务器端收到请求后,会返回该网页的超文本文件,浏览器收到服务器端发来的网页超文本文件后,对其进行解析,然后在窗口中显示该超文本文件对应的网页。如下图所示:
网页对应的超文本文件如下图
Python 提供了 requests 模块用来处理网页的 url,主要有 get() 和 post() 两个方法,分别对应网页的 Get 请求和 Post 请求。get() 和 post() 方法有以下几个参数:
- url:指定请求 URL;
- params:字典类型,指定请求参数,GET 请求时使用;
- data: 字典类型,指定表单信息,常用于发送 POST 请求;
- headers:字典类型,指定请求头;
- proxies:字典类型,指定使用的代理;
- cookies:字典类型,指定 Cookie;
- auth:元组类型,指定登陆时的账号和密码;
- verify:布尔类型,指定请求网站时是否需要进行证书验证,默认为 True,表示需要证书验证,假如不希望进行证书验证,则需要设置为 False;
- timeout:指定超时时间,若超过指定时间没有获得响应,则抛出异常。
这两个方法都会返回一个Response对象,其常用的属性和方法列举如下:
下面给出部分简单使用示例:
import requests url = "http://www.baidu.com" response = requests.get(url) response.status_code # 返回200,表示请求成功 # 返回网页的超文本,等价于response.text response.content.decode("utf-8")
编程作业(二):
根据方法内的提示,在 Begin – End 区域内进行代码补充,利用 requests 模块中的方法,补全spider()函数。该函数将国防科技大学本科招生信息网中录取分数网页抓取下来,并保存在本地,具体要求:
- 正确使用 requests 的相关函数获取指定 url 的内容;
- 将获取的页面内容,写入本地文件,路径及名称为src/step1/nudt.txt。
参考代码:
import requests
# 国防科技大学本科招生信息网中录取分数网页URL: url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html' # 录取分数网页URL
# 请在下面的 Begin-End 之间按照注释中给出的提示编写正确的代码 ########## Begin ########## def spider(): # 将网页内容保存到data f=open("src/step1/nudt.txt","w") response=requests.get(url) #response.status_code #response.content.decode("utf-8") data=response.text # 2.将data写入“nudt.txt”文件中 f.write(data) f.close() ########## End ##########
输出:
结果正确
三、requests 进阶
cookie的使用
当你浏览某网站时,Web 服务器会修改修改你电脑上的 Cookies 文件,它是一个非常小的文本文件,可以记录你的用户 ID 、密码、浏览过的网页、停留的时间等信息。 当你再次来到该网站时,网站通过读取 Cookies 文件,得知你的相关信息,从而做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入 ID、密码就直接登录等等。
下面演示如何在 requests 中使用 Cookies, 以百度搜索为例,在开发者工具查看请求头信息如下:
方法一
将得到的 Cookies 信息写入请求头,模拟 GET 请求:
header = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/' '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36', "Cookie": "BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; " "PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR" "VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; " "H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; " "H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0" } response = requests.get(url=url, headers=header)
方法二(不推荐)
也可将 cookie 写成字典的形式,传入请求方法中:
cookies = {"BAIDUID": "53B7CC4BFCDC39D2EF625C13D285429D:FG=1", "BIDUPSID": "53B7CC4BFCDC39D2EF625C13D285429D", "PSTM": "1591665716", "BD_UPN": "12314753", "sug": "3", "sugstore": "1", "ORIGIN": "0", "bdime": "0", "H_PS_PSSID": "1456_31672_32139_31253_32046_32230_31708_32295_26350_22160", "delPer": "0", " BD_CK_SAM": "1", "PSINO": "6", "H_PS_645EC": "3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs", "BDSVRTM": "0", "BDUSS": "2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmRVFBQUFBJCQ" "AAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D" "22BCDA1598", } response = requests.get(url=url, headers=header, cookies=cookies)
session 的使用
http 协议是无状态的,也就是每个请求都是独立的。那么登录后的一系列动作,都需要用 cookie 来验证身份是否是登录状态,为了高效的管理会话,保持会话,于是就有了 session 。
session 是一种管理用户状态和信息的机制,与 cookies 的不同的是,session 的数据是保存在服务器端。说的明白点就是 session 相当于一个虚拟的浏览器,在这个浏览器上处于一种保持登录的状态。
下面演示如何在 requests 中使用 session。
创建会话的代码如下:
sess = requests.session()
使用会话发出请求提交表单的代码如下:
data = { "name": "XXXXX", "password": "XXXXX", } header = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/' '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36' } response = sess.post(url, headers=header, data=data)
登录成功后,会话会生成 cookie 以及请求头,再次访问网站,直接发出请求即可,代码如下:
response_home = sess.get(url=url)
编程作业(三):
完善函数 get_html(),使用 requests 创建 session 对指定网址发出请求。
import requests
def get_html(url): ''' 两个参数 :param url:统一资源定位符,请求网址 :param headers:请求头 :return html 网页的源码 :return sess 创建的会话 '''
# ***************** Begin ******************** #
# 补充请求头 headers={} # 创建Session, 并使用Session的get请求网页 sess=requests.session().get(url,headers=headers) # 获取网页信息文本 html=sess.text # ****************** End ********************* # return html, sess
输出:
通关成功
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试