爬虫----day02(解析json格式数据,ssl认证,使用代理ip,代理池搭建,爬取某视频网站,爬取梨视频网站,爬取某车网站新闻)
昨日回顾
# 面试题
- 可变类型不可变类型
---------------------------------------------
- 你常用的魔法方法---》某种情况会自动触发
-__init__ 类()--->对象进行初始化
-__new__ 类()---产生对象的时候触发---并触发__init__完成对象初始化
-__call__ person=Person()--->对象加括号 person()---》触发
-__getattr__ 对象.属性,属性不存在,触发
-__setattr__ 对象.属性=值, 触发
-__getitem__ 对象['属性'],属性不存在,触发
-__setitem__ 对象['属性']=值, 触发
-上下文管理器:只要重写了__enter__ __exit__ 方法,就具备这个能力
with 对象 as xx:
1 写了一行代码,触发__enter__的执行
2 写了一行代码,触发__exit__,做一些资源清理工作
---------------------------------------------
-剩下的:https://www.cnblogs.com/liuqingzheng/articles/9949568.html
- 类中的装饰器
-classmethod
-staticmethod
-如何把方法包装成数据属性 propty装饰器
-类中如何隐藏属性
__属性、方法
-双写一致性
-断点续传
-迅雷多线程下载
-内网穿透:https://zhuanlan.zhihu.com/p/370483324
-缓存击穿
.
.
.
.
.
# 1 爬虫是什么
-一个程序----》模拟发送http请求--->从网站,app,小程序---》获取数据---》清洗数据---》入库
# 2 爬虫的核心原理
-发送http请求,解析数据
-requests re
---------------------------------------------
# 3 requests模块---》大神---》基于python内置模块urllib3---》封装
-python界非常知名的库
-模拟发送http请求:postman也是发送http请求的
-python GUI
-tkinter:内置模块
-PyQT:python代码在qt平台写桌面应用
# 4 发送get请求,携带数据
request.get(地址,params={})
# 5 发送请求请求头
header={
user-agent: # 用户代理
cookies:
referer: # 记录从哪个页面跳转过来的,如果对方网站有防盗链,就要用它带前一个网页的网址解决
content-type:
X-Forwarded-For: # 获得HTTP请求端真实的IP
}
request.get(headers=header)
# 6 携带cookie 两种方式
1 直接放在请求头中:字符串 cookies:xx=dsads;ee=sasdfa
2 使用cookies参数request.get(cookies=字典或者CookieJar对象对象)
# 7 发送post请求
request.post(,data,json)
# 8 requests.session()----->保持cookie,以后不用手动携带,自动处理
# 9 响应对象
Response对象
-text
-content
-cookies
# 10 编码问题
# 11 获取二进制数据
-下载图片,视频
-response.iter_content()
# 6 http请求头
-referer:是http请求头中的一个数据,记录从哪个页面跳转过来的
-图片防盗链
-反扒
图片防盗链
.
.
.
.
.
.
今日内容
1 requests高级用法
解析json格式字符串
# 发送http请求,返回的响应头数据会有xml格式(一般是前后端混合的项目)
# 也有json格式(一般是前后单分离的项目)
# 怎么将json格式的字符串,转成字典对象了 ???
import requests
data = {
'cname': '',
'pid': '',
'keyword': '500',
'pageIndex': 1,
'pageSize': 10,
}
res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data)
# print(res.text) # 结果是json格式的字符串 ---》可以用www.json.cn网站解析json格式的数据
print(res.json()) # 直接json格式字符串转成 字典对象了
print(type(res.json())) # < class 'dict' >
.
.
.
.
.
.
.
.
1.1 ssl认证 证书提示报错问题
# http协议:明文传输
# https协议:http+ssl/tsl
# ssl 安全套接字层 在应用层与传输层之间的一层
https 比 http安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性
HTTPS 和 HTTP 的默认端口不同(443和8080)
# HTTPS在 HTTP与 TCP 之间加入了一个加密/身份验证层,提供了身份验证与加密通讯
参考: https://zhuanlan.zhihu.com/p/561907474
--------------------------------------------
# 以后遇到证书提示报错问题 ssl xxx
-------------------------------------------------
# 解决方案:
# 1 不验证证书
import requests
respone=requests.get('https://www.12306.cn',verify=False) # 不验证证书,报警告,返回200
print(respone.status_code)
--------------------------------------------------
# 2 关闭警告提示
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 关闭警告提示
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
--------------------------------------------------
# 3 手动携带证书(了解)
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
.
.
面试题 HTTPS与HTTP区别
HTTPS在 HTTP与 TCP 之间加入了一个加密/身份验证层,提供了身份验证与加密通讯
.
.
.
.
.
.
.
.
.
.
.
.
1.2 使用代理ip(重要)
# 如果爬虫使用自身ip地址访问,很有可能被封ip地址,以后就访问不了
# 我们可以使用代理ip
# 代理:收费和免费(不稳定)
------------------------------------------
# res = requests.post('https://www.cnblogs.com',proxies={'http':'地址+端口'})
# 'http' 表示代理的方式 '地址+端口' 代理的ip地址与端口 从网上找免费的代理ip端口去用
res = requests.post('https://www.cnblogs.com',proxies={'http':'60.167.91.34:33080'})
print(res.status_code)
-------------------------------------------
# 高匿代理和透明代理
高匿: 服务端拿不到真实客户端的ip地址,只能拿到代理的服务器ip地址
透明:服务端能拿到代理ip地址,也能拿到真实客户端的ip地址
-------------------------------------------
# 如果使用的是透明代理,后端如何拿到真实客户端ip地址
http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3
如果是透明代理,能通过x-forword-for 拿最左边的client1 就能获得HTTP请求端真实的IP
如果是匿名代理 通过x-forword-for也拿不到请求端真实的IP
--------------------------------------------------
header={
user-agent: # 用户代理
cookies:
referer: # 记录从哪个页面跳转过来的
X-Forwarded-For: # 获得HTTP请求端真实的IP
}
-------------------------------------------
.
.
.
.
.
1.3 超时设置
# 就是如果访问一个网站,如果在规定时间内,还没有响应,直接就断开连接了
import requests
response=requests.get('https://www.baidu.com',timeout=1)
.
.
.
.
1.4 异常处理
# 访问一个网站可能会出问题,把代码放到try下面去
import requests
from requests.exceptions import *
# 可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=1)
# except ReadTimeout:
# print('===:')
# except ConnectionError: #网络不通
# print('-----')
# except Timeout:
# print('aaaaa')
except Exception:
print('Error')
.
.
.
.
1.5 上传文件
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
.
.
.
.
.
.
.
.
2 代理池搭建
# requests 发送请求使用代理
# 代理从哪来
-公司花钱买
-搭建免费的代理池:https://github.com/jhao104/proxy_pool
开源的python项目:用爬虫+flask写的
架构:看下图
----------------------------------------------
# 搭建步骤:
1 本地创建文件git管理一下然后 git clone https://github.com/jhao104/proxy_pool.git
或者用pycharm去克隆也行,github下载的慢,可以直接下载zip压缩包到本地再解压
2 使用pycharm打开该项目
3 安装依赖:pip install -r requirements.txt
4 修改settings.py配置文件(主要就是配置redis的连接地址即可)
HOST = "0.0.0.0"
PORT = 5010 # 这是该flask项目启动起来的端口
DB_CONN = 'redis://127.0.0.1:6379/0'
PROXY_FETCHER= [
"freeProxy01",
"freeProxy02",
"freeProxy03",
"freeProxy04",
"freeProxy05",
"freeProxy06",
"freeProxy07",
"freeProxy08",
"freeProxy09",
"freeProxy10"
]
# PROXY_FETCHER里面对应的参数对应是-----爬取哪些免费的代理网站(具体看该软件的文档说明)
------------------------------------------
5 启动爬虫程序 会自动将代理网站上爬取下来的ip与端口,会自动到代理验证的目标网站进行测试
符合要求的会放到redis里面,当你觉得redis里面的代理ip够用了就可以停掉
python proxyPool.py schedule
6 启动服务端,该服务不能关
python proxyPool.py server
7 使用随机一个免费代理,就是朝该flask项目后端发请求,后端会随机返回一个ip地址给你
地址栏中输入:http://127.0.0.1:5010/get/
------------------------------------------
# 使用随机代理发送请求
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies)
# res = requests.post('https://www.cnblogs.com', proxies={'http': '60.167.91.34:33080'})
res = requests.post('https://www.cnblogs.com', proxies=proxies, verify=False)
print(res)
------------------------------------------
.
.
.
.
.
.
.
2.1 django后端获取客户端的ip
# 建立django后端---》index地址---》访问就返回访问者的ip
# django代码
配置文件里面的sqlite3数据库可能需要删掉,数据库也要删掉 这个也设一下 ALLOWED_HOSTS = ['*']
# 路由 啥都不加就是访问根路径
path('', index),
# 视图函数
def index(request):
ip = request.META.get('REMOTE_ADDR')
print('ip地址是', ip)
return HttpResponse(ip)
---------------------------------------
# 测试端:
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies)
res=requests.get('http://101.43.19.239/', proxies=proxies,verify=False)
print(res.text)
----------------------------------------------
.
.
.
.
.
.
3 爬取好看视频 网站视频
.
.
打开该网址,发现返回的是一个字典,用json转换器转换一下,
发现视频地址藏在字典的previewUrlHttp键里面,
剩下就是将所有视频网址扒到列表里面去,然后开多线程,用request发送get请求
拿到视频的二进制数据,写到本地的文件里面去,视频就爬到本地了!!!
.
.
# 使用代理池,多线程,爬取视频
import requests
from threading import Thread
from requests.packages import urllib3
import uuid
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
# print(proxies)
# res = requests.post('https://www.cnblogs.com', proxies={'http': '60.167.91.34:33080'})
res1 = requests.get('https://haokan.baidu.com/videoui/api/Getvideolandfeed?time=1679038218978',proxies=proxies, verify=False)
# print(res1.json())
# 从字典里面拿到所有网址的列表
list1 = []
for dict in res1.json()['data']['apiData']:
list1.append(dict['previewUrlHttp'])
def task(video_url, video_id):
res2 = requests.get(video_url, proxies=proxies, verify=False)
with open('./video/%s.mp4' % video_id, 'wb') as f:
for line in res2.iter_content():
f.write(line)
# 对列表进行for循环,开启多线程
video_id = 0
for video_url in list1:
video_id += 1
t = Thread(target=task, args=[video_url, video_id])
t.start()
.
.
.
.
.
4 爬取梨视频网站
import requests
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
# start=0 表示的是第一页,同理想要爬取第二页,start等于1就行了
print(res.text) # 数据是xml格式数据
--------------------------------------------
# 解析出真正视频地址
# re.findall(正则表达式,要筛选的字符串)
# 就会将匹配到的所有符合正则表达式的字符串放到列表里面!!!
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
print(video_list) # 将所有视频的id号解析出来,放到列表里了
for video_path in video_list:
# video_path = video_1236626
video_id = video_path.split('_')[-1] # 拿视频id
real_url = 'https://www.pearvideo.com/' + video_path
print('视频所在页面地址是:',real_url) # 实际还不是真正的视频资源地址,只是个网页地址
# 但是打开该视频的地址后,发现不是一个单纯的视频地址,而是一个网页
# 网页里面点击播放按钮,才会播放视频
# 用res = requests.get(real_url) 加 res.text
# 拿回的xml里面发现没有 MP4的数据
# 检查网络,发现打开视频的地址后,后台又悄悄的发了一个ajax请求
# ajax请求又朝另一个网址发送请求,这个请求才能将视频的真正地址拿到
# 然后用requests向 ajax发送的网址, 发请求发现,还不行,返回的字典不对(网站的第一层反扒)
# 检查发现需要在请求头里面带个Referer,才能通过
# 请求头加完Referer后,发现还是不行,res.text里面的视频地址还是播放不了视频
# 这是网站的第二层反扒手段
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id }
# 模拟ajax发送请求
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id, headers=headers).json()
print(res1["videoInfo"]['videos']['srcUrl']) # 该网址还是播不了
# 注意Referer的地址与页面悄悄ajax发送的地址,都是随着视频的编号在动态的变的
# 拿到ajax请求返回的字典里面的视频地址,但是拿出来的地址还是不对!!!
mp4_url = res1["videoInfo"]['videos']['srcUrl']
# 响应的 https://video.pearvideo.com/mp4/short/20171229/1684051848719-11346169-hd.mp4
# 真正的 https://video.pearvideo.com/mp4/short/20171229/cont-1236626-11346169-hd.mp4
# 需要将最后一个斜杠后面的第一个字符串换成 cont-视频编号 才能变成真正的视频地址!!!
# 将视频地址的 / 与 - 符号 中间的,替换成真正的视频网址需要的字符
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
print(mp4_url)
# 向该视频网址发送请求,拿回视频二进制数据,写进本地文件,爬取视频结束
res2 = requests.get(mp4_url)
with open('./video/%s.mp4' % video_id, 'wb') as f:
for line in res2.iter_content():
f.write(line)
.
.
爬取视频注意事项
# 最好使用多进程与ip代理线程池,来爬取下载视频,
# 不然很容易被视频网站将使用的公网ip给封掉
# 不着急就不开多线程,脚本文件运行一次就换一个代理ip,代理ip不容易被封
# 每执行完一次 ,就把地址栏start对应的数字改一下,按分页的数量来递增
# categoryId=1 一个分类爬完了,就换个分类再爬,反正每运行一次就随机换个代理ip
# 开多线程,每一个子线程里面,都要重新获取一下代理ip,这样不容易被检测到
-----------------------------------------------
# 开代理,不开多线程
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies)
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0',proxies=proxies, verify=False)
# start=0 表示的是第一页,同理想要爬取第二页,start等于1就行了
print(res.text) # 数据是xml格式数据
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
print(video_list) # 将所有视频的id号解析出来,放到列表里了
for video_path in video_list:
video_id = video_path.split('_')[-1] # 拿视频id
real_url = 'https://www.pearvideo.com/' + video_path
print('视频所在页面地址是:',real_url) # 实际还不是真正的视频资源地址,只是个网页地址
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id }
# 模拟ajax发送请求
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id, headers=headers,proxies=proxies, verify=False ).json()
print(res1["videoInfo"]['videos']['srcUrl']) # 该网址还是播不了
# 注意Referer的地址与页面悄悄ajax发送的地址,都是随着视频的编号在动态的变的
# 拿到ajax请求返回的字典里面的视频地址,但是拿出来的地址还是不对!!!
mp4_url = res1["videoInfo"]['videos']['srcUrl']
# 响应的 https://video.pearvideo.com/mp4/short/20171229/1684051848719-11346169-hd.mp4
# 真正的 https://video.pearvideo.com/mp4/short/20171229/cont-1236626-11346169-hd.mp4
# 需要将最后一个斜杠后面的第一个字符串换成 cont-视频编号 才能变成真正的视频地址!!!
# 将视频地址的 / 与 - 符号 中间的,替换成真正的视频网址需要的字符
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
print(mp4_url)
# 向该视频网址发送请求,拿回视频二进制数据,写进本地文件,爬取视频结束
res2 = requests.get(mp4_url,proxies=proxies, verify=False)
with open('./video/%s.mp4' % video_id, 'wb') as f:
for line in res2.iter_content():
f.write(line)
-----------------------------------------------
.
response 返回的是xml
.
.
网站首页网站加a标签对应的链接组合起来,生成的就是视频所在的网页
https://www.pearvideo.com/video_1236626 但是点击该网址只是到了播放该视频的网页,
还不是真正的视频资源地址
.
.
网页上能看到该视频的地址,但是用requests模块朝该https://www.pearvideo.com/video_1236626网址发请求
返回的xml数据的该视频的地址却没了,这是该网站的反扒措施之一!!!
后台又悄悄的发了一个ajax请求,ajax请求又朝另一个网址发送请求,这个请求才能将视频的真正地址拿到
这是ajax请求的情况,
.
.
.
.
.
我们在该网页下通过打开检查,在点击播放按钮的时候,发现后台又悄悄的发了一个ajax请求
ajax请求又朝另一个网址发送请求,这个请求的响应里面藏了一个视频的网址
但是该ajax的响应里面的网址还是有问题,用该网站到浏览器上打开,根本没有,又是反扒措施
https://video.pearvideo.com/mp4/short/20171229/1684049766291-11346169-hd.mp4
比较该网址发现该网址和最终视频的地址,再视频的编号前面的一串字符不一样!!!
1684049766291 换成 cont-1236626 就变成了最终的视频地址了!!!
.
.
.
.
.
真正的视频地址是 首页网址加一些路由,再加1236626可能是视频的编号,再加一些对应的字符拼接起来的
https://video.pearvideo.com/mp4/short/20171229/cont-1236626-11346169-hd.mp4
这个才是真正的视频地址!!!
.
.
最后还要在请求头里面带 Referer ,再朝真正的视频地址发请求,才能拿到该视频的数据
总结:
朝视频网站用request发送请求,xml格式数据,然后用 re.findall()方法过滤出视频的编号
由于一开始我们的从网页上拿到了,一个一个的视频编号,拼上首页的主网址,就变成了该视频的播放网页了
用requests朝该网页网址发请求,还是返回的是xml格式数据,并且我们在页面检查里面能看到视频的播放网址
但是返回的是xml格式数据里面没有该对应的视频播放网址,所以怀疑该视频网址是页面生成后,
有ajax请求,从后端拿的视屏的播放网址,检查ajax请求,发现确实发了
但是我们用request朝该ajax请求的地址发送请求,响应数据不对,因为该网址还有请求头Referer的校验
可以看页面上的ajax请求,发送时,请求头有带Referer,而且该Referer就是当前视频所在的网页,
所以该reffer里面带的地址,是要和视频的编号一起变的!!!
request模块模拟ajax朝网站发请求,请求的地址也是随着视频的编号,动态变的!!!
https://www.pearvideo.com/videoStatus.jsp?contId=1236626&mrd=0.46011193503325387
.
.
并且在响应里面找到了视频的网址
但是该网址还不是真正的网址,还要动态的替换掉一些字符串后,才能变成真正的网址
.
.
变成真正网址后,不要忘了,请求头里的rerrfer对应的地址意思随视频编号动态变的!!!
.
.
.
.
.
.
开多线程爬视频
# 开代理,也开多线程
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 关闭警告
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies)
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0', proxies=proxies,
verify=False)
# start=0 表示的是第一页,同理想要爬取第二页,start等于1就行了
print(res.text) # 数据是xml格式数据
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
print(video_list) # 将所有视频的id号解析出来,放到列表里了
from threading import Thread
def task(video_id, real_url):
# 获取代理
res = requests.get('http://127.0.0.1:5010/get/').json()
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id}
# 模拟ajax发送请求
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id,
headers=headers, proxies=proxies, verify=False).json()
print(res1["videoInfo"]['videos']['srcUrl']) # 该网址还是播不了
# 注意Referer的地址与页面悄悄ajax发送的地址,都是随着视频的编号在动态的变的
# 拿到ajax请求返回的字典里面的视频地址,但是拿出来的地址还是不对!!!
mp4_url = res1["videoInfo"]['videos']['srcUrl']
# 将视频地址的 / 与 - 符号 中间的,替换成真正的视频网址需要的字符
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
print(mp4_url)
try:
# 向该视频网址发送请求,拿回视频二进制数据,写进本地文件,爬取视频结束
res2 = requests.get(mp4_url, proxies=proxies, verify=False)
with open('./video/%s.mp4' % video_id, 'wb') as f:
for line in res2.iter_content():
f.write(line)
except Exception:
print('Error')
# 开多线程,每个子线程里单独拿一个代理ip
for video_path in video_list:
video_id = video_path.split('_')[-1] # 拿视频id
real_url = 'https://www.pearvideo.com/' + video_path
t = Thread(target=task, args=(video_id, real_url,))
t.start()
.
.
.
.
.
.
.
.
.
4 爬取某车网站新闻
# pip install beautifulsoup4
# 是一个解析xml格式数据的库,匹配xml中的数据,比re模块方便点!
# 对于xml格式的数据如果用re.findall(正则表达式,要匹配的数据) 正则去匹配xml里面的数据,也行就是麻烦点
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.autohome.com.cn/all/2/#liststart')
# print(res.text)
# BeautifulSoup是一个类
# 第一个参数是要解析的文本数据(str类型)
# 第二个参数是要使用的解析器有: html.parser:内置解析器 lxml:第三方解析器需要额外安装
soup = BeautifulSoup(res.text, 'html.parser')
# 查找所有类名叫article,并且名字叫ul标签
# 因为class在python中是关键字,所以用class_替代了一下
ul_list = soup.find_all(name='ul', class_='article')
print(len(ul_list)) # 找到4个,类名叫article,名字叫ul的标签
for ul in ul_list:
# 从每个ul标签里面再查找名字叫li的标签
li_list = ul.find_all(name='li')
print(len(li_list)) # 每个里面15个左右的li标签 16 15 15 15
for li in li_list:
# 从每个li_list拿出单个li标签 并查找该li标签里面名字叫h3的标签
h3 = li.find(name='h3')
print(h3) # 可能会拿到一个空的h3标签,就是一个广告
# 把广告踢掉
if h3:
title = h3.text
url = 'https:' + li.find('a').attrs['href']
desc = li.find('p').text
img = li.find('img').attrs['src']
print("""
新闻标题:%s
新闻连接:%s
新闻简介:%s
图片:%s
""" % (title, url, desc, img))
with open('爬取的新闻.txt', 'a') as f:
f.write("""
新闻标题:%s
新闻连接:%s
新闻简介:%s
图片:%s
""" % (title, url, desc, img))
-------------------------------------------------
# 作业
# 把所有图片下载到本地,把爬完的数据,存到mysql中---》
# 用pymysql---别忘了commit
.
.
.
.
.
.
.
作业
# 1 多线程5页爬视频
# 2 爬100页新闻,存到mysql,图片下载到本地
# 3 上课讲的代码写一遍
----------------------------------------------------
# 什么是反向代理,什么是正向代理
正向代理类似一个跳板机,代理访问外部资源
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,
请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,
再返回给我们,这样我们就能访问谷歌了
反向代理(Reverse Proxy)
实际运行方式是指以代理服务器来接受internet上的连接请求,
然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给
internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
# 详见 https://www.cnblogs.com/liuqingzheng/p/10521675.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY