爬虫搭建代理池、爬取某网站视频案例、爬取新闻案例
一、requests模块其他参数
# 研究主题:爬取肯德基门店信息
# 目标网址:http://www.kfc.com.cn/kfccda/storelist/index.aspx
"""
在浏览器的控制台请求体中解析出来的数据
代码中放到data中发送请求
cname:
pid:
keyword: 上海
pageIndex: 1
pageSize: 10
"""
import requests
data = {
'cname': '',
'pid': '',
'keyword': '上海',
'pageIndex': 1,
'pageSize': 10,
}
res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword', data=data, verify=False)
print(res.json()) # .json()可以解析json格式数据
"""
发送http请求,返回的数据会有xml格式,也有json格式
如果res.text >>>转的是xml格式
如果res.json() >>>转的是json格式
verify=False 该参数不验证证书,报警告,返回200
urllib3.disable_warnings() #关闭警告
手动携带证书信息即可
"""
二、使用代理
如果使用自自身IP地址访问,很有可能被封IP,以后就访问不了了
那如何解决呢?我们可以使用代理IP(代理:)
设置超时,请求参数加上timeout=时间即可
异常处理:用try except 包一下即可
上传文件:虽然爬虫没有上传文件的需求
但是后期在开发过程中需要批量上传文件,这个时候需要requests模块处理
换句话说应用场景
高匿名代理和透明代理
高匿名代理:服务端拿不到真实客户端的IP地址
透明代理:能够拿到真实客户端的IP地址。也能拿到代理
使用高匿名代理时候,如何拿到真实客户端的IP地址?在请求头中有一个参数叫X-Forward-For:''
import requests
proxies={'http':'60.167.91.34:33080'}
proxies={
'http':'27.79.236.66:4001'
}
res = requests.post('https://wwww.cnbolgs.com',proxies=proxies)
print(res.status_code)
'上传文件'
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
'异常处理'
import requests
#可以查看requests.exceptions获取异常类型
from requests.exceptions import *
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
except RequestException:
print('Error')
'超时设置'
import requests
respone=requests.get('https://www.baidu.com',timeout=0.0001)
三、代理池搭建
-
访问搭建免费的代理池>>> https://github.com/jhao104/proxy_pool
-
下载zip文件到本地再解压之后再pycharm打开
-
单独给该项目创建虚拟环境
-
安装依赖
pip install -r requirements.txt
- 修改配置
DB_CONN = 'redis://127.0.0.1:6379/0'
- 启动爬虫程序
python proxyPool.py schedule
- 启动服务端
python proxyPool.py server
- 使用随机免费代理
在浏览器地址栏中搜索http://127.0.0.1:5010/get/
可以获取随机免费代理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.post('https://www.cnblogs.com', proxies=proxies, verify=False)
print(res)
开多线程的脚本
from threading import Thread
import requests
def task():
res = requests.get('http://101.43.19.239/')
print(res.text)
for i in range(10000000):
t = Thread(target=task)
t.start()
五、爬取某视频网站的视频案例
import requests
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
for i in video_list:
# i='video_1212452'
video_id = i.split('_')[-1]
real_url = 'https://www.pearvideo.com/' + i
headers = {
'Referer': 'https://www.pearvideo.com/video_%s' % video_id
}
res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id,
headers=headers).json()
mp4_url = res1["videoInfo"]['videos']['srcUrl']
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)
六、爬取新闻的案例
需要前提条件是有bs4、lxml模块
如果没有就需要下载
pip install beautifulsoup4
pip install lxml
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.autohome.com.cn/all/1/#liststart')
soup = BeautifulSoup(res.text, 'html.parser')
ul_list = soup.find_all(name='ul', class_='article')
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
url = 'https:' + li.find('a').attrs['href']
desc = li.find('p').text
img = li.find(name='img').attrs['src']
print('''
新闻标题:%s
新闻连接:%s
新闻摘要:%s
新闻图片:%s
''' % (title, url, desc, img))