2024-08-08

Sanic是一个Python 3.7+用于快速Web开发的异步框架,它使用了async/await语法。下面是一个简单的Sanic应用程序的例子:




from sanic import Sanic
from sanic.response import json
 
app = Sanic(__name__)
 
@app.route("/")
async def test(request):
    return json({"message": "Hello World!"})
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

这个例子创建了一个简单的Web服务器,它有一个路由处理根URL的请求,并以JSON格式返回一个问候消息。你可以通过运行这段代码并访问http://0.0.0.0:8000来查看效果。

这个例子展示了Sanic框架的基本用法,包括定义路由、处理请求和返回响应。在实际应用中,你可以扩展这个例子,添加更多的路由、处理更复杂的逻辑和利用Sanic提供的异步特性来提高性能。

2024-08-08

报错解释:

这个错误通常发生在尝试使用int()函数将一个字符串转换为整数时,但是字符串中包含无法被解释为十进制数的字符。例如,当尝试将字符串"123abc"转换为整数时,会引发此错误,因为"abc"不是有效的整数表示。

解决方法:

  1. 确保你要转换的字符串只包含数字(可以有+/-号在最前面)。
  2. 如果字符串可能包含非数字字符,你需要先清理字符串,去除非数字字符,然后再转换。
  3. 如果数据可能有前导零(比如"0123"),确保在转换前去除前导零。
  4. 如果是用户输入或来自不可靠源的数据,可以使用异常处理来优雅地处理转换失败的情况。

示例代码:




s = "123abc"
try:
    # 清理字符串,只保留数字
    cleaned_s = ''.join(filter(str.isdigit, s))
    # 如果字符串全是数字,则转换
    if cleaned_s:
        number = int(cleaned_s)
        # 处理转换后的整数
    else:
        # 处理无效输入的情况
        print("输入不是有效的整数")
except ValueError:
    # 处理其他转换异常
    print("转换错误:输入不是有效的整数格式")
2024-08-08



import cv2
import numpy as np
import pytesseract
from PIL import Image
 
