Python网络爬虫(requests模块应用1)

一、什么是requests模块?

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

二、为什么要使用requests模块

  • 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
    • 手动处理url编码
    • 手动处理post请求参数
    • 处理cookie和代理操作繁琐
    • ......
  • 使用requests模块:
    • 自动处理url编码
    • 自动处理post请求参数
    • 简化cookie和代理操作
    • ......

三、如何使用requests模块

  • 安装:
    • pip install requests
  • 使用流程
    • 指定url
    • 基于requests模块发起请求
    • 获取响应对象中的数据值
    • 持久化存储

四、基于requests模块ajax的get请求实例(豆瓣电影评分)

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

# 爬去电影详细内容
import requests

# 设置网页请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"
}

# 请求网址
url = "https://movie.douban.com/j/chart/top_list"

# 获取前10页内容
for i in range(10):
    params = {
        'type': '5',
        'interval_id': '100:90',
        'action': '',
        'start': '0',
        'limit': str(i*20)
    }

    # 返回请求结果
    res_json = requests.get(url=url, params=params, headers=headers).json()

    for res in res_json:
        print(res["title"], res["rating"][0])

五、基于requests模块ajax的post请求(肯德基餐厅数据)

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

import requests

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

url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"

city = input("请输入城市?")

for page in range(10):
    data = {
        'cname': '',
        'pid': '',
        'keyword': city,
        'pageIndex': page,
        'pageSize': '10',
    }
    
    # 获取网页信息
    res_json = requests.post(url=url, data=data, headers=headers).json()
    
    for res in res_json["Table1"]:
        detail_dict = {
            "storeName": res["storeName"],
            "addrs": res["addressDetail"]
        }
        print(detail_dict)

六、基于requests模块请求(图片存取的两种方式)

  需求:图片地址:https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg

  6.1 通过request获取图片,可以设置UA进行伪装

# 方式一:

import requests

# 图片url
url = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg"

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

res = requests.get(url, headers=headers).content
# print(res)

# 保存图片
with open("1.jpg", "wb") as fp:
    fp.write(res)

  6.2 通过urllib获取图片

# 方式二:

from urllib import request

# 图片url
url = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg"

# 保存图片
res = request.urlretrieve(url, filename="./2.jpg")

七、基于requests模块综合练习(国家药监局)

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

import requests
from fake_useragent import UserAgent

ua = UserAgent(use_cache_server=False,verify_ssl=False).random
headers = {
    'User-Agent':ua
}

url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
pageNum = 3
for page in range(3,5):
    data = {
        'on': 'true',
        'page': str(page),
        'pageSize': '15',
        'productName':'',
        'conditionType': '1',
        'applyname':'',
        'applysn':''
    }
    json_text = requests.post(url=url,data=data,headers=headers).json()
    all_id_list = []
    for dict in json_text['list']:
        id = dict['ID']#用于二级页面数据获取
        #下列详情信息可以在二级页面中获取
        # name = dict['EPS_NAME']
        # product = dict['PRODUCT_SN']
        # man_name = dict['QF_MANAGER_NAME']
        # d1 = dict['XC_DATE']
        # d2 = dict['XK_DATE']
        all_id_list.append(id)
    #该url是一个ajax的post请求
    post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in  all_id_list:
        post_data = {
            'id':id
        }
        response = requests.post(url=post_url,data=post_data,headers=headers)
        #该请求响应回来的数据有两个,一个是基于text,一个是基于json的,所以可以根据content-type,来获取指定的响应数据
        if response.headers['Content-Type'] == 'application/json;charset=UTF-8':
            #print(response.json())
            #进行json解析
            json_text = response.json()
            print(json_text['businessPerson'])
方式一

  方式二:

import json

import requests


def get_url_id(url, headers):
    # 网页ID列表
    id_list = []

    # 爬取5页数据
    for page in range(5):
        data = {
            'on': 'true',
            'page': str(page),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': ''
        }

        # 获取所有的数据
        res_dict = requests.post(url=url, data=data, headers=headers).json()
        for res in res_dict["list"]:
            id_list.append(res["ID"])

    # 返回id列表,里面存放所有详情页id
    return id_list


# 获取详情页信息
def get_detail(url, headers, id_list):
    # 遍历id列表
    for id in id_list:
        data = {'id': id}
        res_dict = requests.post(url=url, headers=headers, data=data).json()
        content = {
            "epsName": res_dict.get("epsName"),
            "businessPerson": res_dict.get("businessPerson")
        }

        print(content)

        # 保存内容到文件
        f = open("detail.txt", encoding="utf-8", mode="a")
        json.dump(content, f, ensure_ascii=False)

      #with open('detail.json','w',encoding='utf-8') as fp:
      # json.dump作用:
      # 将字典、列表dump成满足json格式的字符串
      #json.dump(data,fp,ensure_ascii=False)

if __name__ == '__main__':
    # 获取网页ID
    id_url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
    # 网页详情
    detail_url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"

    # 请求头信息
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"
    }

    # 获取id列表
    id_list = get_url_id(id_url, headers)
    # 获取详情内容更
    get_detail(detail_url, headers, id_list)

 

posted @ 2019-08-01 20:32  Amorphous  阅读(438)  评论(0编辑  收藏  举报