Request 模块
–urlib模块
–requests模块
requests模块:
python中原生的一款基于网络请求的模块,功能强大,简单便捷,效率高
作业:模拟浏览器发请求
使用方法:(requests模块的编码流程)
--指定url
--发送请求
--获取响应数据
--持久化存储
环境安装:
pip install requests
实战编码:
- 需求:爬取搜狗首页的页面数据
1.简易网页采集器
# -*- coding: utf-8 -*-
'''
爬虫步骤:
--指定url
--发送请求
--获取响应数据
--持久化存储
'''
'''
反反爬机制:
UA:User-Agent(请求载体的身份标识 )
UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份为
某一款浏览器,则判定为一个正常的请求,如果不是的话,就表示这不是一个正常的请求(爬虫)
则服务器端很可能拒绝该次请求
UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
'''
import requests
if __name__ == '__main__':
#step1:指定url
#通过字符串拼接,实现url指定关键字爬取
#原对应网址:http://www.sogou.com/web?query=xxx
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'#伪装浏览器
}
url = 'http://www.sogou.com/web'#拼接字符串query=xxx
#处理url携带的参数:封装到字典中
kw = input('enter a world:')
param = {
'query' : kw
}
#step2: 发送请求
#发送的请求为url地址,返回到response中
#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,params=param,headers=headers)#params--要拼接的参数
#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.破解百度翻译
获得对应请求页面中的一小部分内容,也就是百度翻译中的翻译结果
从百度翻译中的实际操作可以看到,翻译结果模块是实时更新的,因此可以知道,
在输入要翻译的内容后,网页通过Ajax实时传输数据,因此要爬的是Ajax里面的信息
--Post请求(携带了参数)(Ajax实时反馈的url是post请求)
--响应数据是一组json数据
# -*- 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 (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 #'kw'为网站post中的参数
}
#4.请求发送
response = requests.post(url=post_url,data = data,headers=headers)#data和get中的params类似
#因为获取的响应数据是json的形式
#5.获取响应数据:json() 方法返回的是obj(如果确认响应数据是json类型的,才可以使用json())
dic_obj = response.json()
print(dic_obj)
#6.持久化存储
fileName = word + '.json'
fp = open(fileName,'w',encoding='utf-8')
#json形式的文件写入--json.dump()
#由于返回的obj中有中文,因此ensure_ascii=False,中文不能存储为ascii
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('over!!!')
3.豆瓣排行榜案例(json+Get)
# -*- coding: utf-8 -*-
import requests
import json
if __name__ == '__main__':
'''
1.从F12中的数据找出豆瓣的url
url:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20
通常问号后的内容通过字典的形式传输,所以删去并建立字典
2.看标识中的content-type中看到:pplication/json; charset=utf-8
可以看出网站更新的形式是json
3.Request Method: GET -- get方法
'''
url = 'https://movie.douban.com/j/chart/top_list'
param = {
#建立字典传输数据
'type':'11',
'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('4.douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over')
4.肯德基作业(text+post)
# -*- coding: utf-8 -*-
import requests
import json
if __name__ == "__main__":
#1.指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'#op不是字典内的,所以不要删,通过keyword传
#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请求抑制)
keyword = input('enter a word:')
data = {
'pid':'',
'cname':'',
'keyword':keyword, #'kw'为网站post中的参数
'pageIndex':'1',
'pageSize':'2',
}
#4.请求发送
response = requests.post(url=post_url,data = data,headers=headers)#data和get中的params类似
#Content-Type: text/plain; charset=utf-8 -- 返回的是text型的数据
dic_obj = response.text
print(dic_obj)
#5.持久化存储
fileName = keyword + '.html'
with open(fileName,'w',encoding = 'utf-8') as fp:
fp.write(dic_obj)
print('over!!!')
#5.综合案例,获取药监局的注册详细信息(多页面的json数据传递,多数据储存)
# -*- coding: utf-8 -*-
'''
项目说明:
http://scxk.nmpa.gov.cn:81/xk/
通过抓包发现,首页中的信息是动态加载的,并且是通过ajax动态请求到的
Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
on: true
page: 1
pageSize: 15
productName:
conditionType: 1
applyname:
applysn:
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=39213f625bf8425a8e871fb5b15e1dfa
id: 39213f625bf8425a8e871fb5b15e1dfa
在详情页中的url中:
-url的域名都是一样的,只是携带的参数(id)不一样
-id值可以从首页对应的ajax请求到的json中获取
-域名和id值拼接出一个完整的企业详情页
-详情页的数据也是动态加载出来的
Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
id: 39213f625bf8425a8e871fb5b15e1dfa
-对于详情页接收到的ajax数据,观察后发现
-所有的post请求的url都是一样的,只有参数id值不一样
-如果可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页
'''
import requests
import json
if __name__ == "__main__":
#首先在首页中接收到的ajax信息中获取不同企业的ID值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
#url直接设置到ajax的地址
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'#伪装浏览器
}
id_list = []#定义列表装ID信息
#动态获取多页的企业详情信息
for page in range(1,6):
page = str(page)#先将整形转换为字符型,才能封装到属性中
#封装的属性
data = {
'on':'true',
'page':'1',
'pageSize':'15',
'productName':'',
'conditionType':'1',
'applyname':'',
'applysn':'',
}
#定义一个列表存储批量读取的企业ID
json_ids = requests.post(url=url,headers=headers,data=data).json()#将第二第三部结合,简化
#等同于先用respnce接受数据,然后将responce的json数据传给json_ids
#经过观察,企业的信息都存储在json文件中的list属性中的字典,因此遍历list表,拿到ID值
for dic in json_ids['list']:#遍历list列表,拿到字典中的数据
id_list.append(dic['ID'])#获取列表内字典中的ID值
#在批量获取完ID值中,开始获取企业的详情数据
#因为同样是动态ajax获取,所以url设置为ajax地址即可
all_Date = []#定义装读取的详情信息的列表
post_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
for id in id_list:
#一个个获取ID表中数据,然后一个个获取详细信息
data = {
'id':id
}
detail_json = requests.post(url=post_url,headers=headers,data = data).json()
all_Date.append(detail_json)
#持久化存储
fp = open('./allData.json','w',encoding='utf-8')
json.dump(all_Date,fp=fp,ensure_ascii=False)
print('over!!!')