欢迎来到赛兔子家园

requests基本使用实例

requests

requests是爬虫中基于网络请求的模块

安装:pip install requests

作用:模拟浏览器发起请求

编码流程:

  1. 指定url
  2. 发起请求
  3. 获取响应数据(爬取到的页面源码数据)
  4. 持久化存储

爬取搜狗首页的页面源码数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: 青城子
# datetime: 2021/7/14 22:13 
# ide: PyCharm

import requests

# 1、指定url
url = "https://www.sogou.com/"
# 2、发起请求get方法的返回值为响应对象
response = requests.get(url=url)
# 3、获取响应数据
# .text:返回的是字符串形式的响应数据
page_text = response.text
# 4、持久化存储
with open("./sougou.html", "w", encoding="utf-8") as fp:
    fp.write(page_text)

实现一个简易网页采集器

基于搜狗针对指定不同的关键字将其对应的页面数据进行爬取

参数动态化:如果请求的url携带参数,且我们想要将携带的参数进行动态化操作:

  1. 将携带的动态参数以键值对的形式封装到一个字典中
  2. 将该字典作用到get方法的params参数中即可
  3. 需要将原始携带参数的url中将携带的参数删除
import requests

key_word = input("请输入搜索关键字:")
headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
}
# 实现参数动态化
params = {
    'query': key_word
}

url = "https://www.sogou.com/web"

# params参数(字典):保存请求时url携带的参数
# 实现UA伪装
response = requests.get(url=url, params=params, headers=headers)
# 修改响应数据的编码格式
# encoding返回的是响应数据的原始的编码格式,如果给其赋值则表示修改了响应数据的编码格式
response.encoding = "utf-8"
page_text = response.text
fileName = key_word + ".html"
with open(fileName, "w", encoding="utf-8") as fp:
    fp.write(page_text)
print(fileName, "爬取完毕")

# 上述出现问题
# 1、乱码
# 2、处理乱码后,页面显示【异常访问请求】导致请求数据的缺失【UA伪装】
# 网站后台已经检测出该次请求不是通过浏览器发起的请求。
# 网站后台是如何知道请求是不是通过浏览器发起的呢?
# 是通过判断请求的请求头中的user-agent判定的
# 什么是User-Agent?请求载体的身份标识
# 什么是请求载体?
# 1、浏览器-->浏览器的身份标识是统一固定,身份标识可以从抓包工具中获取
# 2、爬虫程序-->身份标识是各自不同

需求:爬取豆瓣电影名称+评分

地址:https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=

分析:页面中使用动态加载数据,即ajax异步请求去获取电影数据。使用使用浏览器的开发者工具查找到获取电影数据的url,进行发送请求获取响应,然后找到电影名称+评分。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: 青城子
# datetime: 2021/7/15 19:45 
# ide: PyCharm

import requests

# 豆瓣电影页面url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action="
# 动态加载数据的捕获
# 什么叫动态加载数据?ajax请求

url = "https://movie.douban.com/j/chart/top_list"
params = {
    'type': '5',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '20'
}

headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
}

response = requests.get(url=url, headers=headers, params=params)
# .json()将获取的字符串形式的json数据序列化成字典或者列表对象
page_text = response.json()
# 解析出电影的名称+评分
for movie in page_text:
    name = movie["title"]
    score = movie["score"]
    print(name, score)

分页数据的爬取操作

需求:爬取全广州市肯德基餐厅位置和餐厅名字 。 url:http://www.kfc.com.cn/kfccda/storelist/index.aspx

分析:

  1. 在录入关键字的文本框中输入关键字按下搜索按钮,发起的是一个ajax请求。所以当前页面刷新出来的位置信息一定是通过ajax请求到的数据,
  2. 基于浏览器中开发者工具定位到该ajax请求的数据包,从该数据包中捕获:请求url、请求方式、请求携带的参数、看到响应数据
  3. 需要处理翻页

爬取第一页的数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: 青城子
# datetime: 2021/7/15 22:40 
# ide: PyCharm

import requests

# 爬取第一页的数据
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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
}
# data参数是post方法中处理动态化参数的参数
response = requests.post(url=url, data=data, headers=headers)
page_text = response.json()
for dic in page_text["Table1"]:
    title = dic["storeName"]
    addr = dic["addressDetail"]
    print(title, addr)

爬取全部的数据

import requests
# 翻页爬取全部
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"

for page in range(1, 9):
    data = {
        'cname': '',
        'pid': '',
        'keyword': '广州',
        'pageIndex': str(page),
        'pageSize': '10'
    }

    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    }
    # data参数是post方法中处理动态化参数的参数
    response = requests.post(url=url, data=data, headers=headers)
    page_text = response.json()
    for dic in page_text["Table1"]:
        title = dic["storeName"]
        addr = dic["addressDetail"]
        print(title, addr)

 

posted on 2021-07-14 23:08  赛兔子  阅读(272)  评论(0编辑  收藏  举报

导航