从 0 到 1 学爬虫:用 Python 爬取网页数据指南二(附实战案例)
对于上半部分,一些爬虫的知识点可参考此文。
一、前言
在前文种,介绍了一些基础知识点,可是我们在日常的爬取中,总会遇到一些网站(甚至是很多)爬取受挫;故此文将介绍一些初识爬虫的一些技巧。
二、处理cookie值——模拟登录
有一些网站,有一些内容必须是我们登陆之后·才可以显示出来。首先,我们需要了解cookie是什么?对于cookie,当我们登陆一个网站时,便会产生cookie用来网站知道我们是谁。它其实是一串码,当我们以后请求同一网站时,将码带过去。此时服务器便知道我们是谁了。
以user.17k.com为例,于是乎,我们就有了以下思路:
- 登录去得到cookie
- 然后带着cookie去请求到书架url得到我们的书架内容
所以我们必须把上面的两个操作连起来,此时便可以使用session进行请求。对于seesiom你可以认为是一连串的请求,在这个过程中cookie不会丢失。
session的使用方法如下:
import requests
session = requests.session()
接下来以小说网为例,在我们抓包的时候,会遇到“Paused in debugger”此时只需要点击箭头所指的部分就可以继续了,要注意是在Source里进行点击。
登陆成功后,通过抓包发现了登陆的网址
往下拉后便会发现cookie值
同时,在payload处可以发现其账号密码
然后便可以通过这些语句进行一个模拟登陆的过程
import requests
session = requests.session() #拿session对象
date = {
"loginName":"17856975341",
"password":"sin(30)Msy049527"
}
#1.登录
url = "https://passport.17k.com/ck/user/login"
session = session.post(url,data=date)
接下来登陆后,我们需要拿去其中的数据,进行源代码搜索,发现想要的数据并不在源代码中
所以此时只能通过抓包去查找数据,于是可以看到其URL是“https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919”
于是乎我们便可以,编写语句,要注意的是用seesion进行请求。也可以用requests进行请求,但是此时,上面session获取cookie就显得不重要了,可以直接通过法二函数进行书写。
#法一
resp = session.get("https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919")
#法二
resp = requests.get("https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919",headers={
"Cookie":"GUID=25c4d053-d289-43e0-87b9-a20d76772fc1; sajssdk_2015_cross_new_user=1; Hm_lvt_9793f42b498361373512340937deb2a0=1758178121; HMACCOUNT=B385CD001FAA3161; c_channel=0; c_csc=web; acw_sc__v2=68cbaed0dea5efb1275723ff87124fbf4bd8c39b; ssxmod_itna=eu0Q0KAI3x8f40L9YtDymDBQnD7DmEidM0fu4GXhmYDZDiqAPGhDC3bUgd4QQ2qEWDp04r3=58QnwvW=tBWfPirDCPGnDBFhfqQxYYkDt4DTD34DYDi2KDLDmeD+GqKDdEsNXzS2D3qDwDB=DmqG2ld=Dm4DfDDLn30qGbLQD4qDBDGtx2jNDG4Gf7uqD0LEIDohuDxGWbTtjYnNqcjDgYY=DjqGgDBLelcwn0lyGZDNgUpGFTOQxPeGuDG6ehTdqx0P9nwt086vpDEhYlA5=+Yha3AqDRExNiGCitBDiDhwB=XDBdA1PCDSfGgKBvnDSiyZeD==; ssxmod_itna2=eu0Q0KAI3x8f40L9YtDymDBQnD7DmEidM0fqA=nIQD/3YDF2dI=E=oKlYzBBaypzH8rTn0FD8xWNz/W9AyDmoP4Yvz8W+PMumqROG390VfKLiTpgbwx38fQvS13=ydvhUGREokTnX7b3fM73E0Dni4=LNedbig7W0gY+IXi+K8n7XQ2CR7b0qp7RUeKGNix=xPzTqfbuc4TpU8lWYyA2EsYmbCSrt++39sIR2+ZQR5v4m3cr=M+rdAs4Sql2fr1zGKWbY4TmIUbQjgQq+IzctvblF1gMFGMzFoM18iBzU70t=M4FkVdHdBrVe7zCwiWvXYYEib//0w7bxDhR+KfIuzUexvFu4Bpf5CUT/AFNlezlxrQWO8hib+B8hL/bl0bQaqQwPr7OMDbGCTs/A5ZGAjnC433D07803eODKExRgzrTE6iKyMEl8+Qa5=Y3G7k208zDsdkLS0L57NOpE7r+gBDHBD8rKfP=GY5=YUp35M0oFxLuoxSZDl7aD7=DYIiXv5m99UxxDhAQ0E42fI3xBe7ta57CH6j5BWxlGwo0msRwOQ2U0eZGaK2Wc0NlGN+lqp=4eD==; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F12%252F32%252F88%252F104288832.jpg-88x88%253Fv%253D1758179303000%26id%3D104288832%26nickname%3DFreedom049527%26e%3D1773732252%26s%3Dbe5b09889cc66379; tfstk=gONiLjDydRk1FpO6IZc1BR9UBvBKffGjdodxDjnVLDoIDNitXrr0ozkq7CrTKmqUxclx65C0nDlZhRnxXmc0lubd2_C85PGj3gIRwip7FfGS7duwDvJErj0aKspP6PGjgMLpgTCu5lO6T9cZgwcEo4oqgIrqLvoIlq-ZuC738Die_dJZQBzE54uq0olV-yoIujo40x738DgqgmkK0Oo_gWPF0SBmKpk0JW0iI0zhFnxqEQHn4PnHggPnSnoz7DA2g0YAkrz3WGA7JfaUq4EOTCquPWZn8u5cxjZQ3ou0Y_tx18E_Nv4CUBzKsDkrzW72amFgpzonZE5a-fmiU5HNZaZz-ry-KWQPNfcZb-h_kUjT-5qT5W4vupli6JDusb5WbmeLrS00Gi13qzNQx2rPiGSzvpJPq1Oj8ZFHhKMZR2m8Pt_7O5QplR7h-L7jQ2gs2wbHhKMZR2mR-wvPlAuI50C..; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22104288832%22%2C%22%24device_id%22%3A%221995b9515327e0-08c385756cd7608-26011051-1327104-1995b9515331c41%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fgraph.qq.com%2F%22%2C%22%24latest_referrer_host%22%3A%22graph.qq.com%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%7D%2C%22first_id%22%3A%2225c4d053-d289-43e0-87b9-a20d76772fc1%22%7D; Hm_lpvt_9793f42b498361373512340937deb2a0=1758180253"
})
print(resp.json())
三、防盗链的处理
我们以梨视频为例,通过查看页面源代码发现我们想要的视频链接并不在页面源代码中。通过抓包,我们可以看到视频的链接的有关信息可以在这里查看到,但此时只能说明他们有联系,但不能说这个就是视频链接。
对比在Elements找到的视频链接与抓包得到链接对比
我们发现,真实的视频链接与抓包得到的其中有相似处,所以我们只需要抓到相应的视频链接,然后通过替换便可以得到了视频链接。
所以便有了爬取思路:
- 拿到cont-ID
- 拿到videoStatus返回的json。
- 然后拿到srcURL srcURL里的内容进行修整
- 下载视频
首先要定义url,我们最开始的url是必须要有的,因为我们通过对比,发现视频链接和初始url有相关部分。所以,定义url并通过取出数字为了以后的拼接做准备。
url = "https://www.pearvideo.com/video_1783219"
comtid = url.split("_")[1]
同时构造需要爬取的抓包链接,即
videostatus = f"https://www.pearvideo.com/videoStatus.jsp?contId={comtid}&mrd=0.8617090452881646"
当我们构造好后,进行爬取,发现其出现了如下图所示的报错。此时就需要添加防盗链,即告诉该页面我是从哪里来到这里的(溯源)
添加referer后,我们发现了可以抓取到videoInfo
对比链接“https://video.pearvideo.com/mp4/third/20230602/cont-1783219-10305425-001616-hd.mp4”我们可以做出以下拼接,.replace()用法是将sysTemtime用f"cont-{comtid}"替换。于是成功获取url,完整用法如下:
str.replace(old, new[, max])
#old -- 将被替换的子字符串。
#new -- 新字符串,用于替换old子字符串。
#max -- 可选字符串, 替换不超过 max 次
srcURL = srcURL.replace(sysTemtime,f"cont-{comtid}")
成功爬取,附上完整代码:
#1.拿到cont-ID
#2.拿到videoStatus返回的json。然后拿到srcURL
#3.srcURL里的内容进行修整
#4.下载视频
import requests
header={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"referer":"https://www.pearvideo.com/video_1783219"
}
url = "https://www.pearvideo.com/video_1783219"
comtid = url.split("_")[1]
videostatus = f"https://www.pearvideo.com/videoStatus.jsp?contId={comtid}&mrd=0.8617090452881646"
resp = requests.get(videostatus,headers=header)
dic = resp.json()
srcURL = dic["videoInfo"]["videos"]["srcUrl"]
sysTemtime = dic["systemTime"]
#https://video.pearvideo.com/mp4/third/20230602/cont-1783219-10305425-001616-hd.mp4
srcURL = srcURL.replace(sysTemtime,f"cont-{comtid}")
#下载视频
with open("a.mp4",mode="wb") as f:
f.write(requests.get(srcURL,headers=header).content)
四、代理
使用代理的原因:对于一些需要爬取很多次的页面,当我们频繁访问其网页的时候,有时候会遇到封锁IP,此时就会需要代理了。
代理:就是使用第三方的机器来代理的请求。同时有着一些弊端:
- 速率慢
- 代理IP不好找
具体代码演示:
#代理,使用第三方的机器来代理的请求
import requests
#"https://www.kuaidaili.com/free/intr/1" 代理网站
url = "http://www.baidu.com"
#准备代理信息
proxy={
"http":"http://180.121.233.11:18370",
"https":"https://180.121.233.11:18370"
}
#proxies 代理参数
resp = requests.get(url,proxies=proxy)
resp.encoding="utf-8"
print(resp.text)