1.requests 模块简介
什么是 requests 模块
requests 模块是 python 中原生的基于网络请求的模块, 功能强大, 用法简洁高效. 在爬虫领域中占据着半壁江山的地位. requests 模块作用: 模拟浏览器发请求.
为什么要使用 requests 模块
因为在使用 urllib 模块的时候, 会有诸多不便之处, 总结如下:
手动处理 url 编码
手动处理 post 请求参数
处理 cookie 和代理操作繁琐
......
而使用 requests 模块的优势:
自动处理 url 编码
自动处理 post 请求参数
简化 cookie 和代理操作
......
如何使用 requests 模块
安装: pip install requests
使用流程
指定 url
基于 requests 模块发起请求
获取响应对象中的数据值
持久化存储
requests 模块的各种请求方式
最常用的请求方式就是 post 和 get 请求. params 在 get 请求中使用, data,JSON 在 post 请求中使用.
- response = requests.get(url, params={'key':'value'})
- response = requests.post(url, data={'key':'value'})
- # 返回的是 Unicode 型的数据; 取 html 源码;
- response.text
- # 返回的是 bytes 型也就是二进制的数据. 取图片, 文件;
- resppnse.content
- # 返回的是 JSON 格式数据
- resppnse.JSON()
- User-Agent *****
通过自定义请求对象, 用于伪装爬虫程序请求的身份.
User-Agent 参数, 简称为 UA, 该参数的作用是用于表明本次请求载体的身份标识. 如果我们通过浏览器发起的请求, 则该请求的载体为当前浏览器, 则 UA 参数的值表明的是当前浏览器的身份标识表示的一串数据. 如果我们使用爬虫程序发起的一个请求, 则该请求的载体为爬虫程序, 那么该请求的 UA 为爬虫程序的身份标识表示的一串数据. 有些网站会通过辨别请求的 UA 来判别该请求的载体是否为爬虫程序, 如果为爬虫程序, 则不会给该请求返回响应, 那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值, 这也是反爬虫的一种初级技术手段. 为了防止该问题的出现, 则我们可以给爬虫程序的 UA 进行伪装, 伪装成某款浏览器的身份标识.
- import requests
- url = 'http://www.baidu.com/'
- headers={
- 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) ApplewebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
- }
- request =request.get(url=url,headers=headers)
2. requests 模块使用实例
2.1 基于 requests 模块的 get 请求
示例: 爬取搜狗指定词条搜索后的页面数据 (网页采集器, 动态获取)
- import requests
- Word = input('please enter a word:')
- url = 'https://www.sogou.com/web'
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
- }
- param = {
- 'query':Word
- }
- response = requests.get(url=url,params=param)
- page_text = response.text
- fileName = Word+'.html'
- with open(fileName,'w',encoding='utf-8') as fp:
- fp.write(page_text)
- print(fileName,'爬取成功!')
2. 2 基于 requests 模块的 post 请求
示例: 登录豆瓣电影, 爬取登录成功后的页面数据
- import requests
- import os
- url = 'https://accounts.douban.com/login'
- # 请求携带参数
- data = {
- "source": "movie",
- "redir": "https://movie.douban.com/",
- "form_email": "131xxxxxxxxx",
- "form_password": "88888888",
- "login": "登录",
- }
- #自定义请求头信息
- 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',
- }
- page_text = requests.post(url=url,data=data).text
- with open('./douban111.html','w',encoding='utf-8') as fp:
- fp.write(page_text)
2.3 基于 requests 模块 Ajax 的 get 请求
示例: 爬取豆瓣电影分类排行榜中的电影详情数据
- import requests
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
- }
- url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=0&limit=20'
- movie_list = requests.get(url=url,headers=headers).JSON()
- all_names = []
- for dic in movie_list:
- name = dic['title']
- all_names.append(name)
2.4 基于 requests 模块 Ajax 的 post 请求
示例: 破解百度翻译 (post 请求)
- import requests
- url = 'https://fanyi.baidu.com/sug'
- wd = input('enter something of English:')
- data = {
- 'kw':wd
- }
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
- }
- #发起一个 post 请求
- res =requests.post(url=url,data=data,headers=headers).JSON()
综合练习: 爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
- import requests
- headers = {
- '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',
- url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
- for page in range(1,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()
- all_id_list = []
- for dict in json_text['list']:
- id = dict['ID'] #用于二级页面数据获取
- all_id_list.append(id)
- #该 url 是一个 Ajax 的 post 请求
- 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['businessPerson'])
查看是不是动态加载页面, 就在开发者工具中的 response 中搜索. 不能搜到就证明是动态加载出来的.
来源: https://www.cnblogs.com/Summer-skr--blog/p/11396904.html