Python爬虫从入门到进阶(一)— requests模块的基本使用

一、准备工作

0、爬虫的分类:

  • 通用爬虫:爬取整张页面;

  • 聚焦爬虫:爬取页面中指定的页面内容,需要用到数据解析(75%以上的需求都是需要用到聚焦爬虫);

  • 增量爬虫:

1、首先得要具备的基础知识:

  • Python基础;

  • IDE(Pycharm等)的使用;

  • pip工具的使用;

    • pip国内镜像源的安装:

    1. 在资源浏览器输入 %appdata%,进入;

    2. 创建一个pip.ini文件:

    [global]
    timeout = 6000
    index-url=http://mirrors.aliyun.com/pypi/simple/
    trusted-host=mirrors.aliyun.com
  • http(https)协议的基础知识;

2、Python中涉及到网络请求的两个模块:

  • urllib模块:有点过时,操作有点麻烦;

  • requests模块:用法简洁,高效;

    • Python中原生的一款网络请求模块,功能非常强大,简单便捷,效率极高;

    • 作用:模拟浏览器发请求(爬虫的核心思想)。

3、requests模块如何使用?

  • 指定url

  • 发起请求

  • 获取响应数据

  • 持久化存储

4、requests模块的安装

# 安装
pip install requests

最简单使用demo:

# 标准四步,爬取sogou首页数据
import requests

if __name__ == '__main__':
    # 1、指定url
    url = "https://www.sogou.com"
    
    # 2、发起请求,get请求会返回一个响应对象response
    response = requests.get(url=url)
    
    # 3、获取响应数据,text返回的是字符串形式的响应数据
    page_text = response.text
    
    # 4、持久化存储,以最简单的文件的方式存储在本地
    with open('./sogou.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据结束...')


二、实战小功能案例

1、UA伪装 — 简易网页采集器:

  • UA:User Agent;

  • UA检测:很多网站的服务器会检测对应请求的载体的身份标识,如果UA为某一款浏览器,那么服务器就认为这是一个正常的浏览器请求,如果发现UA不是任一款浏览器,那么可能就认为这不是正常请求,来自于爬虫,可能就会让我们的请求失败;

  • UA伪装:让爬虫对应的请求载体中的UA伪装成某一款浏览器;

import requests
if __name__ == '__main__':
    # UA伪装,将伪装的UA信息,封装在一个字典(Dict 类似于Java中的Map)中
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
    }
    
    # 1、封装url (https://www.sogou.com/web?query=吉桂权)
    url = 'https://www.sogou.com/web'
    # 准备url中需要的query参数,封装到字典中:
    kw = input('请输入您要查询的关键字:')
    params = {
        'query':kw
    }
    
    # 2、发起请求
    response = requests.get(url=url, params=params, headers=headers)
    
    # 3、获得响应数据
    page_text = response.text
    
    # 4、数据的后期处理,直接存储在本地文件
    fileName = './output/' + kw+'.html'
    with open(fileName, 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName, '保存成功...')

小功能测试就不贴图了!(●'◡'●)

2、破解百度翻译:

通过浏览器F12分析,我们可以知道百度翻译每一次翻译,是发送的一次AJAX_POST请求,请求的响应体为json格式的数据;

import requests
import json

if __name__ == '__main__':
    # UA伪装
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
    }
    
    # 1、封装url (https://fanyi.baidu.com/sug)
    url = 'https://fanyi.baidu.com/sug'
    # 准备post数据体
    kw = input('请输入您要翻译的内容:')
    data = {
        'kw': kw
    }
    
    # 2、发送post请求
    response = requests.post(url=url, data=data, headers=headers)
    
    # 3、获得响应数据,判断是否为json格式的数据
    if 'application/json' == response.headers['Content-Type']:
        resp_obj = response.json()
        
        # 4、对数据进行处理,存储到本地的json文件中
        fileName = './output/' + kw + '.json'
        with open(fileName, 'w', encoding='utf-8') as fp:
            json.dump(resp_obj, fp, ensure_ascii=False)
        print(kw, '翻译完成...')

此等小功能测试也不用贴图了吧!O(∩_∩)O

3、豆瓣电影排行榜——以喜剧电影为例:

同样的,我们还是要到浏览器上分析一下方案,发现豆瓣电影排行榜是以AJAX_GET的方式,分页懒加载获取数据的,数据返回体依然为JSON

image.png

话不多说,直接coding:

import requests
import json
if __name__ == '__main__':
    # UA伪装
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
    }
    # 1、封装url (https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=20&limit=20)
    url = 'https://movie.douban.com/j/chart/top_list'
    # 准备post数据体
    params = {
        'type': '24',
        'interval_id': '100:90',
        'action': '',
        'start': '0',
        'limit': '20'
    }

    # 2、发送post请求
    response = requests.get(url=url, params=params, headers=headers)

    # 3、获得响应数据,判断是否为json格式的数据
    resp_obj = response.json()
    print(resp_obj)

    # 4、对数据进行处理,存储到本地的json文件中
    fileName = './output/豆瓣.json'
    with open(fileName, 'w', encoding='utf-8') as fp:
        json.dump(resp_obj, fp, ensure_ascii=False)
    print('抓取豆瓣电影排行榜完成...')

执行结果‘豆瓣.json’:

image.png

没有问题!( ̄▽ ̄)"

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