python爬虫学习D.2 网络请求Requests模块

一、requests简介

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

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

环境安装:
pip install requests

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

import requests
#step1:指定url
url = 'https://www.sogou.com/'
#step2:发起请求(get方法会返回一个响应对象)
response = requests.get(url=url)
#step3:获取响应数据(.text返回的是字符串形式的响应数据)
page_text = response.text
#step4:持久化存储
with open('./sougou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
print('爬取数据结束!!!')

UA检测(User-Agent):门户网站的服务器会检测请求的载体身份表示,如果检测到的请求载体身份标识为某一款浏览器,那么说明是一个正常请求;否则怀疑是爬虫,会拒绝你的访问。
UA伪装(User-Agent):让爬虫对应的请求载体身份标识为一款浏览器

二、案例

2.1巩固案例之简易网页采集器

import requests
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
#step1:指定url
url = 'https://www.douban.com/search?'
    #处理url携带的参数:封装到字典中
kw = input('请输入关键词::')
param={
    'q':kw
}
#step2:发起请求(此处对应的url是携带参数的,并且请求过程中处理了参数)
response = requests.get(url=url,params=param,headers=headers)
#step3:获取响应数据(.text返回的是字符串形式的响应数据)
page_text = response.text
#step4:持久化存储
filename = kw+'.html'
with open(filename,'w',encoding='utf-8') as fp:
    fp.write(page_text)
print(filename+'保存成功!')

2.2、巩固案例之破解百度翻译

	-百度翻译结果是局部刷新(未进行主动刷新操作)的,需要查看Ajax请求;
	-post请求(携带了参数)
	-响应数据是一组json数据

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/79.0.3945.88 Safari/537.36'
}
#3.post请求参数处理(同get请求一致)
word = input('请输入要查询的单词:')
data = {
    'kw':word
}
#4.请求发送
response = requests.post(url=post_url,data=data,headers=headers)
#5.获取响应数据:json()方法返回的是obj(对象);
'''
如果确认响应数据 是json类型的,才可以使用json()
Cache-Control: no-cache, private
Content-Encoding: gzip
Content-Length: 56
Content-Type: application/json
Date: Thu, 27 May 2021 20:10:09 GMT
Server: Apache
Tracecode: 06093780840615616522052804
Vary: Accept-Encoding
'''

dic_obj = response.json()
print(dic_obj)

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

print('over!!')

2.3、巩固案例之获取豆瓣电影详情数据

import requests
import json

url='https://movie.douban.com/j/chart/top_list'
param={
    'type':'24',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'1',
}

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

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

fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over!!')

>>>D:\SoftwareSpace\python\python.exe D:/WorkSpace/pycharm/爬虫练习/03requsts之获取豆瓣电影详情数据.py
[{'rating': ['9.6', '50'], 'rank': 1, 'cover_url': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg', 'is_playable': True, 'id': '1292063', 'types': ['剧情', '喜剧', '爱情', '战争'], 'regions': ['意大利'], 'title': '美丽人生', 'url': 'https://movie.douban.com/subject/1292063/', 'release_date': '2020-01-03', 'actor_count': 29, 'vote_count': 1092769, 'score': '9.6', 'actors': ['罗伯托·贝尼尼', '尼可莱塔·布拉斯基', '乔治·坎塔里尼', '朱斯蒂诺·杜拉诺', '赛尔乔·比尼·布斯特里克', '玛丽萨·帕雷德斯', '霍斯特·布赫霍尔茨', '利迪娅·阿方西', '朱利亚娜·洛约迪切', '亚美利哥·丰塔尼', '彼得·德·席尔瓦', '弗朗西斯·古佐', '拉法埃拉·莱博罗尼', '克劳迪奥·阿方西', '吉尔·巴罗尼', '马西莫·比安奇', '恩尼奥·孔萨尔维', '吉安卡尔洛·科森蒂诺', '阿伦·克雷格', '汉尼斯·赫尔曼', '弗兰科·梅斯科利尼', '安东尼奥·普雷斯特', '吉娜·诺维勒', '理查德·塞梅尔', '安德烈提多娜', '迪尔克·范登贝格', '奥梅罗·安东努蒂', '沈晓谦', '张欣'], 'is_watched': False}]
over!!

Process finished with exit code 0

2.4巩固案例之爬取肯德基餐厅查询中指定地点的餐厅数量

import requests

url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
add = input('请输入需要查询的地点:')

def Num():
    global num
    param = {
        'cname': add,
        'pid': '',
        'pageIndex': '1',
        'pageSize': '10',
    }
    response = requests.post(url=url, params=param, headers=headers)
    data = eval(response.text)
    num= data['Table'][0]['rowcount']
while True:
    num=0
    Num()
    if num >= 1:
        print(f'该地肯德基餐厅的数量为:{num}。')
        add = input('请输入需要查询的地点:')
        Num()
        continue
    else:
        add=input('抱歉,未找到相关搜索结果,请重新搜索:')
        Num()
        continue

2.5综合案例之爬取药监局数据

关键点1:当前url获取的数据可能并没有我们所需要的,有可能是动态加载出来的,可以由两个方式验证:
**1.**将该url页面截取下来,保存成.html格式,再通过浏览器打开,查看是否包含目标数据

import requests
url = 'http://scxk.nmpa.gov.cn:81/xk/'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
page_text = requests.get(url=url,  headers=headers).text
with open('./huazhuangpin.html','w',encoding='utf-8') as fp:
 fp.write(page_text)

**2.**按F12使用抓包工具,查看Network,Name为/xk的Response,查看是否有目标数据(可按Ctrl+R快捷查找)

关键点2:通过对详情页url的观察发现:url的域名都是一样的,只有携带的参数(id)不一样

import requests
import json

#step1:获取不同企业的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/79.0.3945.88 Safari/537.36'
}
list_id=[]#存储所有ID
for i in range(0,2):
    param = {
        'on':'true',
        'page':i,
        'pageSize':'15',
        'productName':'',
        'conditionType':'1',
        'applyname':'',
        'applysn':'',
    }
    json_ids = requests.post(url=url,params=param,headers=headers).json()
    for dic in json_ids['list']:
        list_id.append(dic['ID'])

#step2:获取企业详情
post_url ='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
all_data_list = []#存储所有企业详情信息
for id1 in list_id:
    data ={
        'id': id1
    }
    detail_json = requests.post(url=post_url,params=data,headers=headers).json()
    all_data_list.append(detail_json)

fp = open('./化妆品公司详情.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值