一、request模块介绍
1. 什么是request模块
- python中原生的基于网络请求的模块,模拟浏览器发起请求。
2. 为什么使用request模块
- urllib需要手动处理url编码,quote()。
- urllib需要手动处理post请求参数。
- cookie的代理操作比较繁琐
1. cookie
- 创建一个cookiejar对象
- 创建一个handler对象
- 创建一个openner
2. 代理
- 创建handler对象,代理ip和端口分装到该对象
- 创建openner对象
3. request如何被使用
- 安装:pip install requests
- 使用流程:
1. 指定URL
2. 使用request模块发起请求
3. 获取响应数据
4. 进行持久化储存
3.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固
- get请求
- post请求
- 基于ajax的get请求
- 基于ajax的post请求
- 综合项目
二、项目实战
3. 基于request模块发起一个get请求
需求:爬取搜狗首页的页面数据
import requests # 指定url url = \'https://www.sogou.com/\' # 发起get请求:get方法会返回请求成功的响应对象 response = requests.get(url=url) # 获取响应中的数据值:text可以获取响应对象中字符串形式的页面数据 page_data = response.text # 持久化操作 with open(\'./sougou.html\',\'w\',encoding=\'utf-8\') as fp: fp.write(page_data)
response对象中其他重要的属性
import requests # 指定url url = \'https://www.sogou.com/\' # 发起get请求:get方法会返回请求成功的响应对象 response = requests.get(url=url) # content获取的是response对象中二进制(byte)类型的页面数据 # print(response.content) # 返回一个响应状态码 # print(response.status_code) # 响应头信息 # print(response.headers) # 获取请求的url # print(response.url)
4. 携带参数的get请求方式1
import requests url = \'https://www.sogou.com/web?query=周杰伦&ie=utf-8\' response = requests.get(url=url) page_text = response.text with open(\'./zhou.html\',\'w\',encoding=\'utf-8\') as fp: fp.write(page_text)
5. 携带参数的get请求方式2
import requests url = \'https://www.sogou.com/web\' # 将参数封装到字典中 params = { \'query\':\'周杰伦\', \'ie\':\'utf-8\', } requests.get(url=url,params=params) print(response.text)
6. 自定义请求头信息
import requests url = \'https://www.sogou.com/web\' # 将参数封装到字典中 params = { \'query\':\'周杰伦\', \'ie\':\'utf-8\', } # 自定义请求头信息 headers = { \'User-Agent\':\'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } response = requests.get(url=url,params=params,headers=headers) print(response.status_code)
7. 基于requests模块发起的post请求
需求:登陆豆瓣网,获取登陆成功后的页面数据
import requests # 1. 指定post请求的url url = \'https://accounts.douban.com/login\' # 封装post请求的参数 data = { \'source\':\'movie\', \'redir\':\'https://movie.douban.com/\', \'form_email\':\'account\', \'form_password\':\'password\', \'login\':\'登陆\', } # 自定义请求头信息 headers = { \'User-Agent\':\'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } # 2. 发起post请求 response = requests.post(url=url,data=data,headers=headers) # 3. 获取响应对象中的页面数据 page_text = response.text # 4. 持久化操作 with open(\'./douban.html\',\'w\',encoding=\'utf-8\') as fp: fp.write(page_text)
8. 基于Ajax的get请求
需求:抓取豆瓣电影上电影详情的数据
import requests url = \'https://movie.douban.com/j/chart/top_list?\' # 封装ajax的get请求中携带的参数(系统自带的抓包工具下面的Query String) params = { \'type\': \'13\', \'interval_id\': \'100:90\', \'action\':\'\', \'start\': \'100\', \'limit\': \'20\', } # 自定义请求头信息 headers = { \'User-Agent\':\'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } response = requests.get(url=url,params=params,headers=headers) print(response.text)
9. 基于Ajax的post请求
需求:爬取肯德基城市餐厅位置数据
import requests # 1. 指定url post_url = \'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword\' # 处理post请求 data = { \'cname\': \'\', \'pid\': \'\', \'keyword\': \'北京\', \'pageIndex\': \'1\', \'pageSize\': \'10\', } # 自定义请求头信息 headers = { \'User-Agent\':\'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } # 2. 发起基于ajax的post请求 response = requests.post(url=post_url,headers=headers,data=data) print(response.text)
总结:普通的get和post的请求一般从地址栏获取url。ajax是一个局部刷新的异步请求,我们不能从地址栏获取ajax的url,要借助抓包工具获取地址。
10. 综合项目实战
需求:爬取搜狗知乎某一个词条对应一定范围页码表示的页面
import requests import os # 创建一个文件夹 if not os.path.exists(\'./pages\'): os.mkdir(\'./pages\') word = input(\'enter a word:\') # 动态指定页码的范围 start_page_number = int(input(\'enter a start page number\')) end_page_number = int(input(\'enter a end page nunber\')) # 自定义请求头信息 headers = { \'User-Agent\':\'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } # 1. 指定url:设计成一个具有通用的url url = \'https://zhihu.sogou.com/zhihu\' for page in range(start_page_number,end_page_number + 1): params = { \'query\':word, \'page\':page, \'ie\':\'utf-8\', } response = requests.get(url=url,params=params,headers=headers) # 获取响应中的页面数据(指定页码(page)) page_text = response.text # 持久化存储 file_name = word + str(page) + \'.html\' file_path = \'pages/\' + file_name with open(file_path,\'w\',encoding=\'utf-8\') as fp: fp.write(page_text) print(f\'第{page}页数据写入成功\')