爬虫之request模块

request模块理论

爬虫中用于请求的模块有两种:

1、urllib模块,较为古老,不再使用

2、request模块,python中原生的一款基于网络请求的模块,比较简单高效

request模块特点:

1、功能强大
2、简单便捷
3、效率极高

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

如何使用/编码流程:

1、指定url;2、发起请求(get/post请求);3、获取响应数据;4、持久化存储响应数据

环境安装:

  • pip install requests;
  • pycharm添加安装

实战练习

1、需求:爬取搜狗首页的页面数据

# 模块导入
import requests
# 指定url
url='https://www.sogou.com/'
# 发起请求,get方法会返回数据,返回的数据类型为response对象
response=requests.get(url)
# 获取响应数据,利用response对象的text属性返回字符串类型数据
a=response.text

# 持久化存储,存储到本地文件
with open('./sogou.html','w',encoding='utf-8') as f: # 在本地路径创建一个名为‘sogou.html'的文件,'w'指写入数据,encoding是编码
    f.write(a)
print('爬取数据结束!')

response对象常用属性:
在这里插入图片描述response.status_code这个属性。它用来表示这个请求响应状态。我们一般用它来判断请求是否成功。

response.content它保存着服务器返回的数据的二进制内容(图片/视频等)。

response.text这个属性其实就是将 response.content 的二进制数据转换为字符串,适用于文字或者是网页源代码的下载。

response.encoding这个属性代表了“Response”对象的编码。所有的文本数据都有编码类型。一般来说,requests库会帮我们自动去判断编码类型,不需要手动指定。但是如果遇到一些需要自己去指定数据的编码类型的情况,就可以使用response.encoding去改变“response”拿到的数据的编码类型。

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

# 导包
import requests
# 分析网址构成,对url携带的参数封装到字典中,在request.get()中传入参数
# UA检测:门户网站服务器会监测对应请求的载体身份标识,若检测到请求的载体身份标识为某一款浏览器,则说明该请求是正常的请求。
# 若监测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),那么服务器端很可能拒绝这次请求。
# UA伪装:user-agent,请求载体的身份标识,将对应的User-Agent封装到一个字典中,在request.get()中传入

url='https://www.sogou.com/web'

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

# 参数传入
kw = input('输入您想查询的关键字')
param={
    'query': kw
}
# 发起请求,获取响应数据
response=requests.get(url,params=param,headers=headers)
page_text = response.text

# 将文件存储为关键词命名的文件
filename = kw +'.html'
with open (filename, 'w',encoding='utf-8') as f:
    f.write(page_text)
print(filename+' 保存成功!')
输入您想查询的关键字隔离
隔离.html 保存成功!

3、需求:破解百度翻译

对百度翻译在线翻译网站进行了分析,发现它是输入单词后网页部分会进行更新,地址栏并未发生变化,更新的部分正是我们需要的。
所以它采用的是AJAX技术,是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
因此我们只需要抓取所更新的AJAX数据包即可获取翻译结果。

检查源代码–选择XHR,查看general及其他信息发现

  • 该请求是携带参数的post请求
  • 返回的数据为json格式(在response headers里看content-type,可看出响应数据类型)
import requests
import json

post_url = 'https://fanyi.baidu.com/sug'
# UA伪装
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
}

# 参数传入
word = input('输入您想查询的关键字')
param={
    'kw': word
}
response = requests.post(post_url,data=param,headers=headers) # 相应的数据为json数据
dic_obj = response.json() # json方法返回的是obj(确认响应数据是json类型才可使用此方法)
print(type(dic_obj))
print(dic_obj['data'])
# 持久性存储
filename = word + '.json'
fp = open(filename,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp, ensure_ascii=False)# 使用dumps()函数,将列表/字典转换为json格式的字符串。返回数据中含有中文,不可用ascii编码。
print('已结束!')
输入您想查询的关键字key
<class 'dict'>
[{'k': 'key', 'v': 'n. 钥匙; (打字机等的)键; 关键,线索,秘诀; (音乐的)调 vt. 键入; 锁上; 调节…的'}, {'k': 'Key', 'v': '[人名] [英格兰人姓氏] 基 Kay的变体; [人名] [苏格兰人、爱尔兰人姓氏] 基 McKay'}, {'k': 'KEY', 'v': '[电影]钥匙'}, {'k': 'keys', 'v': 'n. 键; 钥匙; (乐曲的)调( key的名词复数 ); 题解'}, {'k': 'Keys', 'v': '[人名] [英格兰人、爱尔兰人姓氏] 基斯 Keys的变体'}]
已结束!

