爬虫
1.回顾web服务器
知识点:
fastapi和uvicorn配合搭建web服务器:
0.先安装fastapi和uvicorn
1.导包
2.创建fastapi对象
3.处理web数据(请求和响应)
4.启动服务器
示例:
# 1.导包
from fastapi import FastAPI
from fastapi import Response
import uvicorn
# 2.创建fastapi对象
app = FastAPI()
# 3.处理web数据(请求和响应)
@app.get('/') # 自动跳转首页 http://127.0.0.1:8081/
def show():
with open('source/html/index.html','rb') as f:
body = f.read()
return Response(content=body)
@app.get('/{html_path}') # 跳转指定页面
def show(html_path):
with open(f'source/html/{html_path}','rb') as f:
body = f.read()
return Response(content=body)
@app.get('/images/{img_path}') # 跳转指定图片
def show(img_path):
with open(f'source/images/{img_path}','rb') as f:
body = f.read()
return Response(content=body)
# 4.启动服务器
uvicorn.run(app,host='127.0.0.1',port=8081)
2.爬虫入门
知识点:
网络爬虫: (网页蜘蛛,网络机器人)模拟人去浏览器发送请求,接收响应数据,然后根据需求获取对应的资源
注意: 理论上,爬虫能爬到的数据就是浏览器能展示出来的数据
python中requests模块简介: python编写的开源的http库
python中requests模块作用: 通过requests模块里的代码,模拟人去浏览器发送请求
爬虫步骤
1: 准备好url
2: 根据url发送请求,获取响应数据
3: 处理响应数据
4: 保存数据
爬取自己服务器页面:
# 1.准备url
import requests
url = 'http://127.0.0.1:8081/'
# 2.发送请求,接收响应数据对象
res = requests.get(url)
print(res) # 响应对象
# 3.处理数据
body = res.content # 根据content属性获取响应体
print(body) # 响应体:二进制格式
html_str = body.decode()
print(html_str) # 响应体:字符串格式
# 4.保存数据
3.爬取自己服务器页面中图片
知识点:
findall: 如果涉及到多个分组,自动把所有分组的内容先放到元组中再放到列表中返回
.* : 贪婪模式 如果匹配成功的前提下,尽可能多的匹配
.*?: 非贪婪模式 如果匹配成功的前提下,尽可能少的匹配
爬取所有图片:
import re
import requests
# 1.准备有效的url
url = 'http://127.0.0.1:8081/index.html'
# 2.发送请求,接收响应数据对象
res = requests.get(url)
# 3.处理数据
html_str = res.content.decode()
print(html_str) # 测试完注释或者删除此行
# 通过正则去匹配所有的图片路径
img_list = re.findall('<img src="(.*?)"',html_str)
print(img_list)
base_url = 'http://127.0.0.1:8081'
# 遍历图片列表
a = 0 # 用于动态存储图片名
for i in img_list:
# 获取每个图片url
img_url = base_url+i[1:]
# 依次发送图片请求
img_data = requests.get(img_url).content # 先获取到响应对象,再根据content属性获取内容
# 4.保存数据
with open(f'./load/{a}.jpg', 'wb') as f:
f.write(img_data)
a+=1 # 每用过1次后加1
4.爬取自己服务器的gdp数据
示例:
import re
import requests
# 1.准备有效的url
url = 'http://127.0.0.1:8081/gdp.html'
# 2.发送请求,接收响应数据对象
res = requests.get(url)
# 3.处理数据
html_str = res.content.decode() # 默认content接收的是二进制,decode()解码成字符串
print(html_str)
# 使用正则匹配数据
gdp_data = re.findall('<a href=""><font>(.*?)</font></a>.*?¥(.*?)亿元',html_str,re.S)
print(gdp_data)
# 4.保存数据
with open('./load/gdp.txt','w',encoding="utf8") as f:
f.write(str(gdp_data))
5.爬虫的多任务版本
知识点:
多任务: 多进程和多线程
多进程模块: multiprocessing
进程类: Process
使用步骤: 必须放到main函数内
1.导包: import multiprocessing
2.创建子进程对象: 子进程对象 = multiprocessing.Process(target=任务名)
3.开启进程: 子进程对象.start()
多线程模块: threading
线程类: Thread
使用步骤:
1.导包: import threading
2.创建子线程对象: 子线程对象 = threading.Thread(target=任务名)
3.开启线程: 子线程对象.start()
示例:
import multiprocessing
import re
import requests
# 任务1:爬取index页面中的所有图片
def get_img():
# 1.准备有效的url
url = 'http://127.0.0.1:8081/index.html'
# 2.发送请求,接收响应数据对象
res = requests.get(url)
# 3.处理数据
html_str = res.content.decode()
# 通过正则去匹配所有的图片路径
img_list = re.findall('src="(.*?)"', html_str)
base_url = 'http://127.0.0.1:8081'
# 遍历图片列表
# 使用了enumerate以后a就是对应的索引012...
for a, i in enumerate(img_list):
# 获取每个图片url
img_url = base_url + i[1:]
# 依次发送图片请求
img_res = requests.get(img_url) # 先获取到响应对象
img_data = img_res.content # 再根据content属性获取内容
# 4.保存数据
with open(f'./load/{a}.jpg', 'wb') as f:
f.write(img_data)
print('图片保存完毕!')
# 任务2: 爬取gdp页面中gdp数据
def get_gdp():
# 1.准备有效的url
url = 'http://127.0.0.1:8081/gdp.html'
# 2.发送请求,接收响应数据对象
res = requests.get(url)
# 3.处理数据
html_str = res.content.decode() # 默认content接收的是二进制,decode()解码成字符串
# 使用正则匹配数据
gdp_data = re.findall('<a href=""><font>(.*?)</font></a>.*?¥(.*?)亿元', html_str, re.S)
# 4.保存数据
with open('./load/gdp.txt', 'w', encoding="utf8") as f:
f.write(str(gdp_data))
print('gdp数据保存完毕!')
# 多任务
if __name__ == '__main__':
# 1.创建进程对象
p1 = multiprocessing.Process(target=get_img)
p2 = multiprocessing.Process(target=get_gdp)
# 2.开启进程
p1.start()
p2.start()
标签:gdp,13,入门,img,get,url,爬虫,content,html
From: https://www.cnblogs.com/nanguyhz/p/16800133.html