• 爬虫(1):requests模块


    requests介绍:

    reqeusts模块:python原生一个基于网络请求的模块,模拟浏览器发起请求。

    requests模块的优点:

    - 1.自动处理url编码 
    - 2.自动处理post请求的参数
    - 3.简化cookie的代理的操作:
        cookie操作:
        - 创建一个cookiejar对象
        - 创建一个handler对象
        - 创建一个operner
    
        代理操作:
        - 创建handler对象,代理ip和端口封装到该对象
        - 创建openner对象

    reqeusts的使用流程:

    - 安装:pip install  requests
    - 使用流程:
        - 1.指定url
        - 2.使用requests模块发起请求
        - 3.获取响应数据
        - 4.进行持久化存储

     

    requests的使用:

    一、 requests基础用法:

    1. 基于requests模块发起get请求

    需求:爬取搜狗首页的页面数据

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

    response对象其他的属性:

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

    requests 发送携带 参数 的 get 请求:

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

    方式一:

    import requests
    
    url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8'  # 参数直接放到 url 中
    
    response = requests.get(url=url)
    page_text = response.text
    
    with open('./zhou.html','w',encoding='utf-8') as fp:
        fp.write(page_text) 

    方式二:

    import requests
    #自定义请求头信息
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        }
    #指定url
    url = 'https://www.sogou.com/web'
    
    #封装get请求参数;放到一个字典中
    prams = {
        'query':'周杰伦',
        'ie':'utf-8'
    }
    #发起请求
    response = requests.get(url=url,params=param) # 设置 params=param
    
    response.status_code

    自定义请求头信息:

    import requests
    url = 'https://www.sogou.com/web'
    
    #将参数封装到字典中
    params = {
        'query':'周杰伦',
        'ie':'utf-8'
    }
    
    #自定义请求头信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    
    response = requests.get(url=url,params=params,headers=headers)  # 设置 headers=headers 请求头
    
    response.status_code

    2. 基于requests模块发起的post请求:

    需求:登录豆瓣网,获取登录成功后的页面数据

    import requests
    
    #1.指定post请求的url
    url = 'https://accounts.douban.com/login'
    
    #封装post请求的参数;POST请求的请求体信息要放在一个字典中
    data = {
        "source": "movie",
        "redir": "https://movie.douban.com/",
        "form_email": "15027900535",
        "form_password": "bobo@15027900535",
        "login": "登录",
    }
    #自定义请求头信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    
    #2.发起post请求
    response = requests.post(url=url,data=data,headers=headers)  # data=data 设置请求体信息
    
    #3.获取响应对象中的页面数据
    page_text = response.text
    
    #4.持久化操作
    with open('./douban.html','w',encoding='utf-8') as fp:
        fp.write(page_text)

    3.基于 Ajax的GET请求: 

    需求:抓取豆瓣电影上电影详情的数据

    import requests
    
    url = 'https://movie.douban.com/j/chart/top_list?'
    
    #封装ajax的get请求中携带的参数;字典的形式
    params = {
        'type':'5',
        'interval_id':'100:90',
        'action':'',
        'start':'100',
        'limit':'20'
    }
    #自定义请求头信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    
    response = requests.get(url=url,params=params,headers=headers)  # params=params 设置 ajax 请求中携带的参数
    print(response.text)

    4. 基于 ajax的POST请求:

    需求:爬去肯德基城市餐厅位置数据

    import requests
    
    #1指定url
    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 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    
    #2发起基于ajax的post请求
    response = requests.post(url=post_url,headers=headers,data=data)  # data=data 设置 ajax 请求体中的参数
    
    response.text

    5. 综合使用:

    需求:爬取搜狗知乎某一个词条对应一定范围页码表示的页面数据

    import requests
    import os
    
    #创建一个文件夹
    if not os.path.exists('./pages'):
        os.mkdir('./pages')
        
    word = input('enter a word:')  # 动态传入要爬取的词条
    
    #动态指定页码的范围
    start_pageNum = int(input('enter a start pageNum:'))
    end_pageNum = int(input('enter a end pageNum:'))
    
    #自定义请求头信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    #1.指定url:设计成一个具有通用的url
    url = 'https://zhihu.sogou.com/zhihu'
    
    for page in range(start_pageNum,end_pageNum+1):
        param = {
            'query':word,
            'page':page,
            'ie':'utf-8'
        }
        response = requests.get(url=url,params=param,headers=headers)
        
        #获取响应中的页面数据(指定页码(page))
        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('第%d页数据写入成功'%page)

     二、requests模块的高级用法:

     1. reqeusts模块的cookie操作:

    - cookie:
        基于用户的用户数据
        - 需求:爬取张三用户的豆瓣网的个人主页页面数据
    - cookie作用:服务器端使用cookie来记录客户端的状态信息。
    实现流程:
        1.执行登录操作(获取cookie)
        2.在发起个人主页请求时,需要将cookie携带到该请求中
        注意:reqeusts模块的session对象:发送请求(会将cookie对象进行自动存储)

    示例:

    import requests
    
    session = requests.session()  # 利用 requests.session() 去获取到一个 session 对象;该 session 对象能够保存服务器返回给客户端的cookie
    #1.发起登录请求:将cookie获取,切存储到session对象中
    login_url = 'https://accounts.douban.com/login'
    data = {
        "source": "None",
        "redir": "https://www.douban.com/people/185687620/",
        "form_email": "15027900535",
        "form_password": "bobo@15027900535",
        "login": "登录",
    }
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        }
    #使用session发起post请求
    login_response = session.post(url=login_url,data=data,headers=headers)  # 利用 requests 的 session对象 发送 POST请求;通过服务器的校验后该 session对象会保存 cookie
    
    #2.对个人主页发起请求(session(cookie)),获取响应页面数据
    url = 'https://www.douban.com/people/185687620/'
    response = session.get(url=url,headers=headers)  # 利用 session对象 发送 GET请求(携带着cookie)
    page_text = response.text
    
    with open('./douban110.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
        
    # 注意: 爬虫程序应该严格遵从浏览器的请求流程

    2. requests模块的代理操作:

    - 1.代理:第三方代理本体执行相关的事物。生活:代购,微商,中介
    - 2.为什么要使用代理?
        - 很多网站有反爬操作;
        - IP代理是一种反反爬手段
    - 3.分类:
        - 正向代理:代替客户端获取数据 (我们的爬虫用的是 正向代理)
        - 反向代理:代理服务器端提供数据
    - 4.免费代理ip的网站提供商:
        - www.goubanjia.com   (推荐用这个)
        - 快代理
        - 西祠代理

    示例:

    import requests
    
    url = 'http://www.baidu.com/s?ie=utf-8&wd=ip'
    
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        }
    
    #将代理ip封装到字典;代理的协议应该和 url 中的协议一致,如:都是 http
    proxy = { 
        'http':'77.73.69.120:3128'
    }
    #更换网路IP
    response = requests.get(url=url,proxies=proxy,headers=headers)  # proxies=proxy  设置代理
    
    with open('./daili.html','w',encoding='utf-8') as fp:
        fp.write(response.text)
  • 相关阅读:
    String、StringBuffer与StringBuilder之间区别
    关于 hashCode() 你需要了解的 3 件事
    Java基础之 运算符
    Java基础之基础语法
    Java基础之Java 修饰符
    自动化-python介绍与基础
    vue访问本地后台
    vue请求报错Uncaught (in promise)
    使用vue-resource,get、post、jsonp都报未定义的错误。
    【蓝桥杯】历届试题 打印十字图
  • 原文地址:https://www.cnblogs.com/neozheng/p/10160720.html
Copyright © 2020-2023  润新知