zoukankan      html  css  js  c++  java
  • 爬虫之requests模块基础

    一、request模块介绍

    1. 什么是request模块

       - python中原生的基于网络请求的模块,模拟浏览器发起请求。

    2. 为什么使用request模块

       - urllib需要手动处理url编码,quote()。
       - urllib需要手动处理post请求参数。
       - cookie的代理操作比较繁琐
           1. cookie
               - 创建一个cookiejar对象
               - 创建一个handler对象
               - 创建一个openner
           2. 代理
               - 创建handler对象,代理ip和端口分装到该对象
               - 创建openner对象

    3. request如何被使用

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

    3.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固

       - get请求
       - post请求
       - 基于ajax的get请求
       - 基于ajax的post请求
       - 综合项目

    二、项目实战

    3. 基于request模块发起一个get请求

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

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

    response对象中其他重要的属性

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

    4. 携带参数的get请求方式1

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

    5. 携带参数的get请求方式2

    import requests
    
    url = 'https://www.sogou.com/web'
    
    # 将参数封装到字典中
    params = {
        'query':'周杰伦',
        'ie':'utf-8',
    }
    
    requests.get(url=url,params=params)
    
    print(response.text)

    6. 自定义请求头信息

    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_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    
    response = requests.get(url=url,params=params,headers=headers)
    
    print(response.status_code)

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

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

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

    8. 基于Ajax的get请求

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

    import requests
    
    url =  'https://movie.douban.com/j/chart/top_list?'
    
    # 封装ajax的get请求中携带的参数(系统自带的抓包工具下面的Query String)
    params = {
        'type': '13',
        'interval_id': '100:90',
        'action':'', 
        'start': '100',
        'limit': '20',
    }
    
    # 自定义请求头信息
    headers =  {
         'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    
    
    response = requests.get(url=url,params=params,headers=headers)
    
    print(response.text)

    9. 基于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_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    
    # 2. 发起基于ajax的post请求
    response = requests.post(url=post_url,headers=headers,data=data)
    
    print(response.text)

    总结:普通的get和post的请求一般从地址栏获取url。ajax是一个局部刷新的异步请求,我们不能从地址栏获取ajax的url,要借助抓包工具获取地址。

    10. 综合项目实战

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

    import requests
    import os
    
    # 创建一个文件夹
    if not os.path.exists('./pages'):
        os.mkdir('./pages')
    
    word = input('enter a word:')
    
    # 动态指定页码的范围
    start_page_number = int(input('enter a start page number'))
    end_page_number = int(input('enter a end page nunber'))
    
    # 自定义请求头信息
    headers =  {
         'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    
    # 1. 指定url:设计成一个具有通用的url
    url = 'https://zhihu.sogou.com/zhihu'
    for page in range(start_page_number,end_page_number + 1):
        params =  {
            'query':word,
            'page':page,
            'ie':'utf-8',
        }
        response = requests.get(url=url,params=params,headers=headers)
        
        # 获取响应中的页面数据(指定页码(page))
        page_text = response.text
        
        # 持久化存储
        file_name = word + str(page) + '.html'
        file_path = 'pages/' + file_name
        with open(file_path,'w',encoding='utf-8') as fp:
            fp.write(page_text)
            print(f'第{page}页数据写入成功')
  • 相关阅读:
    源代码的下载和编译
    搭建Android开发环境
    Git使用入门
    Android系统构架
    Android深度探索心得<9>
    Android深度探索心得<10>
    Android深度探索心得<8>
    android深度探索xinde < 7>
    android深度探索xinde < 5>
    android深度探索xinde < 6>
  • 原文地址:https://www.cnblogs.com/lshedward/p/10647236.html
Copyright © 2011-2022 走看看