zoukankan      html  css  js  c++  java
  • request模块

    编辑本随笔

    一、request模块简介

    1. 什么是requests模块
      • python原生基于网络请求的模块,模拟浏览器发起请求。
    2. 为什么使用requests模块
      • urllib需要手动处理url编码,使用quote()处理中文编码
      • urllib需要手动处理post请求的参数,将请求参数封装到字典后用urlencode()处理,在用encode()进行编码
      • urllib的cookie和代理操作比较繁琐
        • cookie:
          • 创建一个cookiejar对象
          • 基于cookiejar创建一个handler对象
          • 基于handler创建一个operner对象
          • 基于operner发起请求
        • 代理:
          • 创建handler对象,代理ip和端口封装到该对象
          • 创建openner对象,并发起请求
    3. requests模块如何使用
      • 安装:pip install requests
      • 使用流程:
        • 指定url
        • 使用requests模块发起请求
        • 获取响应数据
        • 进行持久化存储

    二、基于项目进行学习

    项目一、get请求

    需求:获取sogou主页数据

    import requests
    
    #指定url
    url = "https://www.sogou.com/"
    
    #发起get请求:get方法会返回请求成功后的相应对象
    response = requests.get(url=url)
    
    #获取相应中的数据值
    #text:相应对象中字符串形式的页面数据
    page_data=response.text
    print(page_data)
    
    #持久化操作
    with open("./sogou.html",'w','utf-8') as fp:
        fp.write(page_data)

    response对象中重要属性:

    1. response.content:获取相应对象中二进制类型的页面数据
    2. response.text:字符串形式的页面数据
    3. response.status_code:返回响应状态码
    4. response.headers:获取响应头信息
    5. response.url:获取请求的url

    requests模块带参get请求方式1

    需求:指定一个词条,获取搜狗搜索结果对应的页面数据

    import requests
    
    #指定url,url中携带中文,requests并不需要手动用quote()方法去处理
    url="https://www.sogou.com/web?query=周杰伦&ie=utf8"
    
    #发起get亲求
    response=requests.get(url=rul)
    
    #获取页面数据
    page_text=response.text
    
    #持久化存储
    with open('./sougou_art.html','w',encoding="utf-8") as fp:
        fp.write(page_text)

    requests模块带参get请求方式2

    #方式2,将参数封装到字典中
    import requests
    #指定url
    url="https://www.sogou.com/web"
    
    #将参数封装到字典
    params={
        "query":"周杰伦",
        "ie":"utf-8"
    }
    #发起get亲求
    response = requests.get(url=url,params=params)
    
    #持久化存储
    with open("./sogou.html",'w',encoding='utf-8') as fp:
        fp.write(response.text)

    requests模块自定义请求头的get请求

    #自定义请求头信息
    import requests
    #指定url
    url="https://www.sogou.com/web"
    
    #将参数封装到字典
    params={
        "query":"周杰伦",
        "ie":"utf-8"
    }
    
    #创建headers字典对象
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    }
    
    #发起get请求,并传入headers字典对象
    response=requests.get(url=url,params=params,headers=headers)
    
    response.status_code

    项目二、post请求

    #需求:登陆豆瓣网,获取登陆成功后的页面数据
    
    import requests
    
    #指定url
    url='https://accounts.douban.com/j/mobile/login/basic'
    
    #制定post数据
    data={
        'ck':None, 
        'name':'x@163.com',
        'password':'1111111',
        'remember':'false',
        'ticket':None
    }
    
    #自定义headers[可选]
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    }
    
    #发起post请求
    response=requests.post(url=url,data=data,headers=headers)
    
    #获取相应对象中的页面数据
    page_text=response.text
    
    #持久化保存
    with open('./douban.html','w',encoding='utf-8') as fp:
        fp.write(page_text) 

    项目三、基于ajax的get

    和普通的get请求类似,只是返回结果为json格式字符串

    #需求:抓取豆瓣电影详情
    import requests
    
    #指定url
    url = 'https://movie.douban.com/j/new_search_subjects'
    
    #封装参数
    params={
        'sort': 'U',
        'range': '0,10',
        'tags':'',
        'start': '1',
        'genres': '动画'
    }
    
    #自定义请求头信息
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    }
    
    response=requests.get(url=url,params=params,headers=headers)
    
    print(response.text)

    项目四、基于ajax的post

    和普通的post请求类似

    #需求:爬取肯德基城市餐厅信息
    import requests
    
    #指定url
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    
    #封装查询信息
    data={
        'cname': '重庆',
        'pid': '',
        'keyword': '重庆',
        'pageIndex': '1',
        'pageSize': '10',
    }
    
    #自定义请求头信息
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    }
    
    #发起请求
    response=requests.post(url=url,data=data,headers=headers)
    
    #获取数据结果
    page_text=response.text
    
    print(page_text)

    项目五、综合

    #需求:爬取搜狗知乎某词条搜索结果前三页数据
    import requests
    import os
    
    # 创建文件夹
    if not os.path.exists('./pages'):
        os.mkdir('./pages')
    
    #指定url
    url = 'https://zhihu.sogou.com/zhihu'
    
    #自定义请求头信息
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    }
    
    #指定关键字
    word=input("Enter a search word:")
    
    #动态指定页码的范围
    start_pageNum=int(input("Enter a start pageNum:"))
    end_pageNum=int(input("Enter a end pageNum:"))
    
    for page in range(start_pageNum,end_pageNum+1):
        #指定params
        params={
            "query": word,
            "page": page,
            "ie": "utf8",
        }
        #发起请求
        response=requests.get(url=url,params=params,headers=headers)
        
        #获取响应中的页面数据(指定页码)
        page_text=response.text
        
        #进行持久化存储
        #指定文件名和路径
        fileName=word + str(page)+'.html'
        filePath='./pages/'+fileName
        
        with open(filePath,'w',encoding='utf-8') as fp:
            fp.write(page_text)
            print("第%s页数据获取成功" % page)

  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    [洛谷P4556] 雨天的尾巴
    【转】进程、线程、 GIL全局解释器锁知识点整理
    Python3中的SocketServer
    socket 上传文件代码
    python socket 连续send,出现粘包问题
    【转】动态导入模块的两种方法
    【转】面向对象高级语法部分
    python的垃圾回收机制和析构函数__del__
    django 项目使用setting文件里定义的变量方法
  • 原文地址:https://www.cnblogs.com/yaya625202/p/10366080.html
Copyright © 2011-2022 走看看