requests模块(主要)urllib模块 2. requests模块
python中原生的一款基于网络请求的模块,功能强大,简单快捷,效率极高作用:模拟浏览器发请求 2.1 环境安装
pip install requestsps:pycharm自带python环境,所以在电脑命令中安转可能在pycharm中导包不了,所以最好在pycharm的终端中进行安转 2.2 如何使用
- 指定url向指定url发起请求
get请求post请求 获取响应对象的数据值持久化存储
入门案例:
import requests if __name__=='__main__': # 指定url url='https://www.sogou.com/' # 发起请求 # get方法会返回一个响应对象 response=requests.get(url=url) # 获取响应对象数据 # 以字符串方式返回页面源码 page_text=response.text print(page_text) # 持久化存储 # 在当前文件夹存储 with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_text) print('爬取数据结束!!!!')
ps:对于爬取的html数据没有换行,可以在pycharm中全选代码后按ctrl+alt+L快捷键换行 3. 搜狗结果页采集(网页采集器)
# UA检测: # 门户网站的服务器会检测对应请求的载体身份标识,如果检测的请求的载体身份标识为某一浏览器 # 说明该请求为正常请求。但是,如果请求的载体身份标识不是基于某一款浏览器时,则标识该请求 # 是不正常的(爬虫),则服务器就有可能会拒绝该次请求,所以要进行UA伪装 # UA伪装:让爬虫对应的请求载体身份标识伪装成某一浏览器 # UA:User-Agent import requests if __name__=='__main__': # UA伪装:将对应的User-Agent封装到一个字典中 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62' } url='https://www.sogou.com/web?' # 处理url携带的参数:封装到字典中,一个参数一个键值对 # 动态设置参数 kw=input('enter a word:') param={ 'query':kw } # 对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数 # 第二个参数处理请求参数 # 第三个参数UA伪装 response=requests.get(url=url,params=param,headers=headers) page_text=response.text fileName=kw+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'保存成功')3.1 UA检测与UA伪装
UA检测:UA:User-Agent门户网站的服务器会检测对应请求的载体身份标识,如 果检测的请求的载体身份标识为某一浏览器
说明该请求为正常请求。但是,如果请求的载体身份标识不是基于某一款浏览器时,则标识该请求
是不正常的(爬虫),则服务器就有可能会拒绝该次请求,所以要进行UA伪装UA伪装:让爬虫对应的请求载体身份标识伪装成某一浏览器
3.2 可变参数
在页面参数设置时,可以设置自己输入控制可变参数来爬取自己想要的页面,如上的搜狗搜索结果页面 4. 破解百度翻译
import requests import json if __name__=='__main__': post_url='https://fanyi.baidu.com/sug' head={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62' } # post请求参数处理(同get一样) # 这里也能改成动态的参数 data={ 'kw':'dog' } # 发送post请求 response=page_text=requests.post(url=post_url,data=data,headers=head) # 服务器返回的是json数据 # json()方法返回的是obj(如果确认服务器返回的是json类型,才能用) dic_obj = response.json() fp=open('./dog.json','w',encoding='utf-8') # 录入文件 # 第三个参数为是否能用ASCII码进行编码 json.dump(dic_obj,fp=fp,ensure_ascii=False) print('over!!')4.1 关于ajax请求与服务器返回类型
ajax请求:即不刷新页面也能进行数据更新,ajax请求返回的就是json类型数据关于服务器返回的类型以及post请求的url可以在浏览器的抓包工具的XHR分类中查看 4.2 关于json格式
可以把抓取到的json语句在json在线解析中解析成标准格式以查看内容 5. 豆瓣电影爬取
跟破解百度翻译差不多
import json import requests if __name__=='__main__': url='https://movie.douban.com/j/chart/top_list?' par={ 'type': '24', '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/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62' } response=requests.get(url=url,params=par,headers=headers) list_data=response.json() fp=open('./豆瓣电影.json','w',encoding='utf-8') json.dump(list_data,fp=fp,ensure_ascii=False) print('over!!!')6. KFC餐厅查询爬取
import json import requests if __name__=='__main__': url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?' key=input('请输入城市:') par={ 'op':'keyword', 'cname':'', 'pid':'', 'keyword': key, 'pageIndex': '1', 'pageSize': '100' } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62' } response=requests.post(url=url,params=par,headers=headers) page_text=response.text # 将字符串转换为json类型 page_json=json.loads(page_text) fp=open('./kfc.json','w',encoding='utf-8') json.dump(page_json,fp=fp,ensure_ascii=False) print('over!!!')
ps: 如果抓取的数据类型不是json类型,也可以用json.loads()方法把抓取的字符串转换为json数据类型 6.1 关于多页数据的爬取
我们爬取页面时有时候会遇到多页面,想全部爬取数据怎么办呢?如果是ajax请求页面一般会有类似于pageIndex和pageSize的参数,这个时候我们可以把pageSize参数的数据设置大一点就可以爬取所有页面的数据了,也可以在爬取的json文件动态获取总数据数进行爬取,或者用循环遍历所有的pageIndex获取 7. 综合练习-药监总局
import json import requests if __name__=='__main__': url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList' data={ 'on': 'true', 'page': '1', 'pageSize': '', 'productName':'', 'conditionType': '1', 'applyname':'', 'applysn':'' } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62' } json_ids=requests.post(url=url,headers=headers,data=data).json() id_list=[]#存储所有的企业id all_data_list=[]#存储所有的企业详情数据 # 获取所有的ID for dic in json_ids['list']: id_list.append(dic['ID']) post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById' for id in id_list: data={ 'id':id } detail_json=requests.post(url=post_url,headers=headers,data=data).json() all_data_list.append(detail_json) fp=open('./药监总局.json','w',encoding='utf-8') json.dump(all_data_list,fp=fp,ensure_ascii=False) print('over!!!!')7.1 关于发送请求中data与params区别
data:是添加到请求体中的,用于post请求params:是添加到url的请求字符串中的,用于get请求 8. requests库的text方法、content方法、json类型的区别
text方法:返回字符串content方法:返回二进制json方法:返回对象 9. 关于post请求与get请求区别
post请求:
post请求没有编码集的限制post参数在REQUSET BODY中,用户不可见,相对安全参数长度无限制post请求会先把请求头发送到服务器进确认,然后才真正发送数据post请求不会对数据进行缓存post请求一般用于修改和写入数据 get请求:
get请求只能用ASCLL码get请求参数在url中,用户可见浏览器会对url长度进行限制,所以get请求参数长度一般也会被限制,不同浏览器限制长度不一样get请求会把请求头与数据一起发送get请求会把数据进行缓存get请求一般用于搜索排序和筛选之类的 *** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)