我要爬爬虫(4)-初识requests模块

15 篇文章 0 订阅
4 篇文章 0 订阅

与urllib模块不同,requests模块发送请求可以用明确定义的函数实现,如:
requests.get()
requests.post()

不需要urlopen()和handler(),更加方便发送请求。

import requests,json
data={
    'name':'Tom',
    'age':1
}
re=requests.get('http://httpbin.org/get',data)
print((re.text))
print(type(re.text))
print(json.loads(re.text))
print(re.json())
print(type(re.json()))

这里写图片描述
结果看到request返回的是json格式的数据,使用json.loads()函数或者直接使用响应的内置json()函数可以转成dict格式。

利用正则表达式爬取内容

import requests
import re
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('http://www.zhihu.com/explore',headers=headers)
pattern=re.compile('question_link.*?data-za-element-name.*?>(.*?)<',re.S)
print(re.findall(pattern,r.text))

简单的正则使用,用.*?表示所有内容(.*?)表示要爬的所有内容。
re模块的compile()函数将正则表达式的字符串形式编译为Pattern实例。

get图片

import requests
r=requests.get('http://www.baidu.com/favicon.ico')
print(r.text)
print(r.content)

这里写图片描述
可以看到结果,图片的content是二进制数据;而text是乱码,因为图片本身是二进制数据,直接转成str,所以出现乱码。

post请求

import requests
data={
    'name':'Tom',
    'age':1
}
file={'file':open('favicon.ico','rb')}
r=requests.post('http://httpbin.org/post',files=file)
print(r.text)
r=requests.post('http://httpbin.org/post',data=data)
print(r.text)

这里写图片描述
可以看到form传值成功,files传文件成功,且二者分别是两个字段。

爬取图片并存储

import requests
r=requests.get('http://github.com/favicon.ico')
with open('favicon.ico','wb') as f:
    f.write(r.content)

以wb也就是二进制可写的格式,打开(也可以说是创建)favicon.ico文件,实例化一个可操作的句柄f,然后将图片的二进制内容写到文件里。

有头没头的区别

import requests
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('http://www.zhihu.com/explore')
#print(r.text)
#print('------------------------------------------')
r=requests.get('http://www.zhihu.com/explore',headers=headers)
#print(r.text)
print(r.headers)

把浏览器和操作系统的版本信息加入User-Agent里,向服务器”表明“我是一个浏览器发出的请求。不加就不让访问。

requests.code内置状态码

import requests
r=requests.get('http://www.zhihu.com')
exit() if r.status_code==requests.codes.ok else print('bad') if r.status_code==requests.codes.bad else print('failed!')

一般我们可以通过请求返回的status_code比如200,404来判断请求的状态;也可以通过request模块自带的状态码比较来确定请求状态,比如requests.code.bad=400。

cookie获取

import requests
r=requests.post('https://www.zhihu.com')
print(r.cookies)
for cookie in r.cookies.items():
    print(cookie)
for key,value in r.cookies.items():
    print(key+'='+value)

这里写图片描述
可以看到,items()函数可以把cookie转换成元组。

将登陆状态下的cookie保存,并加入到requests的headers里,可以访问登陆状态下的网页。