4、爬取肯德基地点

网址为http://www.kfc.com.cn/kfccda/storelist/index.aspx

翻页时发现网址并未发生变化,故判断为ajax请求,检查源代码查看XHR抓取更新的包,发现是带有参数的post请求,返回数据类型为text。

import requests

url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
keyword = input('请输入查询地点关键词:')
param = {
    'cname':'',
    'pid':'',
    'keyword': keyword,
    'pageIndex': '1',
    'pageSize': '10'
}
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36',
    'Origin': 'http://www.kfc.com.cn',
    'Referer': 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'
}
response = requests.post(url,data=param,headers=headers)
print(type(response))
print(response.text)
filename =  keyword+'.text'
with open (filename,'w',encoding = 'utf-8') as f:
    f.write(response.text)
print('OVER!!!')
请输入查询地点关键词:北京
<class 'requests.models.Response'>
{"Table":[{"rowcount":65}],"Table1":[{"rownum":1,"storeName":"育慧里","addressDetail":"小营东路3号北京凯基伦购物中心一层西侧","pro":"24小时,Wi-Fi,店内参观,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":2,"storeName":"京通新城","addressDetail":"朝阳路杨闸环岛西北京通苑30号楼一层南侧","pro":"Wi-Fi,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":3,"storeName":"黄寺大街","addressDetail":"黄寺大街15号北京城乡黄寺商厦","pro":"Wi-Fi,点唱机,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":4,"storeName":"四季青桥","addressDetail":"西四环北路117号北京欧尚超市F1、B1","pro":"Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":5,"storeName":"亦庄","addressDetail":"北京经济开发区西环北路18号F1+F2","pro":"24小时,Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":6,"storeName":"石园南大街","addressDetail":"通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分","pro":"24小时,Wi-Fi,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":7,"storeName":"北京南站","addressDetail":"北京南站候车大厅B岛201号","pro":"Wi-Fi,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":8,"storeName":"北清路","addressDetail":"北京北清路1号146区","pro":"24小时,Wi-Fi,店内参观,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":9,"storeName":"大红门新世纪肯德基餐厅","addressDetail":"海户屯北京新世纪服装商贸城一层南侧","pro":"Wi-Fi,点唱机,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":10,"storeName":"巴沟","addressDetail":"巴沟路2号北京华联万柳购物中心一层","pro":"Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"}]}
OVER!!!

5、爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

网址:http://scxk.nmpa.gov.cn:81/xk/

爬取每一家企业的详细信息。分析企业详情页网址发现每家企业的网址url域名都是一样的,只有携带的ID参数不一样。所以首先需要获取每家企业对应的ID。

分析上述网址后,利用检查源代码发现,企业对应信息不存储在此网址页面中,是动态加载出来的数据,不能直接通过对此网址发起请求获取,需要通过XHR先找到数据存储的网址。

对企业详情页的url进行抓包工具的分析,发现数据同样不是存储在此页面的,是动态加载的,所以需要找到动态加载的网址以获取数据。观察发现,详情数据的ajax请求的url域名也都是一样的,只有携带的id不一样。获取的响应数据是json类型,可到json在线解析中格式化校验分析结构,从而拿到数据。

import requests
import json
# 批量获取企业ID值
url_1='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/81.0.4044.122 Safari/537.36'
}
id_list=[]
# 分页操作
for i in range(1,6):
    params = {
        'on': 'true',
        'page': i,
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': ''

    }
    json_ids = requests.post(url_1,data=params,headers=headers).json() #字典类型数据
    for json_id in json_ids['list']:
        id = json_id['ID']
        id_list.append(id)

# 获取企业详情数据
url_2 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
all_datas_list=[]
for id in id_list:
   
    data={
        'id':id
    }
    detail_json = requests.post(url_2,data=data,headers=headers).json()
    all_datas_list.append(detail_json)
# 持久化存储数据
f = open('./alldata.json','w',encoding='utf-8')
json.dump(all_datas_list,f,ensure_ascii=False)
print('OVER!!!')

OVER!!!

以上内容来自视频:https://www.bilibili.com/video/BV1ha4y1H7sx?p=13&share_source=copy_web

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值