把cookie对象转换成字典
requests.utils.dict_from_cookiejar
把cookie值转换成Python的字典形式
requests.utils.cookiejar_from_dict
把Python的字典生成cookiejar形式
import requests
def main():
url = 'https://www.csdn.net/'
response = requests.get(url)
print(response.cookies) # 返回的结果为requests.cookies.RequestsCookieJar类型
# 把cookie值转换成Python的字典类型
print(requests.utils.dict_from_cookiejar(response.cookies)) # 返回的结果为字典类型
data = {'dc_session_id': '10_1578585500018.380464', 'uuid_tt_dd': '10_30291552180-1578585500018-204559', 'acw_tc': '2760829e15785855000142693e932dc23200dbf1d6a5e569f5a0bacfe97297'}
print(requests.utils.cookiejar_from_dict(data))
请求SSL证书验证
使用方法:verify=False
,默认情况下verify为True
"""请求SSL证书认证"""
url = 'https://www.12306.cn/index/'
response= requests.get(url,verify=False) # verify 代表着证书 默认值为True
print(response.text)
设置超时设置
"""请求超时,设置超时"""
url = 'https://chrome.google.com/.com'
respsone = requests.get(url, timeout=10) # 设置超时,当超过十秒之后,会放弃请求
print(respsone.text)
也可以配合代理IP来使用请求超时
当超过十秒访问不到的时候,请求超时,抛出异常
"""设置请求,配合着代理IP使用"""
url = 'https://chrome.google.com/'
proxies = {'HTTPS': '114.239.144.185:808','HTTPS': '163.204.240.172:9999'}
response = requests.get(url,proxies=proxies,timeout=10) # 准备一大堆代理配合着IP和设置请求超时使用。
html = response.text
print(html)
配合状态码判断是否请求成功
assert
:Python当中有个assert这个方法,这个方法可以结合爬虫的网络请求来写
assert response.status_code == 200
assert
:这个方法请求成功的时候会直接pass
,不会返回任何结果
retrying
安装方法:pip install retrying
可以使用retrying
里面的retry
这个装饰器
stop_max_attempt_number
:这个方法是设置代码请求的次数,当达到一定的次数都无法访问的时候,将会抛出异常
为什么要使用这个方法呢?因为在请求的过程中,我们不知道是网络的原因,还是代码写错的原因,可以这么写,可以结合IP代理池使用
import requests
from retrying import retry
"""抓取数据"""
@retry(stop_max_attempt_number=3)
def get_url(url):
print('代码执行了几次')
response = requests.get(url, timeout=5)
assert response.status_code == 200
return response.text
"""异常捕获"""
def get_exception(url):
try:
html_str = get_url(url)
except:
html_str = None
return html_str
if __name__ == '__main__':
url = 'https://wwws.csdn.net/'
print(get_exception(url))
爬虫数据-json
数据提取
什么是数据提取?
简单的来说,数据提取就是从相应中获取我们想要数据的过程
数据分类
非结构化数据:HTML
处理方法:xpath 、 正则表达式 、 BeatuifSoup4
结构化数据:json 、 xml
处理方法:转换成Python数据类型
数据提取之json
由于把json数据转化为Python内建数据类型很简单,所以爬虫中,如果我们能够找打返回json数据的URL,就会尽量使用这种URL
JSON是一种轻量化的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互
注意:json的数据类型都是以双引号来编写
json.loads()
:是将json字符串转换成Python数据类型
json.dumps()
:将Python数据类型转换成json数据类型
json.load()
:包含json的类文件对象转换成Python数据类型
json.dump()
:把Python数据类型转换成包含json的类文件对象
掘金案例
import requests
headers = {
'Connection': 'keep-alive',
'X-Legacy-Device-Id': '',
'Origin': 'https://juejin.im',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36',
'X-Legacy-Token': '',
'Content-Type': 'application/json',
'X-Legacy-Uid': '',
'X-Agent': 'Juejin/Web',
'Accept': '*/*',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Referer': 'https://juejin.im/user/5dc143bd6fb9a04a7b29ccaf',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6',
}
data = '{"operationName":"","query":"","variables":{"ownerId":"5dc143bd6fb9a04a7b29ccaf","size":20,"after":"1572946941301"},"extensions":{"query":{"id":"b158d18c7ce74f0d6d85e73f21e17df6"}}}'
response = requests.post('https://web-api.juejin.im/query', headers=headers, data=data)
print(response.json())