requests库使用流程
使用流程/编码流程
1.指定url
2.基于requests模块发起请求
3.获取响应对象中的数据值
4.持久化存储
分析案例
需求:爬取搜狗首页的页面数据
# 爬取搜狗首页
import requests
if __name__ == '__main__':
# step_1:指定url
sogou_url = 'https://www.sogou.com/'
# step_2: 发起请求:使用get方法发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=sogou_url)
# step_3:获取响应数据:通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
# step_4:持久化存储
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据完毕!!!')
需求:爬取搜狗指定词条对应的搜索结果页面
# 爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
# 反爬机制
#
# User-Agent:请求载体的身份标识,使用浏览器发起的请求,请求载体的身份标识为浏览器,
# 使用爬虫程序发起的请求,请求载体为爬虫程序。
#
# UA检测:相关的门户网站通过检测请求该网站的载体身份来辨别该请求是否为爬虫程序,
# 如果是,则网站数据请求失败。
# 因为正常用户对网站发起的请求的载体一定是基于某一款浏览器,
# 如果网站检测到某一请求载体身份标识不是基于浏览器的,则让其请求失败。
# 因此,UA检测是我们整个课程中遇到的第二种反爬机制,第一种是robots协议。
#
# UA伪装:通过修改/伪装爬虫请求的User-Agent来破解UA检测这种反爬机制
import requests
# 指定搜索关键字
word = input('enter a word you want to search:')
# 自定义请求头信息:UA伪装,将包含了User-Agent的字典作用到请求方法的headers参数中即可
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
# 指定url,原始url可能是https://www.sogou.com/web?query=qq,发现该url携带了参数
url = 'https://www.sogou.com/web'
# 封装get请求参数:如果请求携带了参数,则可以将参数封装到字典中结合这requests请求方法中的data/params参数进行url参数的处理
param = {
'query': word,
}
# 发起请求
response = requests.get(url=url, params=param, headers=headers)
# 获取响应数据
page_text = response.text
# 持久化存储
fileName = word + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据完毕!!!', fileName)
需求:爬取豆瓣电影分类排行榜中的电影详情数据
# 抓取豆瓣电影分类排行榜 - 动作片
import requests
if __name__ == "__main__":
# 指定ajax-get请求的url(通过抓包进行获取)
url = 'https://movie.douban.com/j/chart/top_list?'
# 定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
# 定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
# 定制get请求携带的参数(从抓包工具中获取)
param = {
'type': '5',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
# 发起get请求,获取响应对象
response = requests.get(url=url, headers=headers, params=param)
# 获取响应内容
print(response.json())
爬取国家药品监督管理总局数据
#需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://125.35.6.84:81/xk/
import requests
import json
if __name__ == "__main__":
# 指定ajax-post请求的url(通过抓包进行获取)
# 首页中信息通过ajax获取
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
# 定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
# 定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
pageNum = 3
all_id_list = []
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()
# 详情页信息:url和域名一样 ,id不一样
# id值通过首页对应ajax请求得到的json串中获取
# 通过域名和id名拼接成新的url
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请求
print(len(all_id_list))
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)
if response.headers['Content-Type'] == 'application/json;charset=UTF-8':
# print(response.json())
# 进行json解析
json_text = response.json()
print(json_text['epsName']+','+ json_text['businessPerson'])