183 views
python爬虫

3.requests库使用2

文章目录

cookiejar与dict转换

一般cookie在登录某个网页时会产生相关的cookie数据,这个cookie会有时间限制
cookie失效后,需要重新登录

requests.utils.dict_from_cookiejar   将cookiejar转化为dict
requests.utils.cookiejar_from_dict   将dict转为cookiejar

import requests

url='https://www.baidu.com/'
r=requests.get(url)
c=r.cookies
print(c)

d=requests.utils.dict_from_cookiejar(c)
print(d)
--------------------------------------------------------
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
{'BDORZ': '27315'}

请求SSL证书验证问题

verify=False 不验证SSL,默认为True,请求https网站需要改为False
response = requests.get('https://www.12306.cn/index/',verify=False)

解决因为ssl验证问题的告警信息:
import requests
requests.packages.urllib3.disable_warnings()

断言的使用

关键词:assert
assert response.status_code == 200
当assert后面的执行成功时,代码继续往下面走,如果不成功则抛出异常AssertionError

try:
    assert code == False
    print(code)
except AssertionError:
    print(111111111)

URL地址的编解码

requests.utils.unquote()    解码
requests.utils.quote()      编码

当url中的中文出现类似乱码的情况,可以使用该方法
str='%E4%BD%A0%E5%A5%BD'
str1='你好'
print(requests.utils.unquote(str))
print(requests.utils.quote(str))
--------------------------------------------------
你好
%25E4%25BD%25A0%25E5%25A5%25BD

设置超时timeout与重试retrying

timeout:在requests请求时,加上timeout=3,连接超时3秒还没访问成功,就会报错了
retrying:其实就是在函数前面加个装饰器
@retry(stop_max_attempt_number = 3) #3是重试的次数
def fun():
    pass


import requests
from retrying import retry
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
@retry(stop_max_attempt_number = 3)
def _parse_url(url):
    print('代码执行了几次?')
    response = requests.get(url,headers=headers,timeout=3)
    assert response.status_code == 200
    return response.content.decode()
def parse_url(url):

    try:
        html_str = _parse_url(url)
    except:
        html_str = None

    return html_str

if __name__ == '__main__':
    url = 'http://www.baidu.com'
    print(parse_url(url))

设置py文件的字符编码

# 查看当前文件的字符编码
import sys, requests
print(sys.stdout.encoding)

# 经常会碰到传递参数时,字符编码报错,可以加上这个试试
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

requests传参注意

# post传递form data:
requests.post(url,data=data)

# post传递Request Payload:
requests.post(url,data=json.dumps(data))

# get传递参数:
requests.get(url,params=data) #这里用的是params 需要注意

下载图片的方法

方法一:
import requests

url = 'https://www.baidu.com/img/bd_logo1.png?qua=high&where=super'
response = requests.get(url)
# print(response.content)
# b 字节  图片的内容
with open('baidu.png', 'wb') as f:
    f.write(response.content)

方法二:
from urllib.request import urlretrieve
urlretrieve(url, path)  
# url:下载的url地址
# path:下载后存放的路径