初识Python爬虫-requests模块

写在前言
爬虫简介
协议以及相关信息
requests模块
实战案例

写者有话说

本博客仅供学习交流使用,一些具体步骤操作代码中每一步都有详细注释,因为避免进入法律红线,所以一些具体步骤没有截图,敬请谅解。尊请各位遵守法律法规,谢谢支持!!!

如果需求可访问GitHub查看源项目:PythonRetiple

关于爬虫

  • 在法律中是不被禁止、具有违法风险
  • 爬虫不能干扰被访问网站的正常运营
  • 爬虫不能抓取收到法律保护的特定类型的数据或信息

如何在使用编写爬虫的过程中避免进入局子的厄运呢?

  • 时常的优化自己的程序,避免干扰被访问网站的正常运行
  • 在使用,传播爬取到的数据时,审查抓取到的内容,如果发现了涉及到用户隐私
    商业机密等敏感内容需要及时停止爬取或传播

爬虫简介

  • 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程

爬虫在场景中的分类

  • 通用爬虫
    抓取系统的重要组成部分,抓取的是一整张页面的数据
  • 聚焦爬虫
    是建立在通用爬虫的基础上,抓取的是页面中的的特定的局部内容
  • 增量式爬虫
    检测网站中的数据更新情况,只会抓取网站中最新更新出来的数据

反爬机制

  • 门户网站,通过制定相关的策略或是技术网站,防止爬虫程序进行数据的爬取

反反爬策略

  • 爬虫程序可以通过制定相关的策略或技术手段,破解门户网站中具备的反爬机制,从而获取门户网站中的数据

协议以及相关信息

  • 君子协议,规定了网站中哪些数据可以爬取,哪些数据不能爬取
  • http协议: 服务器和客户端进行数据交互的一种个数

常用请求头信息

  • User-Agent:请求载体的身份标识
  • Connection:请求完毕后,是断开连接开始保持连接

常用响应头信息

  • Content-Type:服务响应回客户端的数据类型

https协议

  • 安全的超文本传输协议(证书密钥加密)

数据加密方式

  • 对称密钥加密
    密钥和密文传输过程中不安全
  • 非对称密钥加密
    效率低;无法保证客户端拿到公钥是服务器端创建的
  • 证书密钥加密
    解决非对称密钥弊端

requests模块

  • python中的原生一款基于网络请求的模块,功能强大,简单便捷,效率高
  • 作用:模拟浏览器发送请求

如何使用(requests模块的编码流程)

  • 指定url
  • 发起请求
  • 获取响应数据
  • 持久化存储

实战案例

需求:爬取百度指定词条对应的搜索结果页面(简易网页采集器)
  • UA检测
  • UA伪装
import requests

# UA伪装

# User-Agent:请求载体的身份标识
# UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到某一载体身份标识为浏览器
# 说明请求为一个正常的请求,如果检测到请求的载体身份标识不是基于一款浏览器,则表示为不正常请求,服务器端可能会拒绝请求

# 即要建立UA伪装:让爬虫对应的请求载体身份标识伪装为一筐浏览器
# UA检测:反爬策略
# UA伪装:反反爬机制
if __name__ == "__main__":

    # UA伪装:将对应的User-Agent封装到一个字典中
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }
    #1、指定url
    url = 'https://www.baidu.com/s'
    #2、处理url所携带的参数,封装到字典中
    kw = input('enter a word:')
    param = {
        'wd':kw
    }

    #2、对指定的url发起请求,对应的url是携带参数的,且请求过程中处理了参数
    response = requests.get(url=url, params=param, headers=headers)

    page_text = response.text
    fileName = kw + '.html'
    with open(fileName, 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName, '保存成功!!!')

需求:破解百度翻译
  • post请求(携带了参数)
  • 响应数据是一组json数据
import requests
import json

if __name__ == "__main__":
    # 1、指定URL,注意这里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/86.0.4240.198 Safari/537.36'
    }
    #3、 post请求参数处理(同get一样)
    word = input('enter a word:')

    data = {
        'kw':word
    }
    # 4、发起请求
    response = requests.post(url=post_url, data=data, headers=headers)
    # 5、获取响应数据(这里注意响应数据是json格式,json()返回的是obj,如果确认响应数据时json类型的才可以用 )
    dic_obj = response.json()

    # 6、持久化存储
    fileName = word + '.json'
    fp = open(fileName, 'w', encoding='utf-8')
    # 因为拿到json字符串中有中文,中文不能使用ACSII编码
    json.dump(dic_obj, fp=fp, ensure_ascii=False)

    print('over!!!')

需求:爬虫豆瓣电影分类排行榜https://movie.douban.com中的电影详情数据
import requests
import json


if __name__ == "__main__":
    url = 'https://movie.douban.com/j/chart/top_list'

    param = {
        'type':'24',
        '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/86.0.4240.198 Safari/537.36'
    }

    response = requests.get(url=url, params=param, headers=headers)

    list_data = response.json()

    fp = open('./电影.json', 'w', encoding='utf-8')
    json.dump(list_data, fp=fp, ensure_ascii=False)
    print('over!!!')
需求:爬取肯德基餐厅查询中指定的餐厅数量
需求:爬取国家药品监督管理总局基于中华人民共和国化妆品生产许可证相关数据
  • 爬取企业详情信息(http://scxk.nmpa.gov.cn:81/xk/)

  • 此时输入上述url响应信息为:每一个ID对应一个企业详情页数据

  • id可以从首页对应的Ajax请求到的json串中获取
    在这里插入图片描述

  • 点击一个企业进入企业详情数据页(http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=a6ede67d58d74c93b6e054f3d1a78b80)

  • 域名和id拼接出完整企业对应详情的url

  • 上述url参数对应上述ID,此时响应信息如下,即为企业详情数据json对象
    在这里插入图片描述

  • 动态加载数据

  • 首页中对应的企业数据是通过Ajax请求得到的

  • 通过对详情页的观察,url的域名都是一样的,只有携带的参数(id)不同

  • 详情页的企业详情数据也是通过动态加载的

  • 所有的post请求url是相同的,只有参数id是不同的

  • 我们可以批量获取多家企业的id后,就可以将id’和url形成一个完整的详情页对应数据的Ajax请求的url

  • 通过url请求、通过动态加载、通过Ajax请求

import requests
import json


if __name__ == "__main__":
    # 1、批量获取不同企业的id值
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'

    # 2、进行 UA伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }

    # 5、存储企业id
    id_list = []
    # 存储所有企业详情数据
    all_data_lst = []

    # 2、参数的封装
    for page in range(1, 16):
        page = str(page)
        data = {
            'on': 'true',
            'page': page,
            'pageSize': '15',
            'productName': ' ',
            'conditionType': '1',
            'applyname': ' ',
            'applysn': ' '
        }
        # 3、发起请求
        response = requests.post(url=url, data=data, headers=headers)
        # 4、获取响应数据
        json_ids = response.json()
        for dic in json_ids['list']:
            id_list.append(dic['ID'])

    post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    # 6、获取企业详情数据
    for id in id_list:
        data = {
            'id':id
        }
        # 获取企业详情数据
        detail_json = requests.post(url=post_url, data=data, headers=headers).json()
        all_data_lst.append(detail_json)

    # 7、持久化存储
    fp = open('./allData.json', 'w', encoding='utf-8')
    json.dump(all_data_lst, fp=fp, ensure_ascii=False)
    print('over!!!')

你可能感兴趣的:(初识Python爬虫-requests模块)