Python爬虫学习(二)----requests模块基础

目录

    • 引入
    • 什么是requests?
    • 如何使用requests?
      • 环境安装
      • 使用流程
    • 第一个爬虫程序
    • requests案例实战
      • 1.基于requests模块的get请求
      • 2.基于requests模块的post请求
      • 3.基于requests模块ajax的get请求
      • 4.基于requests模块ajax的post请求
      • 5. 综合实战

引入

在python实现的网络爬虫中,用于网络请求发送的模块有两种,第一种为urllib模块,第二种为requests模块。urllib模块是一种比较古老的模块,在使用的过程中较为繁琐和不便。当requests模块出现后,就快速的代替了urllib模块,因此,在我们课程中,推荐大家使用requests模块。

什么是requests?

requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
作用:模拟浏览器发起请求

如何使用requests?

环境安装

pip install requests

使用流程

1、指定url
2、基于requests模块发起请求
3、获取响应对象中的数据值
4、持久化存储

第一个爬虫程序

  • 需求:爬取百度首页
#导包
import requests

#step_1:指定url
url = 'https://www.baidu.com/'
#step_2:发起请求:使用get方法发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=url)
#step_3:获取响应数据:通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
#step_4:持久化存储
with open('./baidu.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
print('爬取数据完毕!!!')

requests案例实战

1.基于requests模块的get请求

  • 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
  • 反爬机制
    • User-Agent:请求载体的身份标识,使用浏览器发起的请求,请求载体的身份标识为浏览器,使用爬虫程序发起的请求,请求载体为爬虫程序。

    • UA检测:相关的门户网站通过检测请求该网站的载体身份来辨别该请求是否为爬虫程序,如果是,则网站数据请求失败。因为正常用户对网站发起的请求的载体一定是基于某一款浏览器,如果网站检测到某一请求载体身份标识不是基于浏览器的,则让其请求失败。因此,UA检测是我们整个课程中遇到的第二种反爬机制,第一种是robots协议。

    • UA伪装:通过修改/伪装爬虫请求的User-Agent来破解UA检测这种反爬机制,具体实现见下属代码:

import requests

# 指定url,原始url可能是https://www.sogou.com/web?query=番茄,发现该url携带了参数
url = 'https://www.sogou.com/web'
# 指定搜索关键字
kw = input('enter word:')
param = {
     
    'query': kw,
}
# 自定义请求头信息:UA伪装,将包含了User-Agent的字典作用到请求方法的headers参数中即可
headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
}
# 发起请求
response = requests.get(url, params=param, headers=headers)
# 获取响应数据
page_text = response.text
# 持久化存储
file_name = kw + '.html'
with open(file_name, 'w', encoding='utf-8') as fp:
    fp.write(page_text)

print('爬取数据结束!!!')

2.基于requests模块的post请求

  • 需求:破解百度翻译
import requests
import json

# 1. 确定url
post_url = 'https://fanyi.baidu.com/sug'
# 2. UA伪装
headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
}
# 3. 处理post请求数据
word = input('enter a word:')
data = {
     
    'kw': word,
}

# 4. 发起请求
response = requests.post(post_url, data=data, headers=headers)
# 5. 获取响应数据:如果响应回来的数据为json,则可以直接调用响应对象的json方法获取json对象数据
json_data = response.json()
# 6. 数据持久化处理
fileName = word + '.json'
fp = open(fileName, 'w', encoding='utf-8')
json.dump(json_data, fp, ensure_ascii=False)

print('over!!!')

3.基于requests模块ajax的get请求

  • 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
import requests
import json
# 确定url
url = 'https://movie.douban.com/j/chart/top_list?'
# 请求参数处理
param = {
     
    'type': '5',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '20'
}
# UA伪装
headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
# 发起请求
response = requests.get(url=url, params=param, headers=headers)
# 数据持久化处理
list_data = response.json()
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)

print('over!!!!')

4.基于requests模块ajax的post请求

  • 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
# _author: 17393
# date: 2020/9/2

import requests
import json

if __name__ == '__main__':
    # 确定url
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    # 处理请求参数
    cityName = input("请输入城市名称:")
    data = {
     
        'cname': '',
        'pid': '',
        'keyword': cityName,
        'pageIndex': '1',
        'pageSize': '10',
    }
    # UA伪装
    header = {
     
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
    }
    # 发起请求
    response = requests.post(url=url, data=data, headers=header)
    # 数据持久化处理
    data_text = response.text
    file = cityName + '.txt'
    with open(file, 'w', encoding='utf-8') as fp:
        fp.write(data_text)
    
    print('over!!!')

5. 综合实战

  • 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://scxk.nmpa.gov.cn:81/xk/
import requests
import json

if __name__ == '__main__':
    # 批量获取不同企业的id值
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    headers = {
     
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
    }
    id_list = []  # 存放所有企业的id
    all_data_list = []  # 存放所有企业的信息

    # 参数封装
    for page in range(1, 3):
        data = {
     
            'on': 'true',
            'page': str(page),
            'pageSize': 15,
            'productName': '',
            'conditionType': 1,
            'applyname': '',
            'applysn': '',
        }

        json_text = requests.post(url=url, headers=headers, data=data).json()
        for dict in json_text['list']:
            id_list.append(dict['ID'])

    post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in id_list:
        data = {
     
            'id': id,
        }
        detail_json = requests.post(url=url, headers=headers, data=data).json()
        all_data_list.append(detail_json)
    fp = open('./allData.json', 'w', encoding='utf-8')
    json.dump(all_data_list, fp=fp, ensure_ascii=False)

    print('over!!!')

你可能感兴趣的:(爬虫学习,爬虫)