def preprocess_image(image_path):
    # 读取图片并转为灰度图
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
    # 使用自适应阈值进行二值化
    thresh = cv2.adaptiveThreshold(
        gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
 
    return thresh
 
def extract_license_plate(image_path):
    # 预处理图片
    thresh = preprocess_image(image_path)
 
    # 寻找轮廓
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 
    # 根据轮廓大小进行排序,找到最大的轮廓
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
 
    # 遍历轮廓并提取车牌区域
    for contour in contours:
        # 计算轮廓的边界框
        x, y, w, h = cv2.boundingRect(contour)
 
        # 通过比例筛选可能的车牌区域
        if (float(h) / w > 2.5 and w > h):
            # 裁剪车牌区域
            license_plate = thresh[y:y + h, x:x + w]
 
            # 保存车牌图片
            cv2.imwrite('license_plate.jpg', license_plate)
 
            # 返回处理好的车牌图片路径
            return 'license_plate.jpg'
 
    return None
 
def recognize_license_plate(license_plate_image_path):
    # 加载中文字典
    pytesseract.set_dictionary_path('chi_sim.traineddata')
 
    # 指定使用中文识别
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    pytesseract.image_to_string(Image.open(license_plate_image_path), lang='chi_sim')
 
 
# 示例使用
image_path = 'car_image.jpg'
license_plate_image_path = extract_license_plate(image_path)
if license_plate_image_path:
    print(recognize_license_plate(license_plate_image_path))
else:
    print("未找到车牌区域")

这个代码示例展示了如何实现一个简单的车牌识别系统。它包括了图像预处理、轮廓查找、车牌区域定位,以及使用Tesseract OCR进行车牌字符识别的主要步骤。这个流程是车牌识别系统的基本框架,对于学习图像处理和文字识别技术有很好的指导价值。

2024-08-08

在Python中,我们可以使用jieba库进行中文分词,并使用wordcloud库生成词云。以下是一个简单的例子,展示如何使用这两个库来生成一个词云图。

首先,确保安装了所需的库:




pip install jieba wordcloud

然后,使用以下代码生成词云:




import jieba
from wordcloud import WordCloud
import numpy as np
import PIL.Image as Image
 
# 分词
text = "你好 世界 你好世界 你好世界 你好世界 你好世界 你好世界 你好世界"
cut_text = " ".join(jieba.cut(text))
 
# 创建词云
mask_image = np.array(Image.open("mask.png"))  # 加载背景图片
wordcloud = WordCloud(background_color="white", mask=mask_image, font_path='simhei.ttf')
wordcloud.generate(cut_text)
 
# 保存词云图片
wordcloud.to_file("wordcloud.png")

在这个例子中,我们使用了一个简单的文本,并用jieba进行了分词。然后,我们使用一个图片作为词云的形状,并指定了一个字体文件(如simhei.ttf),以生成带有宋体字的词云。最后,我们将生成的词云保存为一个PNG图片。

注意:需要一个合适的背景图片作为词云的“遮罩”,这里命名为mask.png。同时,需要指定一个支持中文的字体文件,这里使用的是宋体(simhei.ttf),你需要确保这个文件在你的文件系统中是可用的。如果你的环境中没有这个字体文件,可以从网上下载或者使用系统中已有的中文字体文件。

2024-08-08



import sqlite3
 
# 连接到SQLite数据库(如果数据库不存在,会自动在当前目录创建)
# 如果数据库存在,则连接到现有数据库
conn = sqlite3.connect('example.db')
 
# 创建一个Cursor对象,用于执行SQL命令
cur = conn.cursor()
 
# 执行SQL命令创建一个表
cur.execute('''CREATE TABLE IF NOT EXISTS stocks
               (date text, trans text, symbol text, qty real, price real)''')
 
# 关闭Cursor对象
cur.close()
 
# 提交事务
conn.commit()
 
# 关闭连接
conn.close()

这段代码演示了如何使用Python的sqlite3库来连接到一个SQLite数据库,创建一个新表,并在操作完成后关闭相关资源。这是数据库操作中一个基本且重要的过程。

2024-08-08

要将Python中的数据存储到MySQL中,你可以使用mysql-connector-python库。以下是一个简单的例子,演示如何连接到MySQL数据库并插入一条记录:

  1. 首先,确保你已经安装了mysql-connector-python库。如果没有安装,可以使用pip安装:



pip install mysql-connector-python
  1. 然后,使用以下Python代码将数据存储到MySQL中:



import mysql.connector
from mysql.connector import Error
 
def connect_to_database(host, database, user, password):
    try:
        conn = mysql.connector.connect(host=host,
                                       database=database,
                                       user=user,
                                       password=password)
        if conn.is_connected():
            print("连接成功!")
            return conn
    except Error as e:
        print("连接失败:", e)
 
def insert_data(conn, data):
    try:
        cursor = conn.cursor()
        sql_query = """INSERT INTO users (name, age) VALUES (%s, %s)"""
        cursor.execute(sql_query, data)
        conn.commit()
        print("数据插入成功!")
    except Error as e:
        print("数据插入失败:", e)
    finally:
        cursor.close()
 
# 数据库连接配置
host = 'localhost'
database = 'testdb'
user = 'root'
password = 'password'
 
# 要插入的数据
data = ('John Doe', 22)
 
# 连接数据库
connection = connect_to_database(host, database, user, password)
 
# 插入数据
insert_data(connection, data)
 
# 关闭连接
connection.close()

在这个例子中,我们首先定义了一个函数connect_to_database来连接到MySQL数据库,然后定义了一个insert_data函数来执行插入操作。请确保你的数据库、用户和密码配置与你的数据库信息相匹配,并且在运行代码之前创建相应的数据库和表(在这个例子中是users表,需要有nameage两个字段)。

2024-08-08



import requests
from bs4 import BeautifulSoup
import re
 
def crawl_site(url):
    # 发送HTTP请求
    res = requests.get(url)
    # 解析网页
    soup = BeautifulSoup(res.text, 'html.parser')
    # 提取所有的链接
    links = soup.find_all('a')
    for link in links:
        # 提取链接地址
        link_url = link.get('href')
        # 筛选出有效的链接地址
        if re.match(r'^http', link_url) and link_url not in crawled_urls:
            print(link_url)
            crawled_urls.add(link_url)
            crawl_site(link_url)
 
# 启始网址
home_page_url = 'http://example.com'
# 已爬取的链接集合
crawled_urls = set()
# 爬取起始网页
crawled_urls.add(home_page_url)
crawl_site(home_page_url)

这段代码使用了requests库来发送HTTP请求,使用BeautifulSoup来解析HTML,并使用正则表达式(re)来筛选链接。这个简单的示例展示了如何递归地爬取一个网站的所有页面,并提取其中的链接,但在实际应用中可能需要处理更复杂的情况,例如处理登录、处理Cookies、应对反爬虫策略等。

2024-08-08

为了创建一个POC(Proof of Concept)批量化扫洞的爬虫,我们可以使用Python的requests库来请求FOFA的API,并使用concurrent.futures库来实现并发处理。以下是一个简单的示例:




import requests
from concurrent.futures import ThreadPoolExecutor
 
# FOFA API 参数配置
API_URL = "https://fofa.info/api/v1/search/all"
EMAIL = "your_email@example.com"
KEY = "your_api_key"
QUERY = "protocol=\"http\""  # 这里填写你的FOFA查询语言
 
def search_fofa(query):
    params = {
        "email": EMAIL,
        "key": KEY,
        "qbase64": query
    }
    response = requests.get(API_URL, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        print("Error:", response.status_code)
        return None
 
def main():
    # 编码查询并构造线程数
    query = requests.utils.quote(QUERY)
    threads = 10
 
    # 使用ThreadPoolExecutor并发执行搜索
    with ThreadPoolExecutor(max_workers=threads) as executor:
        future_to_search = {executor.submit(search_fofa, query): query for _ in range(threads)}
        for future in concurrent.futures.as_completed(future_to_search):
            query = future_to_search[future]
            try:
                data = future.result()
                if data:
                    # 处理返回的数据
                    print(f"Query: {query}, Results: {len(data['results'])}")
            except Exception as exc:
                print(f"{query} generated an exception: {exc}")
 
if __name__ == "__main__":
    main()

在这个例子中,我们定义了search_fofa函数来发送请求到FOFA API,并定义了main函数来并发执行搜索。我们使用了requests库来编码查询语句,并使用ThreadPoolExecutor来并发执行多个搜索请求。

请注意,你需要替换EMAILKEY变量值为你的FOFA账户信息,并且根据需要调整QUERY来设置你的搜索条件。此外,你可能需要处理返回的数据以及异常情况,并根据FOFA API的限制来调整线程数和查询语句。

2024-08-08

requests模块是Python中一个非常强大的模块,用于发送HTTP请求。

  1. 发送GET请求



import requests
 
response = requests.get('https://www.google.com/')
print(response.text)
  1. 发送POST请求



import requests
 
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("https://httpbin.org/post", data=payload)
print(response.text)
  1. 添加headers



import requests
 
headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://www.google.com/', headers=headers)
print(response.text)
  1. 添加cookies



import requests
 
cookies = {'cookies': 'value'}
response = requests.get('https://www.google.com/', cookies=cookies)
print(response.text)
  1. 使用timeout



import requests
 
response = requests.get('https://www.google.com/', timeout=1)
print(response.text)
  1. 使用proxies



import requests
 
proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://www.google.com/', proxies=proxies)
print(response.text)
  1. 使用auth



import requests
 
from requests.auth import HTTPBasicAuth
 
response = requests.get('https://www.google.com/', auth=HTTPBasicAuth('user', 'pass'))
print(response.text)
  1. 使用files



import requests
 
files = {'file': open('report.xls', 'rb')}
response = requests.post("https://httpbin.org/post", files=files)
print(response.text)
  1. 使用json



import requests
 
json = {'key': 'value'}
response = requests.post("https://httpbin.org/post", json=json)
print(response.text)
  1. 使用session



import requests
 
session = requests.Session()
session.auth = ('user', 'pass')
 
response = session.get('https://www.google.com/')
print(response.text)
  1. 使用response



import requests
 
response = requests.get('https://www.google.com/')
 
print(response.status_code)  # 状态码
print(response.headers)      # 头部信息
print(response.cookies)      # cookies
print(response.url)          # URL
print(response.history)      # 历史记录
  1. 处理HTTPS证书



import requests
 
response = requests.get('https://www.google.com/', verify=False)
print(response.text)
  1. 处理超链接



import requests
 
response = requests.get('https://example.org/my_username/')
print(response.links['next']['url'])
  1. 使用hooks



import requests
 
def my
2024-08-08



import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts.charts import Bar, Line, Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType
 
# 假设dataframe已经包含了所需的数据和相应的列名
dataframe = pd.DataFrame({
    '商品名称': ['商品A', '商品B', '商品C', '商品D'],
    '销售数量': [100, 120, 80, 130],
    '销售金额': [10000, 12000, 8000, 13000],
    '客单价': [100, 150, 80, 120]
})
 
# 创建条形图
bar = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(dataframe['商品名称'].tolist())
    .add_yaxis('销售数量', dataframe['销售数量'].tolist())
    .add_yaxis('销售金额', dataframe['销售金额'].tolist())
    .set_global_opts(title_opts=opts.TitleOpts(title="销售分析"))
)
bar.render('bar_chart.html')
 
# 创建线形图
line = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(dataframe['商品名称'].tolist())
    .add_yaxis('客单价', dataframe['客单价'].tolist())
    .set_global_opts(title_opts=opts.TitleOpts(title="客单价趋势分析"))
)
line.render('line_chart.html')
 
# 创建饼图
pie = (
    Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add('', [list(z) for z in zip(dataframe['商品名称'], dataframe['销售金额'])])
    .set_global_opts(title_opts=opts.TitleOpts(title="销售金额占比分析"))
)
pie.render('pie_chart.html')
 
# 爬虫技术研究部分(示例)
import requests
from bs4 import BeautifulSoup
 
url = "http://example.com/retail_data"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
 
# 假设我们需要爬取的数据是商品名称和价格
product_names = soup.find_all('div', class_='product-name')
product_prices = soup.find_all('div', class_='product-price')
 
# 将爬取的数据保存到dataframe中
dataframe = pd.DataFrame({
    '商品名称': [name.text for name in product_names],
    '商品价格': [price.text for price in product_prices]
})
 
# 存储dataframe到CSV文件
dataframe.to_csv('product_data.csv', index=False)

这个代码示例展示了如何使用Python的Pandas、NumPy、Matplotlib、Seaborn和Pyecharts库来创建数据可视化图表,并使用BeautifulSoup来进行简单的网页数据爬取。这个流程是数据分析和可视化平台设计中的一个常见实践。