requests基础1

爬虫之requests模块

  • 爬虫中一个基于网络请求的模块 pip install requests

  • 作用:模拟浏览器发起请求。

  • 编码流程:

    • 1.指定url
    • 2.发起请求
    • 3.获取相应数据
    • 持久化存储
  • 爬取搜狗首页的页面源码数据

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    import requests
    #1,指定url
    url = 'https://www.sogou.com/'
    #2,发起请求 get方法的返回值为响应对象
    response = requests.get(url=url)
    #3,获取响应数据
    #.text:返回的是字符串形式的响应数据
    page_text = response.text
    #4,持久化存储
    with open('./sougou.html', 'w', encoding='utf-8') as fp : fp.write(page_text)
    
  • 实现一个简易网页采集器

    • 基于搜狗针对指定不同的关键字将其对应的页面数据进行爬取

    • 参数动态化:

      • 如果请求的url携带参数,且我们想要将携带的参数进行动态化操作那么我们必须:

        1. 将携带的动态参数以键值对的形式封装到一个字典中

        2. 将该字典作用到get方法的params参数中即可

        3. 需要将原始携带参数的url中将携带的参数删除

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    keyWord = input('输入关键字:')
    #携带了请求参数的url,如果想要爬取不同关键字对应的页面,我们需要将url携带的参数进行动态化
    #实现参数动态化:
    params = {
        'query': keyWord
    }
    url = 'https://www.sogou.com/web'
    #params参数(字典):抱球请求时url携带的参数
    response = requests.get(url=url, params=params)
    page_text = response.text
    fileName = keyWord+'.html'
    with open(fileName, 'w', encoding='utf-8') as fp: fp.write(page_text)
    print(fileName, '爬取完毕!')
    
    • 上述简易采集器出现的问题:

      • 乱码
      • 数据丢失
    • 解决乱码:

      1. 修改响应数据的编码格式

      2. encoding返回的是相应数据的原始的编码格式,如果给其赋值则表示修改了相应数据的编码格式

      在第9行后插入response.encoding = 'utf-8'

    • 处理乱码后,页面显示[异常访问请求]导致数据丢失。

      • 异常的访问请求
        • 网站后台检测出异常。
      • 网站的后台是如何知道请求是否是通过浏览器发起的?
        • 通关判定请求头中的user-agent
    • 什么是user-agent

      • 请求载体(爬虫,浏览器)的身份标识。浏览器的身份标识是统一固定的,身份标识可以从抓包工具中获取。爬虫程序的身份标识是各自不同的。
  • 第二种反爬机制:

    • UA检测:网站后台会检测请求对应的user-agent,以判定当前请求是否为异常请求
  • 反反爬策略:

    • UA伪装:被作用到了大部分网站中
    • 伪装流程:
      • 从抓包工具中捕获到某一个基于浏览器请求的user-agent的值,将其伪装作用到一个字典中,将该字典作用到请求方法(get,post)的headers参数中即可。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    keyWord = input('输入关键字:')
    headers = {
        'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
    }
    #携带了请求参数的url,如果想要爬取不同关键字对应的页面,我们需要将url携带的参数进行动态化
    #实现参数动态化:
    params = {
        'query': keyWord
    }
    url = 'https://www.sogou.com/web'
    #params参数(字典):抱球请求时url携带的参数
    response = requests.get(url=url, params=params,headers=headers)
    #修改响应数据的编码格式
    #encoding返回的是相应数据的原始的编码格式,如果给其赋值则表示修改了相应数据的编码格式
    response.encoding = 'utf-8'
    page_text = response.text
    fileName = keyWord+'.html'
    with open(fileName, 'w', encoding='utf-8') as fp: fp.write(page_text)
    print(fileName, '爬取完毕!')
    
  • 爬取豆瓣电影中的电影详情数据

    • url:https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=

    • 动态加载数据的捕获

      • 什么叫做动态加载的数据? 我们通过requests模块进行数据爬取无法每次都实现可见即可得。因为有些数据是通过非浏览器地址栏中的url请求到的数据,而是其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据。
    • 如何检测网页中是否存在动态加载数据。

      • 基于抓包工具进行局部搜索。 在当前网页中打开抓包工具,捕获到地址栏的url对应的数据包,在该数据包的response选项卡搜索我们想要爬取的数据,如果搜索到了结果则表示数据不是动态加载的我,否则表示数据为动态加载的。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus