requests基本使用实例
requests
requests是爬虫中基于网络请求的模块
安装:pip install requests
作用:模拟浏览器发起请求
编码流程:
- 指定url
- 发起请求
- 获取响应数据(爬取到的页面源码数据)
- 持久化存储
爬取搜狗首页的页面源码数据
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/14 22:13 # ide: PyCharm import requests # 1、指定url url = "https://www.sogou.com/" # 2、发起请求get方法的返回值为响应对象 response = requests.get(url=url) # 3、获取响应数据 # .text:返回的是字符串形式的响应数据 page_text = response.text # 4、持久化存储 with open("./sougou.html", "w", encoding="utf-8") as fp: fp.write(page_text)
实现一个简易网页采集器
基于搜狗针对指定不同的关键字将其对应的页面数据进行爬取
参数动态化:如果请求的url携带参数,且我们想要将携带的参数进行动态化操作:
- 将携带的动态参数以键值对的形式封装到一个字典中
- 将该字典作用到get方法的params参数中即可
- 需要将原始携带参数的url中将携带的参数删除
import requests key_word = input("请输入搜索关键字:") headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', } # 实现参数动态化 params = { 'query': key_word } url = "https://www.sogou.com/web" # params参数(字典):保存请求时url携带的参数 # 实现UA伪装 response = requests.get(url=url, params=params, headers=headers) # 修改响应数据的编码格式 # encoding返回的是响应数据的原始的编码格式,如果给其赋值则表示修改了响应数据的编码格式 response.encoding = "utf-8" page_text = response.text fileName = key_word + ".html" with open(fileName, "w", encoding="utf-8") as fp: fp.write(page_text) print(fileName, "爬取完毕") # 上述出现问题 # 1、乱码 # 2、处理乱码后,页面显示【异常访问请求】导致请求数据的缺失【UA伪装】 # 网站后台已经检测出该次请求不是通过浏览器发起的请求。 # 网站后台是如何知道请求是不是通过浏览器发起的呢? # 是通过判断请求的请求头中的user-agent判定的 # 什么是User-Agent?请求载体的身份标识 # 什么是请求载体? # 1、浏览器-->浏览器的身份标识是统一固定,身份标识可以从抓包工具中获取 # 2、爬虫程序-->身份标识是各自不同
需求:爬取豆瓣电影名称+评分
地址:https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=
分析:页面中使用动态加载数据,即ajax异步请求去获取电影数据。使用使用浏览器的开发者工具查找到获取电影数据的url,进行发送请求获取响应,然后找到电影名称+评分。
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/15 19:45 # ide: PyCharm import requests # 豆瓣电影页面url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=" # 动态加载数据的捕获 # 什么叫动态加载数据?ajax请求 url = "https://movie.douban.com/j/chart/top_list" params = { 'type': '5', '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/84.0.4147.105 Safari/537.36', } response = requests.get(url=url, headers=headers, params=params) # .json()将获取的字符串形式的json数据序列化成字典或者列表对象 page_text = response.json() # 解析出电影的名称+评分 for movie in page_text: name = movie["title"] score = movie["score"] print(name, score)
分页数据的爬取操作
需求:爬取全广州市肯德基餐厅位置和餐厅名字 。 url:http://www.kfc.com.cn/kfccda/storelist/index.aspx
分析:
- 在录入关键字的文本框中输入关键字按下搜索按钮,发起的是一个ajax请求。所以当前页面刷新出来的位置信息一定是通过ajax请求到的数据,
- 基于浏览器中开发者工具定位到该ajax请求的数据包,从该数据包中捕获:请求url、请求方式、请求携带的参数、看到响应数据
- 需要处理翻页
爬取第一页的数据
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/15 22:40 # ide: PyCharm import requests # 爬取第一页的数据 url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword" data = { 'cname': '', 'pid': '', 'keyword': '广州', 'pageIndex': '1', 'pageSize': '10' } headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', } # data参数是post方法中处理动态化参数的参数 response = requests.post(url=url, data=data, headers=headers) page_text = response.json() for dic in page_text["Table1"]: title = dic["storeName"] addr = dic["addressDetail"] print(title, addr)
爬取全部的数据
import requests # 翻页爬取全部 url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword" for page in range(1, 9): data = { 'cname': '', 'pid': '', 'keyword': '广州', 'pageIndex': str(page), 'pageSize': '10' } headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', } # data参数是post方法中处理动态化参数的参数 response = requests.post(url=url, data=data, headers=headers) page_text = response.json() for dic in page_text["Table1"]: title = dic["storeName"] addr = dic["addressDetail"] print(title, addr)