Python爬虫学习日志——day2(requests)
requests是python的一个库,也是用来构建请求的,但是比urllib更加方便和强大。
对urllib不是很清楚的同学可以看我的上一部日志:Python爬虫学习日志——day1(urllib)
对于不同的请求方式,如GET,POST,PUT等,requests库提供了一系列简单明了的方法:
- get()
- put()
- post()
- delete()
- head()
- options(0
分别对应不同的请求方式,一目了然,下面就以get()方法为例:
一.get()
1.1cookies处理
使用urllib要获取网站的cookies则需要使用对应的handler创建特定功能的opener来实现,但是对于requests的get()方法,直接就可以通过返回对象的属性来获取cookies的值。
然后将cookies的值在下一次访问是放在headers里面,就可以自动放回登录后的结果。
代码示例:
import requestsurl = "https://www.baidu.com"
r = requests.get(url)
print(r.cookies)
for key,value in r.cookies.items():print(key+'='+value)
我们调用cookies的属性,通过输出可以发现它是RequestsCookieJar类型,然后用item()方法将其转换为元组组成的列表,遍历输出每一个cookies的名称和值,实现cookies的遍历解析。
1.2get()参数一:params
如果想要在发送请求时带上额外的信息,只需要在get方法里添加一个参数params,它的值是一个由需要添加的信息组成的字典。
代码示例:
import requestsurl="http://httpbin.org/get"
data={'name':'zhangfei','age':'10000'
}r = requests.get(url,params=data)
print(r.text)
在输出的结果的args里可以看到,我们输入的信息也一起发送给了服务器。
1.3get()参数二:headers
get()方法也可以像urllib.request的Request一样为请求加上headers的信息。如User-agent和Host等。
代码示例:
import requestsurl="http://httpbin.org/get"
data={'name':'zhangfei','age':'10000'
}
header={'User-agent':'Mozilla/5.0(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11','Host':'httpbin.org'
}r = requests.get(url,params=data,headers=header)
print(r.text)
运行后查看结果可以看到我们headers参数里的信息生效,我们成功伪装成了火狐浏览器对该网站进行访问。
1.4get()方法抓取二进制数据
get()方法还可以抓取图片,音视频等文件,返回的是它们的二进制码,直接输出的话是一些看不懂的乱码。我们抓取后只需要再将它们储存为对应的文件格式就可以在该文件中看到了。
代码示例:
import requestsurl="https://github.com/favicon.ico"r=requests.get(url)print(r.content)#输出该图片的二进制码
with open("favicon.ico","wb") as f:f.write(r.content)
上述代码中,我们抓取了github的站标图片,输出了它的二进制码,然后将该二进制码保存在.ico格式文件中,打开该文件就可以看到图片的原本样子了。
二.post()
post()就是POST请求的方法,跟上述的get()唯一不同的地方,就是post()的data参数,这个参数其实就是get()的params参数,是在访问网站时附带的信息。
代码示例:
import requestsurl="http://httpbin.org/post"
data={'name':'zhangfei','age':'10000'
}r = requests.post(url,data=data)
print(r.text)
从结果可以看到我们附带的信息以form表单格式在访问网站时一同发送给了服务器,POST请求成功。
三.响应
所谓响应就是在使用请求方法后,得到的结果对象(r),上文我们用r.text和r.content获取了响应的内容。
响应其实还包含很多其他属性,比如获取响应的状态码,响应头,cookies等。
代码示例:
import requestsurl = "http://www.baidu.com"
r = requests.get(url)
print(r.status_code)#响应状态码
print(r.url)#URL
print(r.cookies)#响应的cookies
print(r.headers)#响应头
print(r.history)#请求历史
四.requests的高级用法
4.1上传文件
有的网站需要上传文件时,我们使用post()方法,然后添加一个files参数,该参数的值有点特殊,是一个字典,键名为files,值名是用open方法打开目标文件。
files参数的格式为:files={'files':open('文件名','打开方式')}
代码示例:
import requestsurl="http://httpbin.org/post"
files={'files':open('favicon.ico','rb')
}
r = requests.post(url,files=files)
print(r.text)
上述代码就是将我前面创建的一个github的站标图片上传以post方式上传到该网站了。
在结果中可以看到文件上传是单独的一个files字段,而不是form字段。
五.Session对象
其实在requests里面,每次用get()或post()都是单独的一次访问,相当于每次都用的不同的浏览器进行的连接,是两个完全不相关的会话。这时就需要创建一个Session对象,通过它来访问这些网站。
它的作用是维护一个对话,使我们无论访问多少次这个网址,都是同一个会话,cookies是相同的。
代码示例:
import requestss = requests.Session()
s.get('http://httpbin.org/cookies/set/number/9999999999999')
r = s.get('http://httpbin.org/cookies')
print(r.text)
上述代码中先通过一个Session对象在该网站设置了一个cookie,值是999999999,然后再使用该Session对象重新访问该网页,获取cookie的值,可以看到是一样的,所以一个Session对象对应同一个会话
六.代理设置
代理设置就是防止在频繁访问一个网站时被封ip,使用ip代理就可以避免这个问题。
在urllib中设置代理需要使用相应的handler然后构造对应的opener,但是在requests中只需要在所使用的请求方法里加入proxies参数就可以了。该参数的值就是代理的地址。
代码示例:
import requestsurl = "https://www.baidu.com"
proxies = {'http':'http://10.10.1.10:3128','https':'https://10.10.1.10:3128'}requests.get(url,proxies=proxies)
上面的代理ip只是例子,请使用自己的ip地址来进行试验。
七.超时设置
其实就是在请求方法里添加一个timeout参数,一般用法与urllib的urlopen的timeout参数差不多(timeout=1表示一秒内没有响应就抛出异常),不同点在requests的timeout可以有两个值(timeout=(5,30))第一个是连接时间,第二个是读取时间。如果为timeout参数赋值为none或不设置timeout参数,就会一直等待下去。
八.身份验证
如果需要输入用户名和密码来验证身份,urllib的步骤为使用对应的handler创建opener然后访问该网站。在requests中自带验证功能就是在请求方法里面添加一个参数auth,它的参数值为一个元组,由两个字符串组成,第一个是用户名(账号),第二个是密码。
代码示例:
import requestsurl = "目标网页的url"
r = requests.get(url,auth=("user-name","password"))
print(r.text)
九.Prepared Request
正如urllib中的Request可以创建一个请求对象,在创建该对象时为其赋予headers等参数信息。requests也有这样的数据结构,就是Prepared Request。
代码示例:
import requestsurl="http://httpbin.org/post"
data={'name':'liaodi','age':'100'
}
headers={'User-agent':'Mozilla/5.0(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11','Host':'httpbin.org'
}
s = requests.Session()
req = requests.Request('POST',url,data=data,headers=headers)#创建一个Requests对象
prepped=s.prepare_request(req)
r=s.send(prepped)
print(r.text)
上述代码中,首先定义了一个Session对象s,然后创建了一个Request对象req,再通过Session的prepare_request()方法,将Request对象转化为Prepared Request类型的对象,赋值给名为prepped的变量。最后通过Session对象s调用send()方法发送该请求(发送Prepared Request类型的对象),将响应赋值给r变量。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