import requests,json
header={
    'Cookie':'_zap=6458ace3-1edf-4299-b8d4-ab9091e5c58d; aliyungf_tc=AQAAAEKJcASu8AgAh2swtvTdAh1ka0RI; _xsrf=a3adb075-779c-4024-ae60-6febe2f67f33; d_c0="AGCtroJkSg2PTtfrzlwPpyc1H80VmpRvUWs=|1521110703"; __DAYU_PP=mMjnjZUQfZmIm7Nb7j2Bffffffff8776db8f9c58; q_c1=b03af7dbbafd44f0a5632d0a41ad8f4d|1526133366000|1510569878000; __utmc=51854390; l_n_c=1; n_c=1; __utma=51854390.997924031.1514114614.1526815674.1526818086.4; __utmb=51854390.0.10.1526818086; __utmz=51854390.1526818086.4.3.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; tgw_l7_route=7139e401481ef2f46ce98b22af4f4bed; l_cap_id="YzQxYTc2MWQ4ZDBiNDQ1M2JmZjYyZDdmM2UxYTU2YzY=|1526818969|74c45f403d7f89c6814d20f931d752895572faa8"; r_cap_id="YmY2ZjRjMjUyYzk3NDRiOWFjYzU0M2U1ZWZiYjU1MGY=|1526818969|fd2843f198e9a0946a65971231d192cad7155a64"; cap_id="OTA3MTdlMTljODUxNGQzYWE5ZWY2YzA0MDU3ZmQxMzY=|1526818969|edea420073690dc46a27f009fa0730e2c488b01a"; __utmv=51854390.000--|2=registration_date=20140211=1^3=entry_date=20171113=1; capsion_ticket="2|1:0|10:1526819021|14:capsion_ticket|44:NTllNmQyM2I5OGM5NGRlMWJkNGQxYzJlYjAyODg5YWM=|e06d27186b6649cc794a284b8f8969a99873f2e721cde1f2f8da1c62b0e9cff7"; z_c0=Mi4xYkU0MkFBQUFBQUFBWUsydWdtUktEUmNBQUFCaEFsVk4zTGJ1V3dEV1o4N0FWT1JnYkk1NmxybG1Cd1RZRl9HQUdB|1526819036|bec8c376c3610229078d559195bb810ea009eb87',
    'Host':'www.zhihu.com',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('https://www.zhihu.com',headers=header)
print(r.text)

cookie调整格式,不加入headers中,而是直接赋值给请求的cookies参数。

import requests
cookie='_zap=6458ace3-1edf-4299-b8d4-ab9091e5c58d; aliyungf_tc=AQAAAEKJcASu8AgAh2swtvTdAh1ka0RI; _xsrf=a3adb075-779c-4024-ae60-6febe2f67f33; d_c0="AGCtroJkSg2PTtfrzlwPpyc1H80VmpRvUWs=|1521110703"; __DAYU_PP=mMjnjZUQfZmIm7Nb7j2Bffffffff8776db8f9c58; q_c1=b03af7dbbafd44f0a5632d0a41ad8f4d|1526133366000|1510569878000; __utmc=51854390; l_n_c=1; n_c=1; __utma=51854390.997924031.1514114614.1526815674.1526818086.4; __utmb=51854390.0.10.1526818086; __utmz=51854390.1526818086.4.3.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; tgw_l7_route=7139e401481ef2f46ce98b22af4f4bed; l_cap_id="YzQxYTc2MWQ4ZDBiNDQ1M2JmZjYyZDdmM2UxYTU2YzY=|1526818969|74c45f403d7f89c6814d20f931d752895572faa8"; r_cap_id="YmY2ZjRjMjUyYzk3NDRiOWFjYzU0M2U1ZWZiYjU1MGY=|1526818969|fd2843f198e9a0946a65971231d192cad7155a64"; cap_id="OTA3MTdlMTljODUxNGQzYWE5ZWY2YzA0MDU3ZmQxMzY=|1526818969|edea420073690dc46a27f009fa0730e2c488b01a"; __utmv=51854390.000--|2=registration_date=20140211=1^3=entry_date=20171113=1; capsion_ticket="2|1:0|10:1526819021|14:capsion_ticket|44:NTllNmQyM2I5OGM5NGRlMWJkNGQxYzJlYjAyODg5YWM=|e06d27186b6649cc794a284b8f8969a99873f2e721cde1f2f8da1c62b0e9cff7"; z_c0=Mi4xYkU0MkFBQUFBQUFBWUsydWdtUktEUmNBQUFCaEFsVk4zTGJ1V3dEV1o4N0FWT1JnYkk1NmxybG1Cd1RZRl9HQUdB|1526819036|bec8c376c3610229078d559195bb810ea009eb87'
head={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
    'Host':'www.baidu.com'
}
jar=requests.cookies.RequestsCookieJar()
for items in cookie.split(';'):
    key,value=items.split('=',1)
    jar.set(key,value)
re=requests.get('http://www.baidu.com',cookies=jar,headers=head)
print(re.text)

与上一例结果一样。
首先使用requests.cookies.RequestsCookieJar()函数实例化一个cookie对象jar;
其中用到split(‘=’,1)函数,第一个参数为分割符号,第二个参数为分割次数。
将分割得到的key和value值通过jar的set()函数赋值;最后jar直接作为请求的一个参数。

利用session保持同一个会话

不同的会话有不同的cookie。而使用session()这样可以用另一个请求访问之前请求设定的cookie值。

import requests
s=requests.session()
s.get('http://httpbin.org/cookies/set/number/123')
r=s.get('http://httpbin.org/cookies')
print(r.text)

ssl证书验证

由于12306没有官方CA证书,所以请求https站点会报错。

import requests
r=requests.get('https://www.12306.cn')

requests.exceptions.SSLError:HTTPSConnectionPool(host='www.12306.cn', port=443)
这里把verify参数设为False,就不会检查ssl证书。

import requests
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code)

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200

但仍会警告:强烈建议我们给它个证书。
可以设置忽略警告

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

或者用logging模块捕捉一下警告。

import requests
import logging
logging.captureWarnings(True)
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

最可靠的,我们可以指定本地一个证书,并加入到请求里。

import requests
response=requests.get('https://www.12306.cn',cert=('/path/证书','/path/密钥'))

使用代理

和urllib使用代理同理。

import requests
proxies={
    'http':'http:xxxxxxxxxxxxxx'
    'https':'https://xxxxxxxxxxx'
}
re=requests.get(url,proxies=proxies)

超时设置

request可以设置参数timeout来设置等待时间。
time=None一直等待
请求时间可以分为两部分:连接和读取。
所以timeout也可以分别设置两段时间,如
timeout=(2,3,10)

身份认证

对于网页访问时弹出的身份认证窗口,通过参数auth来输入用户名和密码
auth=('username','password')

请求实例化

利用requests模块下的Request和session函数。
首先用Request函数实例化请求,即把 请求方法,url,还有其他参数作为Request函数的参数构造一个请求。再用会话session的prepare_request函数将其转化为prepare request对象。最后通过会话session的send函数发送请求。

from requests import Request,session
url='http://httpbin.org/post'
headers={
    'Uset-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
data={'name':'Tom','age':'10'}
s=session()
re=Request('Post',url,headers=headers,data=data)
pre=s.prepare_request(re)
r=s.send(pre)
print(r.text)

可以看到和直接用post方法发送请求一样效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值