python爬虫知识点超详细教程


前言

这里会分条依次讲解各个板块的知识


一、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

输出:
通关成功

猜你喜欢

转载自blog.csdn.net/m0_52423924/article/details/122709677
今日推荐