视频数据爬取
url:https://www.51miz.com/shipin/
爬取当前url页面中营销日期下的几个视频数据。
找寻每个视频的播放地址:
通过观察视频详情页的页面数据,并没有发现视频的播放地址,只有一张播放图片。
打开抓包工具,点击页面的播放按钮,找到了视频的播放数据包,可以提取出视频的播放地址,地址格式为:
代码
import requests
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}
url = 'https://www.51miz.com/shipin/'
response = requests.get(url=url, headers=headers)
page_text = response.text
# 数据解析
tree = etree.HTML(page_text)
div_list = tree.xpath('/html/body/div[2]/div[2]/div[1]/div[2]/div[2]/div')
for div in div_list:
src_list = div.xpath('./a/div/div/div/video/source/@src')
# 要给视频地址进行补全
for src in src_list:
# src就是一个完整的视频地址
src = 'https:' + src
video_data = requests.get(url=src, headers=headers).content
video_title = src.split('/')[-1]
with open(video_title, 'wb') as fp:
fp.write(video_data)
print(video_title, '爬取保存成功!')
Cookie
什么是cookie?
cookie的本质就是一组数据(键值对的形式存在)
是由服务器创建,返回给客户端,最终会保存在客户端浏览器中。
如果客户端保存了cookie,则下次再次访问该服务器,就会携带cookie进行网络访问。
典型的案例:网站的免密登录
爬取雪球网中的咨询数据
url:https://xueqiu.com/,需求就是爬取热帖内容
经过分析发现帖子的内容是通过ajax动态加载出来的,因此通过抓包工具,定位到ajax请求的数据包,从数据包中提取:
url:https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=311519&size=15
请求方式:get
请求参数:拼接在了url后面
代码:
import requests
import os
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
'cookie':'device_id=776dd9573632e238144202943a82bad3; acw_tc=276077b116981434047567142e4d1040609c9939d9d487ac9475ebdc43ed97; xq_a_token=e2f0876e8fd368a0be2b6d38a49ed2dd5eec7557; xqat=e2f0876e8fd368a0be2b6d38a49ed2dd5eec7557; xq_r_token=2a5b753b2db675b4ac36c938d20120660651116d; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTcwMDY5OTg3NSwiY3RtIjoxNjk4MTQzMzkyMjM1LCJjaWQiOiJkOWQwbjRBWnVwIn0.NRqC-VG8W1Zp9kscMQy8H1rHCgTP2jqm_v_nHIwnU6UeVcCmOY8acJOAMdDCS8ysLq22VUFF0b9_5RPwB3iXUf8qpXLrhIKEPukv2xssetUuvyueRFlUb8JrFMo5BSWMp22TaN1IH2TVuQOhBdDD0IeL1GBnYfiksLFGnhhlfk5TIZHEnmEokGHdg8W0ntn9C7kuhcCwCrtYOXRvR50Az9FANcbLDTiqpu22a9bx5P4SsD1XH6ap-8UwrQJ5yfQNfEY1UEHwRUuEl9S8TnjwN9Keb_avvwyk7wF-4LNlEsCrHakHAOzhZU_Gadm0UZaSMSzZaMis6b48J6czrvl0kQ; cookiesu=641698143404764; u=641698143404764; Hm_lvt_1db88642e346389874251b5a1eded6e3=1698143406; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1698143763'
}
url = 'https://xueqiu.com/statuses/hot/listV2.json'
param = {
"since_id": "-1",
"max_id": "311519",
"size": "15",
}
response = requests.get(url=url,headers=headers)
data = response.json()
print(data)
或者:自动获取cookie
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}
param = {
#如果遇到了动态变化的请求参数?必须经过测试才知道需不需要处理
"since_id": "-1",
"max_id": "553059", #动态变化的请求参数
"size": "25"
}
url = 'https://xueqiu.com/statuses/hot/listV2.json'
#session对象会实时保存跟踪服务器端给客户端创建的cookie
#创建一个session对象
session = requests.Session() #空白的session对象
first_url = 'https://xueqiu.com/'
#使用session对象进行请求发送:如果该次请求时,服务器端给客户端创建cookie的话,则该cookie就会被保存seesion对象中
session.get(url=first_url,headers=headers)
#使用保存了cookie的session对象进行后续请求发送
ret = session.get(url=url,headers=headers,params=param).json()
print(ret)
模拟登录
获取https://passport.17k.com/中的书架页面里的图书信息
代码:
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}
login_url = 'https://passport.17k.com/ck/user/login'
data = {
"loginName": "15027900535",
"password": "xxxxxxxxx"
}
session = requests.Session()
#请求的目的是为了获取cookie将其保存到session对象中
session.post(url=login_url,headers=headers,data=data)
#携带cookie向书架的页面进行请求发送,获取书架信息
#书架中的数据是动态加载的数据
book_url = 'https://user.17k.com/ck/author2/shelf?page=1&appKey=2406394919'
page_text = session.get(url=book_url,headers=headers).json()
#解析书架信息
print(page_text)
代理
什么是代理
代理服务器
代理服务器的作用
就是用来转发请求和响应
在爬虫中为何需要使用代理?
有些时候,需要对网站服务器发起高频的请求,网站的服务器会检测到这样的异常现象,则会讲请求对应机器的ip地址加入黑名单,则该ip再次发起的请求,网站服务器就不在受理,则我们就无法再次爬取该网站的数据。
使用代理后,网站服务器接收到的请求,最终是由代理服务器发起,网站服务器通过请求获取的ip就是代理服务器的ip,并不是我们客户端本身的ip。
代理的匿名度
透明:网站的服务器知道你使用了代理,也知道你的真实ip
匿名:网站服务器知道你使用了代理,但是无法获知你真实的ip
高匿:网站服务器不知道你使用了代理,也不知道你的真实ip(推荐)
代理的类型(重要)
http:该类型的代理服务器只可以转发http协议的请求
https:可以转发https协议的请求
如何获取代理?
芝麻代理:https://jahttp.zhimaruanjian.com/(推荐,有新人福利)
如何使用代理?
测试:访问如下网址,返回自己本机ip
这个代码可以测试自己的ip地址
代码:
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
}
url = 'http://www.cip.cc/'
page_text = requests.get(url,headers=headers).text
tree = etree.HTML(page_text)
text = tree.xpath('/html/body/div/div/div[3]/pre/text()')[0]
print(text.split('\n')[0])
现在使用代理服务器,测试一下是不是能返回代理服务器的地址
代码
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
}
url = 'http://www.cip.cc/'
page_text = requests.get(url,headers=headers,proxies={'http':'121.234.12.62:4246'}).text
# proxies 是一个字典:key是协议类型,值是ip+端口
tree = etree.HTML(page_text)
text = tree.xpath('/html/body/div/div/div[3]/pre/text()')[0]
print(text.split('\n')[0]) # 结果返回:121.234.12.62
# 这时应该返回的是代理服务器的地址,上面使用的是一个代理服务器
深度测试:
案例:https://www.kuaidaili.com/free/inha(当多次对这个网站发请求的话,这个网站会被封掉)
对快代理这个网站进行n次请求,直到本机无法访问快代理为止(证明本机ip被快代理封掉了)
构建一个代理池(封装了很多代理ip和端口的容器),用于数据的批量爬取
import requests
from lxml import etree
import random
import time
import random
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
}
# 构建一个代理池(有很多不同的代理服务器)
# 芝麻代理:https://jahttp.zhimaruanjian.com/
proxy_url = 'http://webapi.http.zhimacangku.com/getip?num=80&type=3&pro=&city=0&yys=0&port=11&pack=337730&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions='
page_text = requests.get(url=proxy_url, headers=headers).text
proxy_list = [] # 代理池 数据格式:[{},{},{}]
for ips in page_text.split('\n')[0:-1]:
dic = {}
dic['https'] = ips.strip()
proxy_list.append(dic)
for page in range(1, 5001):
print('正在爬取第%d页的ip数据......' % page)
# 生成不同页码对应的url
url = 'https://www.kuaidaili.com/free/inha/%d/' % page
page_text = requests.get(url=url, headers=headers, proxies=random.choice(proxy_list)).text
time.sleep(0.5)
tree = etree.HTML(page_text)
ip = tree.xpath('//*[@id="list"]/div[1]/table/tbody/tr[1]/td[1]/text()')[0]
print(ip)