1.request库基础用法
1.1get()及post()对比解析(发送请求)
# 百度举例
import requests
url = 'https://www.baidu.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'}
res1 = requests.get(url)
res2 = requests.post(url,headers=headers)
print(res1,res2,sep='\n')
<Response [200]>
<Response [200]>
# 不同点:请求方式不同,一种是以get请求访问百度,另一种是以post请求访问百度
# 相同点:均是返回状态码
ps:若请求中返回了302-->爬虫可能被察觉,导致重定向
# get(url, params=None, **kwargs)
# 在百度中搜索尊龙
wd = {'wd':'尊龙'}
ref1 = requests.get(url,params=wd,headers=headers) # params(中文意思参数)可指定在url中获取wd(参数)的内容-->200
# 此处因受到百度的反爬机制导致获得的url为安全验证,在cookie中详细解决此问题
总结:
requests.get(url, params=None, **kwargs):发起get请求访问网页
requests.post(url, data=None, json=None, **kwargs):发起post请求访问网页
相同点:返回值均为状态码
不同点:
1.请求方式
2.get中可利用params来获得一个具体的url值(例子中可获得搜索尊龙的url)
3.post中可利用data来获得一个form表单里的数据(在本文末尾的练习中使用)
1.2text与content对比分析(获取响应对象)
print(ref1.text)
# .text获取响应对象(得到url里面的内容),不可指定解码方式-->有几率乱码
# .text中指定解码方式:ref1.encoding = ''-->达到与content.decode('')一样的效果
print(ref1.content.decode('utf-8'))
# .content获取响应对象,可指定解码方式
print(type(ref1.text)) # <class 'str'> --> str类型数据
print(type(ref1.content)) # <class 'bytes'> --> 字节流数据(二进制)
print(type(ref1.content.decode('utf-8'))) # <class 'str'> --> str类型数据
总结:
text–>返回的是unicode(文档)str类型数据,且在未指定编码方式时,计算机自行判断,有几率产生乱码
content–>返回的是bytes字节流数据(图片等)并以二进制显示,可在尾添加decode()进行解码,手动指定解码方式
相同点:目的都是为了获取相应对象的数据
不同点:
1.text得到str类型数据而content得到bytes类型数据
2.text不可在尾添加解码方式,需在另一行使用res.encoding = '编码’来进行解码,否则将由计算机随机判断,有几率出现乱码
content可在尾添加解码方式,使用decode(‘编码’)
补充:使用response.url可获得响应对象的url
1.3requests中设置代理IP的方法
import requests
proxy = {'http':'171.35.221.220:9999'}
requests.get(url,proxies=proxy)
requests.post(url,proxies=proxy)
总结:在get或者post中使用proxies=’'指定ip地址 proxy = {‘http/https’:‘IP:port(端口号)’}
免费代理ip网站
1.4cookie
1.4.1为什么需要cookie?
http没有连接协议,无法记录信息,故需要cookie通过客户端来记录信息从而确认用户的身份
(http是一个应用层的面向对象协议,五大特点:1.支持客户/服务器模式(可用于计算机)2简单快速3.灵活
4.无连接(接收到信息后断开连接,与服务器的交互仅仅是 请求/响应 过程。可节约传输时间)
5.无状态(没有记忆功能,也就是不能保存信息来确认用户身份)
主要是因为后两个特点导致爬虫需要cookie.)
1.4.2用法
import requests
url = 'https://www.baidu.com/'
res = requests.get(url)
print(res.cookies) # 获得cookies
print(res.cookies.get_dict()) # 获得cookies里面的信息值
# 使用cookie模拟登陆b乎
import requests
url = 'https://www.zhihu.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19','cookie':'_zap=9b7748be-318a-45f5-a171-19d9ced35d95; d_c0="AMDVFna79BCPTt37TsCT9IuJKDP1arpAn0k=|1584081611"; _ga=GA1.2.2056409722.1584081612; _xsrf=PuUAImYeibRO89abwZkycZVxYLpnXp27; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1588339632,1588339972,1588341852,1588514577; _gid=GA1.2.1265396060.1588514577; SESSIONID=HjzY0Hw1nUtfQO130KI3nZwL62I7WOBY1yYJFDDNujD; JOID=UV4VCkOFSL-xgTujdo9G4Pts-JtkyCTM6bp20k7gGM3e0X-XQ5KIGeWPOKx-l39z12Ab0dE5s18cZ_HXAaKj4I4=; osd=VlkRA0yCT7u4jjykcoZJ5_xo8ZRjzyDF5r1x1kfvH8ra2HCQRJaBFuKIPKVxkHh33m8c1tUwvFgbY_jYBqWn6YE=; l_n_c=1; r_cap_id="OTMzNmU0OWExNjVkNDMxYWJjOTY1Nzg2NGQxZmQzZjI=|1588514605|087ae692c4179e2d8d009da338778d4027f81ceb"; cap_id="YTRhNjhiNzk2ZWJlNGY4OTlkMmI2OTM5MDc3ODNlYWM=|1588514605|61ee44fb3541c58c437d6848e6032355199878f3"; l_cap_id="YTUxYWM1NWZlZGRhNDI0NWIwY2UxMmNkODc1MWNiZjg=|1588514606|ea712eb69fa8149f6d0de65fee669f32e7a15e99"; n_c=1; atoken=9F4E00DDC0E0CC3CEAFBB118DEAE6179; atoken_expired_in=7776000; capsion_ticket="2|1:0|10:1588514616|14:capsion_ticket|44:Nzk3NmFmNDkxZTkwNDg4OWJiMmU5NzUxNmYzNzg5Y2Y=|7cd12941062f4f2f2e0208404f3173bb5a7b001522f4de8e1a2fc82813bb443a"; auth_type=cXFjb25u|1588514621|2383a3f7bae3d86ca9d0159783b5fca366fcb0ef; token="OUY0RTAwRERDMEUwQ0MzQ0VBRkJCMTE4REVBRTYxNzk=|1588514621|997052a50c3ff20505fcf7280cacee5056371e2a"; client_id="MEVERjM0MDYxQjkxQzJFQzkyMjYzNzU4RkM5RDM5QzE=|1588514621|24e004864342192fc233d5b382b3166bd1c72786"; z_c0=Mi4xd2hDd0JRQUFBQUFBd05VV2RydjBFQmNBQUFCaEFsVk5VaDJjWHdEclV4Ry1TdGJCczBwU1U3U2NpMmhWT3d3R1BB|1588514642|54efb8ca3e4b93a3c974c9776f275737c84c0d34; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1588514643; KLBRSID=d1f07ca9b929274b65d830a00cbd719a|1588514938|'}
res = requests.get(url,headers=headers)
print(res.content.decode('utf-8'))
# 此时可看到首页等等信息表示登陆成功
1.5session
1.5.1为什么需要session?
通过服务器来记录信息从而确认用户身份,也是为了用来跟踪用户的状态,爬虫的session指一个会话(进行一个会话时,保持登陆状态)。
ps:cookies作用于客户端,session作用于服务器,cookies在客户端记录用户信息,一般保存在浏览器,关闭浏览器则失去信息,除非cookies将数据作用于硬盘,一般浏览器利用session来保存用户数据从而保持登陆状态。session是在服务器保存用户信息从而来维持会话。
(可能有误,待学习纠正)
1.6处理不信任的SSL证书
1.6.1什么是SSL?
一种由CA机构验证身份后颁发的证书,具有服务器身份验证与数据传输加密的功能
1.6.2处理方法
使用requests.get(url,verify=False)
练习
# 1.在python中实现有道翻译
import requests
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'}
key = input('请输入要翻译的内容:')
data = {'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15885055068052',
'sign': '9e0d414e71d5c7cb3c87acd732c96d31',
'ts': '1588505506805',
'bv': 'b286f0a34340b928819a6f64492585e8',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
html3 = requests.post(url,data=data,headers=headers)
res = html3.content.decode('utf-8')
r_dict = json.loads(res) # 转化为字典类型
print(r_dict)
# {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 2, 'translateResult': [[{'src': '你好', 'tgt': 'hello'}]]}
result = r_dict['translateResult'][0][0]['tgt']
print(result)
# 12306识别验证码
import requests
import random
res = requests.session()
def login():
# 得到验证码
pic_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'
pic_resp = requests.get(pic_url)
res = pic_resp.content
# res = pic_resp.text # TypeError: a bytes-like object is required, not 'str'
fn = open('code.png','wb')
fn.write(res)
fn.close()
# 识别
coordinate = input('请输入坐标')
url = 'https://kyfw.12306.cn/passport/captcha/captcha-check?'
headers = [{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36','User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'}]
proxy = {'HTTP':'110.243.16.2:9999'}
data = {'callback': 'jQuery191015721073812449182_1589104599786','answer': coordinate,'rand': 'sjrand','login_site': 'E','_': '1589104599790'}
headers1 = random.choice(headers)
response = requests.post(url,headers=headers1,proxies=proxy,data=data)
print(response.text)
login()