request模块

编辑本随笔

一、request模块简介

  1. 什么是requests模块
    • python原生基于网络请求的模块,模拟浏览器发起请求。
  2. 为什么使用requests模块
    • urllib需要手动处理url编码,使用quote()处理中文编码
    • urllib需要手动处理post请求的参数,将请求参数封装到字典后用urlencode()处理,在用encode()进行编码
    • urllib的cookie和代理操作比较繁琐
      • cookie:
        • 创建一个cookiejar对象
        • 基于cookiejar创建一个handler对象
        • 基于handler创建一个operner对象
        • 基于operner发起请求
      • 代理:
        • 创建handler对象,代理ip和端口封装到该对象
        • 创建openner对象,并发起请求
  3. requests模块如何使用
    • 安装:pip install requests
    • 使用流程:
      • 指定url
      • 使用requests模块发起请求
      • 获取响应数据
      • 进行持久化存储

二、基于项目进行学习

项目一、get请求

需求:获取sogou主页数据

import requests

#指定url
url = "https://www.sogou.com/"

#发起get请求:get方法会返回请求成功后的相应对象
response = requests.get(url=url)

#获取相应中的数据值
#text:相应对象中字符串形式的页面数据
page_data=response.text
print(page_data)

#持久化操作
with open("./sogou.html",'w','utf-8') as fp:
    fp.write(page_data)

response对象中重要属性:

  1. response.content:获取相应对象中二进制类型的页面数据
  2. response.text:字符串形式的页面数据
  3. response.status_code:返回响应状态码
  4. response.headers:获取响应头信息
  5. response.url:获取请求的url

requests模块带参get请求方式1

需求:指定一个词条,获取搜狗搜索结果对应的页面数据

import requests

#指定url,url中携带中文,requests并不需要手动用quote()方法去处理
url="https://www.sogou.com/web?query=周杰伦&ie=utf8"

#发起get亲求
response=requests.get(url=rul)

#获取页面数据
page_text=response.text

#持久化存储
with open('./sougou_art.html','w',encoding="utf-8") as fp:
    fp.write(page_text)

requests模块带参get请求方式2

#方式2,将参数封装到字典中
import requests
#指定url
url="https://www.sogou.com/web"

#将参数封装到字典
params={
    "query":"周杰伦",
    "ie":"utf-8"
}
#发起get亲求
response = requests.get(url=url,params=params)

#持久化存储
with open("./sogou.html",'w',encoding='utf-8') as fp:
    fp.write(response.text)

requests模块自定义请求头的get请求

#自定义请求头信息
import requests
#指定url
url="https://www.sogou.com/web"

#将参数封装到字典
params={
    "query":"周杰伦",
    "ie":"utf-8"
}

#创建headers字典对象
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

#发起get请求,并传入headers字典对象
response=requests.get(url=url,params=params,headers=headers)

response.status_code

项目二、post请求

#需求:登陆豆瓣网,获取登陆成功后的页面数据

import requests

#指定url
url='https://accounts.douban.com/j/mobile/login/basic'

#制定post数据
data={
    'ck':None, 
    'name':'x@163.com',
    'password':'1111111',
    'remember':'false',
    'ticket':None
}

#自定义headers[可选]
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

#发起post请求
response=requests.post(url=url,data=data,headers=headers)

#获取相应对象中的页面数据
page_text=response.text

#持久化保存
with open('./douban.html','w',encoding='utf-8') as fp:
    fp.write(page_text) 

项目三、基于ajax的get

和普通的get请求类似,只是返回结果为json格式字符串

#需求:抓取豆瓣电影详情
import requests

#指定url
url = 'https://movie.douban.com/j/new_search_subjects'

#封装参数
params={
    'sort': 'U',
    'range': '0,10',
    'tags':'',
    'start': '1',
    'genres': '动画'
}

#自定义请求头信息
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

response=requests.get(url=url,params=params,headers=headers)

print(response.text)

项目四、基于ajax的post

和普通的post请求类似

#需求:爬取肯德基城市餐厅信息
import requests

#指定url
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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

#发起请求
response=requests.post(url=url,data=data,headers=headers)

#获取数据结果
page_text=response.text

print(page_text)

项目五、综合

#需求:爬取搜狗知乎某词条搜索结果前三页数据
import requests
import os

# 创建文件夹
if not os.path.exists('./pages'):
    os.mkdir('./pages')

#指定url
url = 'https://zhihu.sogou.com/zhihu'

#自定义请求头信息
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

#指定关键字
word=input("Enter a search word:")

#动态指定页码的范围
start_pageNum=int(input("Enter a start pageNum:"))
end_pageNum=int(input("Enter a end pageNum:"))

for page in range(start_pageNum,end_pageNum+1):
    #指定params
    params={
        "query": word,
        "page": page,
        "ie": "utf8",
    }
    #发起请求
    response=requests.get(url=url,params=params,headers=headers)
    
    #获取响应中的页面数据(指定页码)
    page_text=response.text
    
    #进行持久化存储
    #指定文件名和路径
    fileName=word + str(page)+'.html'
    filePath='./pages/'+fileName
    
    with open(filePath,'w',encoding='utf-8') as fp:
        fp.write(page_text)
        print("第%s页数据获取成功" % page)

posted @ 2019-02-12 17:26  丫丫625202  阅读(237)  评论(0编辑  收藏  举报