心得: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"