第二十六篇 request模块使用

心得:requests模块还是比较好用的,运用起来简单,而且结合python,爬取网页数据,那简直分分钟的事情。

requests请求一般分为两种请求方式:

1 get请求:一般用来请求数据,获取数据,获取搜狗网页主页

#导包
import requests

#step_1:指定url
url = 'https://www.sogou.com/'
#step_2:发起请求:使用get方法发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=url)
#step_3:获取响应数据:通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
#step_4:持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
print('爬取数据完毕!!!')

2 post请求:一般用来提交表单,提交数据,需要用到post请求。

爬取百度翻译:

针对url进行分析,发现当我输入单词之后网页没有发生变话,但已经出现了相应的解释,从这点可以看出这是一个动态加载的网页,需要去ajax页面去查找对应的网址。而且它时post请求,并携带了参数为你输入的单词。
在这里插入图片描述
在这里插入图片描述

import requests
import json

post_url="https://fanyi.baidu.com/sug"  #查找对应的ajax网址

words=input("please input words:")  #模拟输入参数

data={"kw":words}   #传参数

#请求头,模拟电脑浏览器的访问方式
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" 
}
#发起请求
r=requests.post(url=post_url,data=data,headers=headers)

j=r.json() #只有网页数据是json文件,才可以使用这种方法
print(j['data'][0]['v'])

filename=words+".json"
with open("./requests_1028/"+filename,"w",encoding="utf-8") as f:  #持久化存储
    json.dump(j,f,ensure_ascii=False)   #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:

print("over")

请求的方式,得按照网页指定得方式去发出,负责无效。网页的请求头会有一个:Request Method: 请求方法,它指定哪一种我们用哪一种去发出请求

网页数据一般分为两种:

静态网页:
静态网页,一般只需要根据相应的请求来发出请求,就会返回正常的数据,一般由html,css语言编写而成,抓取的难度比较简单。之后一章我会分享出对,抓取的数据进行解析,主要针对的就是静态网页。

动态加载网页:
动态加载网页又称为ajax请求,真正的数据url往往藏在NETWORK->XHR页面下。需要我们进行相关的动作来取得此网址。动态网页的数据一般为json的数据格式,我们抓取下来之后当作字典来处理里面的数据。

来看一个豆瓣网站分析:
爬取排行榜电影的评分和名称
在这里插入图片描述
在这里插入图片描述
当向下滑动鼠标的时候,有新的数据刷新出来,也有心得url数据,我们惊奇的发现了正是我们需要的电影数据。是一个get请求,并且携带参数,这下我们可以来写程序了。

#coding=utf-8
import requests
import json

dou_url="https://movie.douban.com/j/chart/top_list"
params={
    "type": "19", #5动作 #11剧情 24喜剧 20恐怖 10悬疑 19惊悚
    "interval_id": "100:90",
    "action": "",
    "start": "0", #从第几部电影去取
    "limit": "1000" #一次取多少部电影
}
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
}
response=requests.get(url=dou_url,params=params,headers=headers)
#print(response.json())
for i in response.json():
    #for k,v in i.items():
    if float(i['score']) >= 9:
        print(i['title']+" : "+str(i['score']))

爬取了惊悚电影评分为9以上的电影,看看结果:

PS C:\Users\TianJian\Desktop\python> & C:/Users/TianJian/AppData/Local/Microsoft/WindowsApps/python.exe c:/Users/TianJian/Desktop/python/requests_1028/豆瓣电影高分.py
蝙蝠侠:黑暗骑士 : 9.2: 9.2
黑镜:圣诞特别篇 : 9.1
搏击俱乐部 : 9.0
红辣椒 : 9.0
小丑 : 9.0

肯德基上海店面地址爬取:

#coding=utf-8
#阿贾克斯请求:如果url没变,页面发生变化
import requests
import json

ken_url="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx"
params={
    "op":"keyword",
    "cname":"", 
    "pid":"", 
    "keyword": "上海",
    "pageIndex": "1",
    "pageSize": "100"
}
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
}

res=requests.post(url=ken_url,params=params,headers=headers)

print(res.text)

with open("./kendeji.text","w",encoding="utf-8") as f:
    f.write(res.text)

化妆品监管公司爬取

#coding=utf-8
import requests
import json

hua_url="http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
hua2_url="http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
}
res_list=[]

def hua2(use_id):
    hua2_url="http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"
    params={
        "id": use_id
    }

    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }

    res=requests.post(url=hua2_url,params=params,headers=headers)
    return res.json()
    
for page in range(1,6):
    page=str(page)

    params={
        "on": "true",
        "page": page,
        "pageSize": "15",
        "productName":"", 
        "conditionType": "1",
        "applyname":"", 
        "applysn":"" 
    }

    res=requests.post(url=hua_url,params=params,headers=headers)
    r=json.loads(res.text)  #等价于 res.json()  json格式一定要加载为python格式,才可以当作字典去使用
# with open("./huazhuang.json","w",encoding="utf-8") as f:
#     f.write(res.text)



    for i in r['list']:
        for m,n in i.items():
            if m=="ID":
                result=hua2(n)
                res_list.append(result)
                print(n,end=" ")
            if m=="EPS_NAME":
                print(n)
with open("./huainfo.json","w",encoding="utf-8") as fp:
    json.dump(res_list,fp,ensure_ascii=False)
#print(r["list"])
#http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
#http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById

请求返回的数据格式:
当我们发起请求之后,会获得返回的结果,我们用那种格式去接收,需要了解接收数据的类型是什么。
text
字符串文本格式的数据,尝尝用作 r.text

json
ajax网页的数据,常常为json格式,我们用 r.json() 会将数据直接解析为字典

content
当网页的数据为文件包,比如为图片,mp3, 视频等等数据时,我们需要用二进制数来进行接收,接收之后再用它原来的格式进行存储,才能保证数据的完整。r.content

json数据的用法:

json.load()
加载json文件数据为python可调用的字典数据,常用于导入文件时使用

with open("lixi.json","r") as f:
	p=json.load(f)

json.loads()
将json数据格式转化为字典,尝尝用于得到的url返回值为json数据格式。

r=request.post(url,data=data)
result=r.loads(r)  #被转换后可正常使用

json.dump()
用来将本地的字典数据,存储为字典格式文件。

with open("./requests_1028/"+filename,"w",encoding="utf-8") as f:  #持久化存储
    json.dump(j,f,ensure_ascii=False)   #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:

json.dumps()
json.dumps是将一个Python数据类型列表进行json格式的编码解析,

>>> import json
>>> print json.dumps('中国')
"\u4e2d\u56fd"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值