Python之网络爬虫

跟風遠走 提交于 2020-03-12 21:17:47

 一、读取网页

1、使用自带的urllib模块

  • 引入自带的模块urllib
  • 使用文件里面的urlopen模块

(1)发送的是get请求:

from urllib.request import urlopen

url='http://www.nnzhp.cn/archives/423'

res=urlopen(url).read() #打开url,获取url的网页内容   发送的是get请求
print(res.decode()) #将结果返回的二进制类型转为字符串类型

(2)发送的是post请求:

from urllib.parse import urlencode  #由于不能直接传字典,要传二进制格式,所以导入该模块
url='http://api.nnzhp.cn/api/user/login'
data={'username':'niuhanyang','passwd':'aA123456'}
data=urlencode(data) #先将字典拼接成k-v格式 
print(data)  #结果:username=niuhanyang&passwd=aA123456
res=urlopen(url,data.encode()).read() #再将k-v格式转成二进制
print(res.decode()) #将返回的二进制转成字符串再返回
import json
d=json.loads(res.decode()) #为了获取value值,要将字符串转成字典
print(d.get('login_info).get('sign') #获取sign的value值

2、使用requests模块

  • 需要导入该模块:pip install requests

(1)发送的是get请求:

import requests
url='http://www.nnzhp.cn/archives/423'
res=requests.get(url)
print(res.text) #使用.text就不用decode()了,直接返回的就是字符串

(2)发送的是post请求:

url='http://api.nnzhp.cn/api/user/login'
res=requests.post(url,data={"username":"niuhanyang","passwd":"aA123456"}
print(res.json()) #直接返回的就是字典,这个模块里面已经封装好了由json串转为字典的代码
print(res.text) #返回的是字符串,json串

(a)post请求带参数,上传的是字典格式,使用data={}:

url='http://api.nnzhp.cn/api/user/login'
res=requests.post(url,data={"username":"niuhanyang","passwd":"aA123456"}
print(res.json()) #直接返回的就是字典,这个模块里面已经封装好了由json串转为字典的代码
print(res.text) #返回的是字符串,json串

(b)get请求带参数,上传的是字典格式,使用params={}:

url='http://api.nnzhp.cn/api/user/login'
res=requests.get(url,params={"username":"niuhanyang","passwd":"aA123456"}
print(res.json()) #直接返回的就是字典,这个模块里面已经封装好了由json串转为字典的代码
print(res.text) #返回的是字符串,json串

二、下载内容

1、下载文件:

  • 打开一个文件,将读取的网页内容写入到文件里,就相当于将内容下载到本地了。
url='http://api.nnzhp.cn/api/user/login'
res=requests.post(url,data={"username":"niuhanyang","passwd":"aA123456"}
f=open('a.html','w',encoding='utf-8') #打开一个文件
f.write(res)  #将读取的网页写入到文件里,就相当于将网页下载到本地
f.close() #关闭文件

2、下载mp3:

  • 导入requests模块
  • 使用.content方法,直接返回的就是二进制内容
MP3_url='http://qiniuuwmp3.changba.com/1113525663.mp3'
res=requests.get(MP3_url)
mp3=res.content  #返回的是二进制内容

f=open('sing.mp3','bw')  #保存内容到本地
f.write(mp3)
f.close()

三、Requests模块返回内容

  • .json()方法返回的是字典
url='http://api.nnzhp.cn/api/user/login'
res=requests.post(url,data={"username":"niuhanyang","passwd":"aA123456"}
print(res.json()) #直接返回的就是字典
  • .text返回的是字符串
import requests
url='http://www.nnzhp.cn/archives/423'
res=requests.get(url)
print(res.text) #使用.text就不用decode()了,直接返回的就是字符串
  • .content返回是二进制
MP3_url='http://qiniuuwmp3.changba.com/1113525663.mp3'
res=requests.get(MP3_url)
mp3=res.content  #返回的是二进制内容

 

四、请求带参数

  • 使用requests模块时

(a)post请求带参数,上传的是字典格式,使用data={}

(b)get请求带参数,上传的是字典格式,使用params={}

(c)post请求带参数,上传的是json串,使用json={}

五、实际应用

1、下载mp3:

  • 导入requests模块
  • 使用.content方法,直接返回的就是二进制内容
MP3_url='http://qiniuuwmp3.changba.com/1113525663.mp3'
res=requests.get(MP3_url)
mp3=res.content  #返回的是二进制内容

f=open('sing.mp3','bw')  #保存内容到本地
f.write(mp3)
f.close()

2、发送cookie:

  •  使用关键字cookies
  • 有多个cookie的时候逐个写入,用逗号隔开
res=requests.get(url,params={"k":"v","k1":"v"},cookies={"sss":"xxx","xxx":"xxx"})

3、发送headers:

  • 使用关键字headers
  • 有多个header的时候逐个写入,用逗号隔开
res=requests.get(url,params={"k":"v","k1":"v"},cookies={"sss":"xxx","xxx":"xxx"},headers={"xxx":"xxx","xxx":"xxx"})

如果cookie内容很多,可以利用headers,将内容写到一个字符串里作为value值,key的值为cookie即可。

s='pgv_pvi=2531856384; RK=OHwkPOBgdj; ptcz=993813dc462da58d0efd9c1c8d03124c48754c9fccf24ce6b2d9368a462ed230; pt2gguin=o0961813439; pgv_pvid=7944371706; o_cookie=961813439; pac_uid=1_961813439; eas_sid=x1O5L366d2l1h5f3d4q0U6Z2F1; _qpsvr_localtk=0.24147254941682927; pgv_si=s8574745600; uin=o0961813439; pgv_info=ssid=s6318813470; skey=@DBbSi69hx; p_uin=o0961813439; pt4_token=jVWe4EaLYK760H4Ep-j0BxkdDj917sUw6S5hMXuur28_; p_skey=*r63etdnFjY2mlXWh-rmfuT7s1K1SLl077FdOHXO6Vk_'
res=requests.get(url,params={'k':'v','k1':'v'},headers={'cookie':s})

4、上传文件:

url='http://api.nnzhp.cn/api/file/file_upload'
res=requests.post(url,files={'file':open('g.mp3','rb')} #使用二进制方式打开
print(res.json())

5、上传的是json串:

url='http://api.nnzhp.cn/api/user/add_stu'
data={"phone":"13277778889","grade":"三年二班","name":"颜无柳"}
requests.post(url,json=data) #传参传的是json串
print(res.json())

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!