22.2.14session和反反爬处理
1.session:
-
-
requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。
-
code:
-
import requests
url='http://www.renren.com/PLogin.do'
id = input('请输入用户名:')
pw = input('请输入密码:')
data = {
"email": id,
"password": pw}
headers={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
session=requests.session()
session.post(url,data=data,headers=headers)
response=session.get("http://www.renren.com/880151247/profile")
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(response.text)
-
2.反反爬处理
-
反反爬主要是处理user-agent,cookie,referer,定期sleep,加代理等等。
-
处理user-agent,cookie,referer都是一样的套路,在浏览器的抓包工具中找到对应的值,包装到headers中,再请求url时传入headers。定期sleep主要是为了防止一瞬间对网址的访问量过大,致使网址给你的账号封禁。
-
使用代理:
-
proxies = {
"http":"http://代理IP"
或者
"https":"https://代理IP"
#注意要和你访问的url前面的一致,你的url前面是http就在proxies里面用第一个,如果是https就用第二个。
}
requests.get(url,proxies)
-
-
这里以爬取梨视频为例,下载某一个视频:
-
import requests
from lxml import etree
def refererPrt():
url = "https://www.pearvideo.com/video_1751556" #练习爬取的网站是湿湿的,url可能会过期
#拿到开头url中的视频编号:
vedioId = url.split("_")[1]
# https://video.pearvideo.com/mp4/short/20220211/1644668544573-15825835-hd.mp4 404 f12 systemTime: "1644668544573"
# https://video.pearvideo.com/mp4/short/20220211/cont-1676274-15825835-hd.mp4 right 源码
#思路:分别拿到上面两个url,再将systemTime替换成cont-1676274
#1676274是视频的url("https://www.pearvideo.com/video_1676274")中有
# https://www.pearvideo.com/videoStatus.jsp?contId=1676274&mrd=0.7848558827776768
vedioStudios = f"https://www.pearvideo.com/videoStatus.jsp?contId={vedioId}&mrd=0.7848558827776768"
#这个链接在f12 network fech/xhr headers requests url可以拿到
#未能得到想要的信息:提示该文章已经下线。 解决方法:反反爬(添加User-Agent、处理cookie、处理防盗链referer等等,这里处理防盗链referer即可)
headers = {
"Referer": url #防盗链,可以理解为溯源 本次请求的上一级是谁(在本次练习中必须是拉取视频的网址,即开头的url)
}
#加入这个headers就能拿到我们想要的内容
response = requests.get(vedioStudios,headers = headers)
# print(response.json())
systemTime = (response.json())['systemTime']
vediourl = (response.json())['videoInfo']['videos']['srcUrl']
# print(systemTime)
# print(vediourl)
#拿到systemTime和vediourl,下一步就是做替换
#print(vedioId)
vediourl = vediourl.replace(systemTime,"cont-"+vedioId)
#print(vediourl)
#拿到视频地址,接下来用文件的形式存下来
with open("vedio.mp4",mode="wb") as f:
f.write(requests.get(vediourl).content)
f.close()
if __name__ == '__main__':
refererPrt()
-
-
-