python爬虫--cookie、防盗链、代理
处理cookie
1.cookie就是在浏览器登录页面的时候,你把你的的账号和密码输入,主机会接受到你的用户名和密码,然后校验正确性,如果用户名和密码正确,主机会向你的浏览器里面的cookie里面写入一串代码,以后你如果再次向服务器发送请求就会带着这个cookie去访问主机。
在我们学的之前的爬取的三大方法里面,我们抓取的都是可视化的,即你可以找到你想爬取的内容,但是当我们碰到需要用户登录的时候,会出现一点问题。比如一些页面在登录以后,你需要爬取里面“我的”的内容,像”你的浏览“、“你保存的东西”,这样爬取需要两步:第一步就是登录得到cookie。第二步就是带着cookie去请求url。我们要是直接用requests请求去爬取里面的数据,会显示用户信息错误i,这样的话有两个解决方案:第一就是用session进行请求,这样的话cookie就不会消失 第二就是可以在requests中直接加入cookie 。
1.用session请求cookie
我们这里以17k小说网为例,拿到17k小说中“我的书架”中的内容。我们主要就是要拿到这个访问的url ,我们在登录之后,在检查页面找到login这个目录,login里面的url就是我们要去请求的url
当我们第一次拿到我们想要请求的这个url之后,我们要到“我的书架”拿到我们想要的东西,这时候如果用requests进行请求的话,会开始一个新的请求。我们刚才拿到的cookie就会消失,所以用session请求将两个步骤连起来。用session请求“我的书架”上的数据也是一样的,在检查页面找到“我的书架”里面的内容,访问url就可以了
import requests
session = requests.session()
data = {
'loginName': '11111',
'p——w': ''
}
#1.登录
url = 'https://passport.17k.com/ck/user/login'
session.post(url,data=data)
#2.拿到书架上的数据
session.get("https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919")
2.在requests请求中直接加入cookie
之前说过,如果我们直接用requests去请求“我的书架”的内容 就会出现这样的问题
这样我们就需要在我们请求的url里面找到一长串的cookie 然后复制粘贴进去
防盗链
我们这里以抓取梨视频为例子,在我们抓取梨视频的时候,在检查页面可以定位到视频本身是video这个标签,但是在页面源代码中并没有任何显示任何video标签,这样用爬虫爬取视频的时候就定位不到
这样有一个问题,我们在检查页面中的开发者工具和页面源代码是有偏差的。检查页面中的开发者工具显示的是实时的页面数据,里面可以找到这个video标签
我们通过开发者工具定位到视频我们就会找到这个视频本身的url,但是我们复制粘贴访问是什么也没有的,这时候我们就要对比页面源代码那个<video>标签中的url和我们在开发者工具中的url。
我们发现前面都是一样的,一直到20170314后面的内容不一样,而后面不一样的内容就是上面可以找到的systemTime。呢我们在爬取的时候只需要将中间的内容替换就可以拿到了。我们就需要以下几步
#拿到contid
#拿到video_status返回的srcurl
#对srcurl中的内容进行修正
#拿到视频真正的下载路径进行下载
import requests
url = 'https://www.pearvideo.com/video_1047268'
contid = url.split("_")[1]
video_status = f"https://www.pearvideo.com/videoStatus.jsp?contId={contid}&mrd=0.22973357777189096"
resp = requests.get(video_status)
print(resp.text)
但是我们做到这一步,我们根本拿不到里面的内容,里面会显示,这就是一个防盗链的问题
我们通常会加上开发者工具页面的refer,这就是一个防盗链,可以认为就是一个溯源,即本次请求的上一级是谁。我去查了一下他的专业解释和目的
图像来自@studyphp123
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
'Referer': 'https://www.pearvideo.com/video_1047268'
}
这样加上溯源就可以解决防盗链的问题
最后我们要把我们想要的srcurl解析出来 就得从这一串json中定位,找到srcurl将它切出来
并且还需要systemtIme 同样的方法拿出来,之后进行位置交换,最后写入文件就可以了
dic = resp.json()
srcUrl = dic['videoInfo']['videos']['srcUrl']
systemTime = dic['systemTime']
srcUrl = srcUrl.replace(systemTime,f'cont-{contid}')
# print(srcUrl)
with open("7.1day",mode='wb') as f:
f.write(requests.get(srcUrl).content)
代理
加入你想拿到大量的数据去访问一个网站,你一秒钟访问了很多次,网站就会对你封锁ip 这时候就会用到代理。但代理也算是一个黑色地带,不建议大家使用
原理:通过第三方机器去发送请求
首先可以在网上搜索到一些免费的代理,然后找到ip和端口,跟之前加上headers一样加上一个pories就可以实现代理
porxies = {
"https" : "https://47.101.41.163:8080" ,
}
resp = requests.get("https://baidu.com",proxies=proxies)