第四章 requests模块

requests模块
- urllib模块(比较旧)
- requests模块

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

如何使用:(requests模块的编码流程)
- 指定url
  - UA伪装
  - 请求参数的处理
- 发起请求
- 获取响应数据
- 持久化存储

环境安装:
pip install requests

实战编码:
- 需求:爬取搜狗首页的页面数据

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
#- 需求:爬取搜狗首页的页面数据
import requests
if __name__ == "__main__":
    #step_1:指定url
    url = 'https://www.sogou.com/'
    #step_2:发起请求
    #get方法会返回一个响应对象
    response = requests.get(url=url)
    #step_3:获取响应数据.text返回的是字符串形式的响应数据
    page_text = response.text
    print(page_text)
    #step_4:持久化存储
    with open('./sogou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据结束!!!')

 

实战巩固
- 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
- UA检测
- UA伪装

#!/usr/bin/env python 
# -*- coding:utf-8 -*-

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

#UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
import requests
if __name__ == "__main__":
    #UA伪装:将对应的User-Agent封装到一个字典中
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    url = 'https://www.sogou.com/web'
    #处理url携带的参数:封装到字典中
    kw = input('enter a word:')
    param = {
        'query':kw
    }
    #对指定的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请求(携带了参数)每输入一个字符对应会发送一个ajax请求(在抓包Network中XHR是ajax的请求包)

- 响应数据是一组json数据  

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
import json
if __name__ == "__main__":
    #1.指定url
    post_url = 'https://fanyi.baidu.com/sug'
    #2.进行UA伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 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()方法返回的是obj一个对象(如果确认响应数据是json类型的,才可以使用json())
    dic_obj = response.json()

    #持久化存储
    fileName = word+'.json'
    fp = open(fileName,'w',encoding='utf-8')
    json.dump(dic_obj,fp=fp,ensure_ascii=False)

    print('over!!!')

 


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

分析:滚轮拖动到底部会有ajxa数据包,发现是get请求 并携带参数,看响应数据content-type:json 所有请求到的是一组json数据

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
import json
if __name__ == "__main__":
  # 1指定url 携带参数用字典封装一下 url = 'https://movie.douban.com/j/chart/top_list'
  # ?号后面的参数封装到字典里 param = { 'type': '24', 'interval_id': '100:90', 'action':'', 'start': '0',#从库中的第几部电影去取 'limit': '20',#一次取出的个数 }
  # 2进行UA伪装 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' }
  # 3请求数据 response = requests.get(url=url,params=param,headers=headers)   # 4获取响应数据 list_data = response.json()   # 5持久化存储 fp = open('./douban.json','w',encoding='utf-8') json.dump(list_data,fp=fp,ensure_ascii=False) print('over!!!')

  

 

- 作业:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据

同豆瓣需求

- 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据


http://125.35.6.84:81/xk/
- 动态加载数据
- 首页中对应的企业信息数据是通过ajax动态请求到的:

http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=e6c1aa332b274282b04659a6ea30430a 

http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=f63f61fe04684c46a016a45eac8754fe
- 通过对 详情页 url的观察发现:

域名:http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp

参数:?id=f63f61fe04684c46a016a45eac8754fe
- url的域名都是一样的,只有携带的参数(id)不一样
- id值可以从首页对应的ajax请求到的json串中获取
- 域名和id值拼接处一个完整的企业对应的详情页的url


- 详情页的企业详情数据也是动态加载出来的:
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- 观察后发现:
- 所有的post请求的url都是一样的,只有参数id值是不同。
- 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import  requests
import json
if __name__ == "__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }
    id_list = []  # 存储企业的id
    all_data_list = []  # 存储所有的企业详情数据
    #批量获取不同企业的id值(首页捕获的ajax请求数据包指定的url)
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    #请求的参数的封装
    for page in range(1,6):
        page = str(page)
        data = {
            'on': 'true',
            'page': page, # 此参数值可以修改分页操作需要动态数据
            'pageSize': '15', # 分页操作
            'productName':'',
            'conditionType': '1',
            'applyname':'',
            'applysn':'',
        }
    # 代码向循环里缩进需要获取每页数据 请求数据 json_ids = requests.post(url=url,headers=headers,data=data).json()
    # 从当前响应数据(自己去请求抓包)中的字典中获取id值,遍历字典list 里面全是字典 for dic in json_ids['list']: id_list.append(dic['ID']) # 取到id值存起来 #获取企业详情数据
  # 指定post url post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
  # 从列表中取出参数id for id in id_list: data = { 'id':id }
     # 循环请求数据 获取企业详情数据 detail_json = requests.post(url=post_url,headers=headers,data=data).json() # print(detail_json,'-------------ending-----------')
     # 把字典数据存储到列表中 all_data_list.append(detail_json) #持久化存储all_data_list fp = open('./allData.json','w',encoding='utf-8') json.dump(all_data_list,fp=fp,ensure_ascii=False) print('over!!!')

  

 

数据解析:
  聚焦爬虫(爬取整张数据的局部)
  正则
  bs4
  xpath

posted @ 2022-05-17 15:55  贰号猿  阅读(54)  评论(0)    收藏  举报