zoukankan      html  css  js  c++  java
  • 爬虫--requests模块学习

     

    requests模块

    - 基于如下5点展开requests模块的学习

    • 什么是requests模块
      • requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
    • 为什么要使用requests模块
      • 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
        • 手动处理url编码
        • 手动处理post请求参数
        • 处理cookie和代理操作繁琐
        • ......
      • 使用requests模块:
        • 自动处理url编码
        • 自动处理post请求参数
        • 简化cookie和代理操作
        • ......
    • 如何使用requests模块
      • 安装:
        • pip install requests
      • 使用流程
        • 指定url
        • 基于requests模块发起请求
        • 获取响应对象中的数据值
        • 持久化存储
    • 通过5个基于requests模块的爬虫项目对该模块进行学习和巩固
      • 基于requests模块的get请求
        • 需求:爬取搜狗指定词条搜索后的页面数据
      • 基于requests模块的post请求
        • 需求:登录豆瓣电影,爬取登录成功后的页面数据
      • 基于requests模块ajax的get请求
      • 基于requests模块ajax的post请求
      • 综合练习
        • 需求:爬取搜狗知乎指定词条指定页码下的页面数据
     

    1、基于requests模块的get请求--不带参数

     - 需求:爬取搜狗首页数据

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

     response对象中其他重要的属性

    # response对象中其他重要的属性
    import requests
    # 1.指定url--用于请求的目标网站
    url = 'https://www.sogou.com/'
    # 2.发起一个get请求,get方法会返回 请求成功后的响应对象
    response = requests.get(url=url)
    
    # content获取的是response对象中二进制(byte)类型的页面数据
    #print(response.content)
    
    # 返回一个响应状态码
    #print(response.status_code)
    
    # 返回响应头信息--字典的形式
    #print(response.headers)
    
    # 获取请求的url
    print(response.url)

    - requests模块如何处理携带参数的get请求

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

    # 方式1
    import requests
    # 1指定url
    url = 'https://www.sogou.com/web?query=周杰伦&ie=utf8'  #带参数
    
    # 获取响应对象
    response = requests.get(url=url)
    
    page_text = response.text
    
    # 持久化存储
    with open('./zhou.html','w',encoding='utf-8')as f:
        f.write(page_text)
    -------------------------------------------------------------------------
    # 方式2:
    import requests
    url = 'https://www.sogou.com/web'
    
    # 将参数封装到字典中
    params = {'query':'周杰伦','ie':'utf8'}
    response  = requests.get(url=url,params=params)
    response.status_code
    #print(response.content)
              

    requests--自定义请求头信息

    # 自定义请求头信息
    import requests
    url = 'https://www.sogou.com/web'
    # 将参数封装到字典中
    params = {'query':'周杰伦','ie':'utf8'}
    
    # 自定义请求头信息
    # 此处用的百度的UA
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    

    # 拿到响应对象 response = requests.get(url=url,params=params,headers=headers) response.status_code

    request模块的post请求

     需求:登录豆瓣电影,爬取登录成功后的页面数据---测试成功

     点击登陆后

    ----------------------------------------------------------------------------------------------------------------------------

    ------------------------------------

    import requests
    # 1.指定post请求的url
    url = 'https://accounts.douban.com/login'
    
    # 封装post请求的参数
    data = {

    'source':'movie',
    'redir':'https://movie.douban.com/',
    'form_email':'你的豆瓣邮箱',
    'form_password':'你的登录密码',
    'login':'登录',

     
    }
    # 自定义请求头信息
    # 此处用的百度的UA
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    # 拿到响应对象
    # 2.发起post请求
    response = requests.post(url=url,data=data,headers=headers)
    response.status_code
    
    # 3.获取响应对象的页面数据
    page_text = response.text
    
    # 持久化存储
    with open('./douban.html','w',encoding='utf-8')as f:
        f.write(page_text)


    基于requests模块ajax的get请求

    爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 

    选择一个种类的电影:点击加载更多

    点击加载更多--ajax异步-get请求--局部刷新

    ------------------------

    import requests
    # url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20'
    
     #指定ajax-get请求的url(通过抓包进行获取)
    url = 'https://movie.douban.com/j/search_subjects?'
    
    params = {
    'type':'movie',
    'tag':'热门',
    'sort':'recommend',
    'page_limit':'20',
    'page_start':'20',
    }
    
    # 自定义请求头信息
    # 此处用的百度的UA
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    
    response = requests.get(url=url,params=params,headers=headers)
    
    # 3.获取响应对象的页面数据
    page_text = response.text
    print(page_text)
    ---------------------------------------
    
    

     基于ajax的post请求

    - 爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据

     点击查询是ajax异步请求,局部刷新

    import requests
    
    post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    
    #  处理post请求的参数
    data = {
    'cname':'',
    'pid':'',
    'keyword':'北京',
    'pageIndex':'1',
    'pageSize':'10',
    }
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    
    # 发起基于ajax的post请求
    response = requests.post(url=post_url,data=data,headers=headers)
    
    # 3.获取响应对象的页面数据
    page_text = response.text
    print(page_text)

    综合实战

    需求:爬取搜狗知乎指定词条指定页码下的页面数据
    具有分页的爬取

    http://zhihu.sogou.com/zhihu?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=2&ie=utf8

    ----------------------------------------------

    # 前三页的数据{1,2,3}
    import requests
    import os
    
    # 创建一个文件夹
    if not os.path.exists('./pages'):
        os.mkdir('./pages')
    
    # s搜索词条
    word = input('enter a word')
    
    # 动态指定页码的范围
    start_page = int(input('enter a start pageNum:'))
    end_page = int(input('enter a end pageNum'))
    
    # 1.指定url--设计成一个具有通用的url
    url = 'http://zhihu.sogou.com/zhihu'
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    
    # 循环取页面值 -- page 
    for page in range(start_page,end_page+1):
        params = {'query':word,'page':page,'ie':'utf-8'}
        response = requests.get(url=url,params=params,headers=headers)
        
        # 获取响应中页面数据(指定页码(page))
        page_text = response.text
        
        # 进行持久化处理
        fileName = word+str(page)+'.html'
        filePath = 'pages/'+fileName
        with open(filePath,'w',encoding='utf-8')as f:
            f.write(page_text)
            print(f"第{page}页数据写入成功")
            
        
        
    # get ===>params
    # post===>data

     

  • 相关阅读:
    时间复杂度和空间复杂度的故事
    Go -- 并发编程的两种限速方法
    Go -- type 和断言 interface{}转换
    Go -- 实现二叉搜索树
    Go语言程序的状态监控
    Go -- 中开启gctrace
    Go --- GC优化经验
    Mysql 性能优化20个原则(4)
    Mysql 性能优化20个原则(3)
    查看 activex 组件的方法
  • 原文地址:https://www.cnblogs.com/foremostxl/p/10058903.html
Copyright © 2011-2022 走看看