• Python-爬虫(基础概念、常见请求模块(urllib、requests))


    1.基础概念

    爬虫:模拟客户端(浏览器)发送网络请求,接收请求返回的响应,一种按照一定的规则,自动地抓取互联网信息的程序.

    爬虫流程:

    1. 获取url。
    2. 向url发送请求,并且获取相应。
    3. 从相应中获取url,并且持续获取相应。
    4. 从响应中提取数据并保存。

    常见的抓取方式

    1. 在网页中我们能看到各种各样的信息,最常见的便是常规网页,它们对应着HTML.代码,而最常抓取的便是HTML源代码。
    2. 有些网页返回的不是HTMIL代码,而是一个JSON字符串(其中API接口大多采用这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便。
    3. 各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。
    4. 还可以看到各种扩展名的文件,如CSS、JavaScript和配置文件等,这些其实也是最普通的文件,只要在浏览器里面可以访问到,就可以将其抓取下来。

    上述内容其实都对应各自的URL,是基于HTTP或HTTPS协议的,只要是这种数据,爬虫都可以抓取。

    有些网页的HTML文本仅为空壳。
    这是一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码就是一个空壳。此时这种情况不能简单的使用HTML库。

    2.测试爬虫流程

    """
    爬虫流程:
    1. 获取url。
    2. 向url发送请求,并且获取相应。
    3. 从相应中获取url,并且持续获取相应。
    4. 从响应中提取数据并保存。
    """
    
    import requests
    
    # 获取url
    url = 'https://www.baidu.com/'
    
    # 向url发送HTTP请求
    response = requests.get(url)
    
    # 从响应中提取数据并保存。
    print(response)  # 
    # print(response.text) 出现乱码
    print(response.content.decode())  # 解决乱码,decode默认utf-8编码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    3.爬虫常见请求模块(uellib、requests

    requets库:基于urllib模块实现。向服务器发送请求库。

    Ⅰurllib

    urllib模块:它是Python内置的HTTP请求库,不需要额外安装即可使用。它包含如下4个模块。(与requests区分开)

    1. request:它是最基本的HTTP请求模块,可以用来模拟发送请求。需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。
    2. error:异常处理模块,如果出现请求错误,可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。
    3. parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等。
    4. robotparser:主要是用来识别网站的 robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,用得比较少。

    使用urllib的 request模块,可以方便地实现请求的发送并得到响应。下面是具体用法。

    urlopen:
    urllib.request模块提供了最基本的构造HITP请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理授权验证(authentication)、重定向(redirection)、浏览器Cookies 以及其他内容。

    使用方法:

    import urllib.request
    
    url = 'https://www.baidu.com/'
    
    response = urllib.request.urlopen(url)
    
    print(response.read().decode('utf-8'))
    
    print(type(response))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    可以看出返回的是一个http客户端相应类。

    这个类有自己的方法,主要包含read、readinto、getheader、getheaders、fileno等方法,和msg、version、status、reason、debuglevel、closed等属性。

    如果需要向请求报文中添加信息,可以修改函数的data参数
    在这里插入图片描述

    注意:
    data参数是可选的。如果要添加该参数,需要使用bytes方法将参数转化为字节流编码格式的内容,即 bytes类型。另外,如果传递了这个参数,则它的请求方式就不再是 GET方式,而是 POST方式。

    Ⅱ requests

    urllib这个库已经很久了,requests库封装了urllib库,使用更简单。基本使用如下图

    import requests
    import webbrowser  # 自动打开网页
    
    key = input('输入查询内容')
    
    print(key)
    
    url = 'https://www.baidu.com/s?wd=' + key
    
    # 系统信息,浏览器信息
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
    }
    
    response = requests.get(url, headers=headers)
    
    html = response.content.decode('utf-8')
    
    with open('baidu-copy.html', 'w', encoding='utf-8') as file:
        file.write(html)
    
    webbrowser.open('baidu-copy.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    其中浏览器信息可以在网页中查找:
    在这里插入图片描述
    注意测试代码时关闭代理服务器

  • 相关阅读:
    python3 多进程讲解 multiprocessing
    九个写 TypeScript 的坏习惯,看看你有没有?
    shell编程4-shell嵌套循环及随机数
    【裴蜀定理】CF1055C Lucky Days
    数据结构--6.0最短路径
    玩转ChatGPT:快速制作PPT
    对分库分表进行批量操作
    机器学习第十二课--营销中的用户分层项目
    JSP Taglib指令具有什么功能呢?
    【微服务】RedisSearch 使用详解
  • 原文地址:https://blog.csdn.net/dodamce/article/details/125966540