主要内容:

  1. 模拟浏览器登陆
  2. 防盗链处理
  3. 代理

1. 模拟浏览器登录

  1. 登录 -> 得到cookie

  2. 带着cookie去请求到书架url -> 得到个人数据

  3. 可以使用session进行请求

    session可以被看作为一连串的请求,在这个过程中cookie不会丢失

实战-获取17k.com小说网的个人书架

import requests

# 会话
session = requests.session()
data = {
    "loginName": "***********",
    "password": "*****************"
}

# 1. 登录
url1 = "https://passport.17k.com/ck/user/login"
resp1 = session.post(url1, data=data)

# 2. 获取数据
# 刚才的session中有cookie
resp2 = session.get("https://user.17k.com/ck/author/shelf?page=1&appKey=**********")
print(resp2.json())

requests也可以达到相同的效果

headers = {
    "Cookie": "*******"
}
resp3 = requests.get("https://user.17k.com/ck/author/shelf?page=1&appKey=**********", headers=headers)

2. 防盗链的处理

实战-爬取梨视频视频

首先,直接查看网页源代码发现是图片,点击后才有视频地址

视频地址:https://video.pearvideo.com/mp4/adshort/20210712/cont-1734862-15716746_adpkg-ad_hd.mp4

然后F12查看包的地址,发现与视频地址不一致,有部分被替换:

请求URL:https://www.pearvideo.com/videoStatus.jsp?contId=1734862&mrd=**********

视频地址:https://video.pearvideo.com/mp4/adshort/20210712/1626080467817-15716746_adpkg-ad_hd.mp4

其中,1626080467817systemTime 的参数

image-20210712170532497.png

查看该视频的网址,发现替换规则:

image-20210712170629297.png

因此,爬取过程如下:

  1. 拿到contID
  2. 拿到VideoStatus返回的json,得到srcURL
  3. 把srcURL中的内容进行修整
  4. 下载视频
import requests

# 拉取视频的网址
url = "https://www.pearvideo.com/video_1734862"
contID = url.split("_")[1]

VideoStatusURL = f"https://www.pearvideo.com/videoStatus.jsp?contId={contID}&mrd=**********"

headers = {
    # 防盗链: 溯源,当前请求的上一级
    "Referer": "https://www.pearvideo.com/video_1734862",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67"
}

resp = requests.get(VideoStatusURL, headers=headers)
dic = resp.json()
systemTime = dic['systemTime']
srcUrl = dic['videoInfo']['videos']['srcUrl']
srcUrl = srcUrl.replace(systemTime, f"cont-{contID}")

# 下载视频
with open("a.mp4", mode="wb") as f:
    f.write(requests.get(srcUrl).content)

resp.close()

3. 代理

import requests

proxies = {
    "http": "ip:端口",
    "https": "ip:端口",
    "socks5": "ip:端口"
}

url = "网址"
resp = requests.get(url, proxies=proxies)
resp.encoding = 'utf-8'

resp.close()