02-爬虫的高阶使用

发布时间 2024-01-02 11:28:23作者: Way*yy

代理池的搭建

# 搭建步骤
    -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 有什么

# 请求头字符串转字典--->字典推导式