代理池的搭建
# 搭建步骤
-1、git clone git@github.com:jhao104/proxy_pool.git
-2、在pycharm中打开项目
-3、创建虚拟环境,并且安装依赖
pip install -r requirements.txt
-4、修改配置文件:DB_CONN = 'redis://127.0.0.1:6379/0'
-5、运行调度程序和web程序
# 启动调度程序
python proxyPool.py schedule
# 启动webApi服务
python proxyPool.py server
-6、api介绍
/ GET api介绍 None
/get GET 随机获取一个代理 可选参数: ?type=https 过滤支持https的代理
/pop GET 获取并删除一个代理 可选参数: ?type=https 过滤支持https的代理
/all GET 获取所有代理 可选参数: ?type=https 过滤支持https的代理
/count GET 查看代理数量 None
/delete GET 删除代理 ?proxy=host:ip
# 代理有 透明和高匿
透明的意思:使用者最终的ip是能看到的
高匿:隐藏访问者真实ip,服务端看不到
代理池的使用
-1、先启动代理池
-2、向http://127.0.0.1:5010/get/发送get请求拿到代理数据
-3、在爬虫项目中使用代理
import requests
# 获取代理
def proxy_pool():
while True:
headers = {
"type": "http"
}
proxy = requests.get(url="http://127.0.0.1:5010/get/", headers=headers)
proxy_data = proxy.json()
if proxy_data["last_status"]:
return proxy_data["proxy"]
proxies = {
"http": proxy_pool()
}
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 "
"Safari/537.36 Edg/118.0.2088.76"
}
# 使用代理
res = requests.get(url="https://www.bilibili.com/", headers=header, proxies=proxies)
print(res.text)
bs4介绍和遍历文档树
# BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,解析库
# pip install beautifulsoup4
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b><span>lqz</span></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc, 'html.parser') # 解析库可以使用 lxml,速度快(必须安装) 可以使用python内置的 html.parser
# print(soup.prettify())
### 重点:遍历文档树
#遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
1、用法 通过 . 遍历
# res=soup.html.head.title
# res=soup.p
# print(res)
2、获取标签的名称
# res=soup.html.head.title.name
# res=soup.p.name
# print(res)
3、获取标签的属性
# res=soup.body.a.attrs # 所有属性放到字典中 :{'href': 'http://example.com/elsie', 'class': ['sister'], 'id': 'link1'}
# res=soup.body.a.attrs.get('href')
# res=soup.body.a.attrs['href']
# res=soup.body.a['href']
# print(res)
4、获取标签的内容
# res=soup.body.a.text #子子孙孙文本内容拼到一起
# res=soup.p.text
# res=soup.a.string # 这个标签有且只有文本,才取出来,如果有子孙,就是None
# res=soup.p.strings
# print(list(res))
5、嵌套选择
# 下面了解
6、子节点、子孙节点
# print(soup.p.contents) #p下所有子节点
# print(list(soup.p.children)) #得到一个迭代器,包含p下所有子节点
# print(list(soup.p.descendants)) #获取子子孙节点,p下所有的标签都会选择出来
7、父节点、祖先节点
# print(soup.a.parent) #获取a标签的父节点
# print(list(soup.a.parents) )#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
8、兄弟节点
# print(soup.a.next_sibling) #下一个兄弟
# print(soup.a.previous_sibling) #上一个兄弟
#
print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
# print(soup.a.previous_siblings) #上面的兄弟们=>生成器对象
爬取视频网站
# 目标:
爬取该网站的视频,保存到本地 https://www.pearvideo.com/
爬取新闻网站
练习
-前端 vue,后端django, 需要个自己的app
在自己期终架构项目上,编写一个扫码登录功能
-没有移动端--->只能模拟实现--->uc浏览器,微信扫码--->正常应该使用咱们自己的app
-1 掏出手机,扫码功能---->手机app端必须是登录状态(手机端存了token)
-2 扫码—->二维码--->连接地址(url地址)--->扫码出来是个地址--->app点击确认登录--->向这个地址发送一个 请求,携带你的token--->到了后端
-3 web前端有个页面,一点击进来--->向后端发送一个请求--->拿到一个二维码
-4 后端配合一个获取二维码的接口--->python生成一个二维码-->qrcode-->放着连接地址--->二进制--->base64--->{code:100,msg:获取二维码成功,img:base64图片,key:唯一}
-5 手机扫码,点确定---->向后端发送请求,携带token--->验证token,解析token确定好是谁--->生成token--->存到 某个地方--->唯一key
6 4步后,起一个定时器,每个2s携带key--->向后端查询 token有没有,如果有,带回来登录成功
-生成二维码接口
-根据唯一key,查询token接口
-手机扫码接口
# 响应头:有什么用?
Connection: keep-alive
# 请求头中有 X-Forwarded-For 有什么
# 请求头字符串转字典--->字典推导式