什么是requests模块
官方文档:https://requests.readthedocs.io/en/master/
- requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
- 为什么要使用requests模块
因为在使用urllib模块的时候,会有诸多不便之处,总结如下: - 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- …
使用requests模块: - 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
…
如何使用requests模块
安装:
pip install requests
使用流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
response的常用属性
- response.text 响应体 str类型
- respones.content 响应体 bytes类型
- response.status_code 响应状态码
- response.request.headers 响应对应的请求头
- response.headers 响应头
- response.request.cookies 响应对应请求的cookie
- response.cookies 响应的cookie(经过了set-cookie动作)
Requests库中有7个主要的函数
分别是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。这七个函数中request()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。
方法 说明
- requests.request() 构造一个请求,支撑一下方法的基础方法
- requests.get() 获取HTML网页的主要方法,对应于HTTP的GET(请求URL位置的资源)
- requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD(请求URL位置的资源的头部信息)
- requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST(请求向URL位置的资源附加新的数据)
- requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT(请求向URL位置储存一个资源,覆盖原来URL位置的资源)
- requests.patch() 向HTML网页提交局部修改的请求,对应于HTTP的PATCH(请求局部更新URL位置的资源)
- requests.delete() 向HTML网页提交删除请求,对应于HTTP的DELETE(请求删除URL位置储存的资源)
而这几个函数中,最常用的又是 requests.get() 函数。get函数有很多的参数,我只举几个比较常用的参数
参数 说明
- url 就是网站的url
- params 将字典或字节序列,作为参数添加到url中,get形式的参数
- data 将字典或字节序列,作为参数添加到url中,post形式的参数
- headers 请求头,可以修改User-Agent等参数
- timeout 超时时间
- proxies 设置代理
# -*- coding: utf-8 -*-
import requests #调用requests模块
from lxml import etree #调用html解析
from Chaojiying_Python import chaojiying #调用超级鹰打码平台
import time # 调用时间模块
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
} #模仿浏览器UA头
session = requests.Session()# 动态获取cookie
# 识别验证码
url ="https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
page_text = session.get(url=url,headers=headers).text
# 解析验证码图片
tree = etree.HTML(page_text)
img_src = "https://so.gushiwen.cn/"+tree.xpath('//*[@id="imgCode"]/@src')[0]
# 将验证码图片保存到本地
img_data = session.get(img_src,headers=headers).content
with open ('C:/Users/gpc/Desktop/python/Chaojiying_Python/code.jpg',"wb") as fp:
fp.write(img_data)
# 识别验证码
code_text = chaojiying.Chaojiying_Client.tranformImgCode()
time.sleep(2)
login_url = "https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx"
data = {
# 如果在请求参数中看见一组乱序的请求参数,需要抓包验证下是否动态变化如下:"__VIEWSTATE" "__VIEWSTATEGENERATOR"
# 如果是动态变化的参数一般会隐藏在前台源码中,我们需要进行xpaht 或者正则 等方式进行提取 就可以获得实时的参数
# 如果前台源码中没有,我们可以通过抓包全局收索获取对应的数据包提取参数赋值到data中
"__VIEWSTATE": "wLzVsPN64jZIa8aQJI9HzVvaaknH6pBhUG+UOMQKX8NEFV49xwtLRgU8GH4O1o+mClDbtnYiKbXMOIM6VRh7HGzM4hpMpd0qBUM3b/pXlzZ2gnbcuB+5RUBJ/i0=",
"__VIEWSTATEGENERATOR": "C93BE1AE",
"from": "http://so.gushiwen.cn/user/collect.aspx",
"email": "18398149392",
"pwd": "cheng.1023",
"code": code_text,# 验证码动态变化
"denglu": "登录"
}
# 对点击登录按钮发起请求,获取了登录成功后的页面源码数据
page_text_login = session.post(url = login_url,headers=headers,data=data).text
print(page_text_login)
# -*- coding: utf-8 -*-
import requests # 调用模块
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
} #模仿浏览器UA头
url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList" # 指定url
for pg in range(1,6):
data = {
"on": "true",
"page": str(pg),
"pageSize": "15",
"productName":"",
"conditionType": "1",
"applyname":"",
"applysn":""
}
response = requests.post(url=url,headers=headers,data=data) # 发起请求get方法的返回值为响应对象
page_text = response.json() # 将获取的字符串形式的json数据序列化成字典或者列表对象
uuid = page_text["list"]
for idd in uuid:
iidd = (idd["ID"])
# 爬取详情数据
url2 = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById" # 指定url
data2 = {
"id":iidd
}
response = requests.post(url=url2,headers=headers,data=data2) # 发起请求get方法的返回值为响应对象
page_text = response.json() # 将获取的字符串形式的json数据序列化成字典或者列表对象
qymc = page_text["epsName"]
xkzbh = page_text["productSn"]
xkxm = page_text["certStr"]
qyzs = page_text["epsAddress"]
scdz = page_text["epsProductAddress"]
shxydm = page_text["businessLicenseNumber"]
fddbr = page_text["businessPerson"]
qyfzr = page_text["legalPerson"]
zlfzr = page_text["qualityPerson"]
fzjg = page_text["qfManagerName"]
qfr = page_text["xkName"]
rcjdgljg = page_text["rcManagerDepartName"]
rcjdglry = page_text["rcManagerUser"]
yxq = page_text["xkDate"]
fzrq = page_text["xkDateStr"]
xiangqing = ("企业名称:" + qymc + "
" + "许可证编号:" + xkzbh + "
" + "许可项目:" + xkxm + "
" + "企业住所:" + qyzs + "
" + "生产地址:" + scdz + "
" + "社会信用代码:" + shxydm + "
" + "法定代表人:" + fddbr + "
" + "企业负责人:" + qyfzr + "
" + "质量负责人:" + zlfzr + "
" + "发证机关:" + fzjg + "
" + "签发人:" + qfr + "
" + "日常监督管理机构:" + rcjdgljg + "
" + "日常监督管理人员:" + rcjdglry + "
" + "有效期至:" + yxq + "
" + "发证日期:" + fzrq)
print(xiangqing)
with open ("药监局详情爬取.txt","a",encoding="utf-8") as fp: # 持续化存储 (w写 r读 a追加)
fp.write(xiangqing + "
")
# -*- coding: utf-8 -*-
import requests # 调用模块
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
} #模仿浏览器UA头
url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20" # 指定url
params = {
'type': '5',
'interval_id': '100:90',
'action':'',
'start': '0',
'limit': '20'
}
response = requests.get(url=url,headers=headers,params=params) # 发起请求get方法的返回值为响应对象
page_text = response.json() # 将获取的字符串形式的json数据序列化成字典或者列表对象
#page_text = response.text # 获取响应数据,text为字符串形式的相应数据
# 解析出电影的名称+评分
for movie in page_text:
name = movie['title']
score = movie['score']
print(name,score)
with open ("豆瓣.txt","a",encoding="utf-8") as fp: # 持续化存储 (w写 r读 a追加)
fp.write(name + " " + score + "
")