您当前的位置:首页 > 计算机 > 编程开发 > Python

python爬虫第二章:(1)requests模块

时间:11-04来源:作者:点击数:

爬虫(二)requests模块

  • urllib模块
  • requests模块
01.requests基础

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

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

  • 使用流程/编码流程
    • 指定url
    • 基于requests模块发起请求
    • 获取响应对象中的数据值
    • 持久化存储
02.实战编码

1.需求:爬取搜狗主页

import requests

if __name__=="__main__":
    #第一步:指定url
    url='https://www.sogou.com/'

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

    #第二步:发出请求
    #get方法会返回一个响应对象
    response=requests.get(url=url,headers=headers)

    #第三步:获取响应数据,
    #text返回的是字符串形式的响应数据
    page_text=response.text

    #第四步:持久化存储
    with open('搜狗.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    print("爬虫完毕")

2、requests 的巩固练习(实战巩固)

2.1、UA伪装

需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)

  • UA检测
  • UA伪装
#UA:User-Agent(请求载体的身份标识)
#UA伪装:门户用站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器
#说明是一个正常请求,反之,不可以请求

import requests
if __name__=="__main__":
    url='https://www.sogou.com/web?' #https://www.sogou.com/web?query=你好李焕英
    #处理url携带的参数:封装到字典中
    world=input('请输入搜索内容')
    param={
        'query':world
    }
    #UA伪装
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }

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

    page=response.text

    kw=world+'.html'
    with open(kw,'w',encoding='utf-8') as fp:
        fp.write(page)
    print("爬虫完毕")

2.2、post请求(携带了参数),响应json数据

需求:破解百度翻译

  • post请求(携带了参数)
  • 响应数据是一组json数据
import requests
import json
if __name__=="__main__":
    #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/95.0.4638.69 Safari/537.36'
   }
   #post请求参数处理(同get请求一致)
   word=input('请输入一个单词:')
   data={
       'kw':word
   }
    #4.请求发送
   response=requests.post(url=post_url,data=data,headers=headers)
    #5.获取响应数据:json()方法返回的是obj
    #如果确认响应数据是json类型的,才可以使用json()
   page=response.json()
    #持久化存储
   fp=word+'.json'
   filename=open(fp,'w',encoding='utf-8')
   json.dump(page,fp=filename,ensure_ascii=False)



2.3 需求:爬取豆瓣电影分类排行榜

import requests
import json

if __name__=="__main__":
    url='https://movie.douban.com/j/chart/top_list?'
    # 2.UA伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }

    param={
        'type': '4',
        'interval_id': '100:90',
        'action':'',
        'start': '0',
        'limit': '20',
    }

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

    fp=open('xiju.json','w',encoding='utf-8')
    json.dump(list,fp=fp,ensure_ascii=False)
    print('结束')
  • 需求:爬取肯德基餐厅查询
#作业

import requests
import json

if __name__=="__main__":
    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }

    data={
        'cname':'',
        'pid':'',
        'keyword': '郑州',
        'pageIndex': '1',
        'pageSize': '10',
    }

    response=requests.post(url=url,data=data,headers=headers)

    dic=response.text

    with open('kendeji.html','w',encoding='utf-8') as fp:
        fp.write(dic)
    print("结束")

2.4 综合,复杂

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

  • 动态加载数据

  • 首页中对应的企业信息数据是通过ajax动态请求到的

    http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=af4832c505b749dea76e22a193f873c6

    http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=e48046ec68d34d4692abbb6e06373866

只有两个ID值不同

  • 通过对详情页url的观察发现:

    • url的域名都是一样的,只有携带的参数(id)不一样
    • id值可以从首页对应的ajax请求到的json串中获取
    • 域名和id值拼接处一个完整的企业详情页的url
  • 详情页的企业详情数据也是动态加载出来的

    观察后发现:
    -所有的post请求的url都是一样的,只有参数id值是不同

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

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/95.0.4638.69 Safari/537.36'
    }
    id_list=[]  #存储企业的id
    all_data_list=[]    #存储所有的企业详情数据

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

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


    #获取详情页

    post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in id_list:
        data={
            'id': id,
        }

        dic1=requests.post(url=post_url,data=data,headers=headers).json()
        all_data_list.append(dic1)

    fp=open('化妆品.json','w',encoding='utf-8')
    json.dump(all_data_list,fp=fp,ensure_ascii=False)
    print("完成")


方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门