爬虫02--requests库其他操作、免费代理池和案例
1.requests之ssl,超时设置,认证设置,处理异常,上传文件 (了解)
# http+ssl=https :传输过程中加密了---》截获到,无法解密
# ssl证书:第三方证书
# 证书验证(大部分网站都是https)
import requests
respone=requests.get('https://www.12306.cn') # 如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
# 1:强制使用http连接,不验证证书 (去掉报错,但是会报警告)
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:携带证书 (证书, 秘钥)
# 很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
# 知乎\百度等都是可带可不带
# 有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('https://www.12306.cn',cert=('/path/server.crt','/path/key'))
print(respone.status_code)
# 超时设置
import requests
respone=requests.get('http://127.0.0.1:8000',timeout=3)
print(respone.status_code)
# 认证设置(了解)
# 官网链接:http://docs.python-requests.org/en/master/user/authentication/
# 旧时的认证 (现在的认证,都是post请求)
弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的,但本质原理是拼接成请求头发送
# 老款的路由器的认证,公司内部可能会看到
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)
# HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
# 处理异常
import requests
from requests.exceptions import *
try:
respone=requests.get('http://127.0.0.1:8000',timeout=3)
print(respone.status_code)
except ReadTimeout:
print('===:')
except ConnectionError: # 网络不通
print('-----')
except Timeout:
print('aaaaa')
except RequestException:
print('Error')
except Exception as e:
print(e)
# 上传文件
import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files) # formdata格式
print(respone.status_code)
# 后端通过,request.FILES 获取文件的形式获取
2.requests使用代理
# 为什么使用代理?
-网站,访问频率过高,封ip,限制ip访问次数(后端频率类)
# 代理(重点)
-反向代理,正向代理
-正向代理:http,https代理,匿名度:透明和高匿
透明是不隐藏客户端ip,服务器能看见真实的客户端ip
通过http的请求头中 X-Forwarded-For字段
X-Forwarded-For:client, proxy1, proxy2
# 使用代理,隐藏访问者ip,正向代理
-代理服务器
-免费的:不稳定,不好用
-收费:稳定,好用
import requests
proxies = {'http': 'http://117.68.194.189:1133', }
respone=requests.get('http://127.0.0.1:8000/',proxies=proxies)
print(respone.text)
3.搭建免费代理池
# 本地搭建项目
项目地址: https://hub.xn--p8jhe.tw/jhao104/proxy_pool
1.git clone https://github.com/jhao104/proxy_pool.git
2.pip3 install -r requirements.txt
3.修改setting.py 中的redis连接
4.运行
# 启动调度程序
python proxyPool.py schedule
# 启动webApi服务
python proxyPool.py server
# 或直接使用该项目的测试地址返回的ip代理
# 简单使用
import requests
proxy = requests.get('http://demo.spiderpy.cn/get' ).json().get("proxy")
respone=requests.get('http://127.0.0.1:8000/',proxies={"http": "http://{}".format(proxy))
print(respone.text)
# 封装一下
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
# your spider code
def getHtml():
# ....
retry_count = 5
proxy = get_proxy().get("proxy")
while retry_count > 0:
try:
html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
# 使用代理访问
return html
except Exception:
retry_count -= 1
# 删除代理池中代理
delete_proxy(proxy)
return None
4.爬取梨视频
import requests
import re
# 分析网址规律:?reqType=5&categoryId=9&start=0 文章分类id 文章起始位置
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
print(res.text) # 返回的xml数据
# 解析数据:视频文章id地址
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
print(video_list)
# 拼接域名,获取视频的真正地址
for video in video_list:
video_id = video.split('_')[-1] # 视频id
video_url = 'https://www.pearvideo.com/' + video # 视频文章详情页地址
# res=requests.get(video_url) # 该请求就不用访问了,直接访问那个Ajax的请求
# print(res.text)
# 直接访问视频文章详情页地址,没有返回MP4格式的视频地址
# 该网站规则时,访问该地址时,自动再发一个Ajax获取视频真正地址
# 故需要,模拟发送这个Ajax请求 (https://www.pearvideo.com/videoStatus.jsp?contId=视频id&mrd=0.4930470461853751)
# 访问发现:
浏览器直接访问 和 从网站详情页访问 返回的数据不一样
都是浏览器操作 说明User-Agent、cookie是一样的,那就是请求头的问题了 (对比发现:指定了referer)
# 第一层反爬:需要带referfer头 # 动态自己拼
header = {
'Referer': 'https://www.pearvideo.com/%s' % video
}
res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.4930470461853751' % video_id,
headers=header)
mp4_url = res.json()['videoInfo']['videos']['srcUrl']
# 第二层反爬:需要将mp4_url地址进行部分替换
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
# 下载视频
res_video=requests.get(mp4_url)
with open('./viode/%s.mp4'%video_id,'wb') as f:
for line in res_video.iter_content(1024):
f.write(line)
'''
不能播放的:
https://video.pearvideo.com/mp4/third/20211014/ 1634271064903 -11980839-104649-hd.mp4
能播放的:
https://video.pearvideo.com/mp4/third/20211014/ cont-1743691 -11980839-104649-hd.mp4
5.爬取汽车之家
# bs4解析html
# pip3 install beautifulsoup4
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.autohome.com.cn/news/1/#liststart')
# print(res.text)
# 第一个参数,要解析的文档,第二个参数,解析的解析器('html.parser')
soup = BeautifulSoup(res.text, 'html.parser')
# res=soup.find_all(class_='article',name='ul')
ul_list=soup.find_all(name='ul')
for ul in ul_list:
li_list=ul.find_all(name='li')
for li in li_list:
h3=li.find(name='h3')
if h3:
title=h3.text # 拿出h3标签的文本内容
# print(title)
url='http:'+li.find('a').attrs['href']
# print(url)
img_url=li.find(name='img').attrs['src']
# print(img_url)
desc=li.find('p').text
# print(desc)
print('''
新闻标题:%s
新闻连接:%s
新闻图片:%s
新闻摘要:%s
'''%(title,url,img_url,desc))
# 入库:mysql,建表,字段,pymysql
分类:
爬虫
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库