2024-08-24



import pandas as pd
import matplotlib.pyplot as plt
 
# 读取数据
data = pd.read_csv('air_pollution_data.csv')
 
# 查看数据的前几行
print(data.head())
 
# 数据可视化
plt.figure(figsize=(10, 5))
plt.plot(data['date'], data['pm2.5'], label='PM 2.5')
plt.plot(data['date'], data['pm10'], label='PM 10')
plt.legend()
plt.title('PM 2.5 and PM 10 over Time')
plt.xlabel('Date')
plt.ylabel('Air Pollution Level')
plt.show()
 
# 分析数据
# 例如,计算每日平均空气质量指数
daily_avg = data.groupby('date').mean()
print(daily_avg)
 
# 保存分析结果到CSV文件
daily_avg.to_csv('daily_avg_air_quality.csv')

这段代码首先导入了必要的Python库,并读取了一个假设的空气质量数据CSV文件。接着,它打印了数据的前几行以便于理解数据结构,并使用matplotlib库对PM2.5和PM10随时间变化的趋势进行了可视化。最后,代码通过对数据进行分组并计算每日平均值,展示了对数据的基本分析方法,并将结果保存到了一个新的CSV文件中。

2024-08-24

以下是一个简单的Scrapy爬虫示例,用于抓取一个示例网站上的书籍信息。

首先,创建一个新的Scrapy项目:




scrapy startproject bookscrawler

然后,进入项目目录,创建一个爬虫:




cd bookscrawler
scrapy genspider books examplebooks.com

接下来,编辑爬虫文件 bookscrawler/spiders/books.py 来提取书籍信息:




import scrapy
 
class BooksSpider(scrapy.Spider):
    name = 'books'
    allowed_domains = ['examplebooks.com']
    start_urls = ['http://examplebooks.com/books']
 
    def parse(self, response):
        for book in response.css('div.book_description'):
            yield {
                'title': book.css('h2::text').extract_first(),
                'author': book.css('p.author::text').extract_first(),
                'price': book.css('p.price::text').extract_first(),
            }
 
        next_page_url = response.css('a.next::attr(href)').extract_first
        if next_page_url:
            yield response.follow(next_page_url, self.parse)

最后,设置管道以保存数据(可选,取决于需求):




class BookscrawlerPipeline:
 
    def __init__(self):
        self.file = open('books.csv', 'w')
        self.file.write('title,author,price\n')
 
    def process_item(self, item, spider):
        line = f"{item['title']},{item['author']},{item['price']}\n"
        self.file.write(line)
        return item
 
    def close_spider(self, spider):
        self.file.close()

在项目的 settings.py 文件中启用管道:




ITEM_PIPELINES = {
    'bookscrawler.pipelines.BookscrawlerPipeline': 300,
}

现在,运行爬虫:




scrapy crawl books

这个爬虫会抓取 examplebooks.com 上的书籍信息,并将它们保存到 books.csv 文件中。这只是一个简单的例子,实际应用中您需要根据目标网站的结构调整CSS选择器和提取的字段。

2024-08-24



import requests
 
# 定义一个简单的HTTP代理服务器
class SimpleProxy(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
 
    def __call__(self, r):
        # 在发送请求前,修改请求对象,添加代理信息
        r.meta['proxy'] = 'http://{0}:{1}'.format(self.host, self.port)
        return r
 
# 使用定义的代理进行数据采集
proxy = SimpleProxy('123.123.123.123', '8080')
response = requests.get('http://www.example.com', hooks={'pre': proxy})
 
# 检查响应内容
print(response.text)

这个简单的代理示例展示了如何使用一个自定义的SimpleProxy类来修改请求对象,以使用指定的代理服务器发送HTTP请求。__call__方法被用来在请求发送前修改请求对象。hooks参数用于将自定义的代理钩子添加到requests会话中。这个例子演示了如何使用代理进行数据采集,并且是学习网络爬虫技术的一个基础。

2024-08-24

XPath是一种在XML(HTML)文档中查找信息的语言。它可以用来在XML(HTML)文档中对元素和属性进行导航。

以下是一些XPath进阶操作的实战讲解和代码示例:

  1. 选取未知节点:使用星号(*)可以选取未知节点。



//*
  1. 选取特定节点:使用节点名称可以选取特定节点。



//div
  1. 选取特定类型的节点:使用"@"符号可以选取特定类型的节点。



//input[@type='text']
  1. 选取特定ID的节点:使用"#"符号可以选取特定ID的节点。



//div[@id='content']
  1. 选取特定类的节点:使用"."符号可以选取特定类的节点。



//div[@class='main']
  1. 选取特定属性的节点:使用"@"符号可以选取特定属性的节点。



//div[@data-type='page']
  1. 选取特定文本的节点:使用"text()"可以选取特定文本的节点。



//div[text()='Hello, world!']
  1. 选取特定子节点的节点:使用"/"可以选取特定子节点的节点。



//div[@class='main']/p
  1. 选取特定后代节点的节点:使用"//"可以选取特定后代节点的节点。



//div[@class='main']//p
  1. 选取特定位置的节点:使用"[n]"可以选取特定位置的节点。



//div[@class='main']/p[1]
  1. 选取特定范围的节点:使用"[position<n]"可以选取特定范围的节点。



//div[@class='main']/p[position()<3]
  1. 选取特定条件的节点:使用"[condition]"可以选取特定条件的节点。



//div[@class='main']/p[@class='text']
  1. 选取特定多属性条件的节点:使用"and"可以选取特定多属性条件的节点。



//div[@class='main' and @id='content']
  1. 选取特定多属性条件的节点:使用"or"可以选取特定多属性条件的节点。



//div[@class='main' or @id='content']
  1. 选取特定子节点文本的节点:使用"//"和"text()"可以选取特定子节点文本的节点。



//div[@class='main']//p[text()='Hello, world!']

这些XPath操作可以应用于各种编程语言和库中,例如Python的lxml库,JavaScript的DOM解析等。在实际应用中,可以根据需要选择合适的XPath表达式。

2024-08-24



import requests
import json
import time
 
def query_in_didichuxing(keyword, offset=0, limit=10):
    """
    在企查查网站上,使用API批量查询关于“keyword”的公司信息。
    :param keyword: 查询关键词
    :param offset: 查询结果的偏移量
    :param limit: 查询结果的数量上限
    :return: 返回查询结果的列表
    """
    headers = {
        'User-Agent': 'Mozilla/5.0',
        'Referer': 'http://www.didichuxing.com/',
    }
    params = {
        'keyword': keyword,
        'offset': offset,
        'limit': limit,
    }
    response = requests.get('http://api.didichuxing.com/v2/search', headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        return []
 
# 示例使用
keyword = '酒店'
offset = 0
limit = 10
results = query_in_didichuxing(keyword, offset, limit)
print(json.dumps(results, indent=2))  # 打印格式化的JSON结果

这段代码定义了一个query_in_didichuxing函数,它接受查询关键词、偏移量和查询数量上限作为参数,并返回从企查查网站API获取的查询结果。然后通过一个示例使用展示了如何调用这个函数并打印结果。这个例子简洁明了,并包含了必要的请求头和参数设置,这些都是进行网络爬虫时常用的技巧。

2024-08-24



import requests
from PIL import Image
from io import BytesIO
import pytesseract
 
# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Referer': 'http://www.renren.com/SysHome.do',
    'Origin': 'http://www.renren.com'
}
 
# 获取验证码图片
def get_captcha(session, username):
    captcha_url = 'http://www.renren.com/PLogin.do'
    data = {
        'email': username,
        'uniqueTimestamp': '1585185145385'
    }
    response = session.post(captcha_url, data=data, headers=headers)
    return response.json()['captchaKey']
 
# 识别验证码
def recognize_captcha(captcha_key, session):
    captcha_img_url = f'http://captcha.renren.com/get?id={captcha_key}&r=0.1585185145385'
    response = session.get(captcha_img_url, headers=headers)
    image = Image.open(BytesIO(response.content))
    captcha_text = pytesseract.image_to_string(image)
    return captcha_text
 
# 使用示例
if __name__ == '__main__':
    with requests.Session() as session:
        username = 'your_username'
        captcha_key = get_captcha(session, username)
        captcha_text = recognize_captcha(captcha_key, session)
        print(f'获取到的验证码是: {captcha_text}')

在这个代码示例中,我们首先定义了请求头,用于模拟浏览器发送请求。然后定义了get_captcha函数来获取验证码的key,以及recognize_captcha函数来识别验证码。最后,在__name__ == '__main__'的代码块中,我们创建了一个requests.Session对象,用于保持会话状态,并且演示了如何使用这两个函数。

注意:在实际使用中,你需要安装requestsPillowpytesseract库,并且配置好pytesseract以正确调用Google的OCR服务。此外,你还需要有一个有效的username来获取验证码,以及正确配置了pytesseract.image_to_string函数来识别图片文本。

2024-08-24



from urllib.request import urlopen
from bs4 import BeautifulSoup
 
# 目标网页URL
url = 'http://example.com/'
 
# 发送请求,获取网页内容
resp = urlopen(url)
html_content = resp.read()
 
# 解析网页内容,生成BeautifulSoup对象
soup = BeautifulSoup(html_content, 'html.parser')
 
# 提取数据
# 例如,提取所有的段落文本
paragraphs = soup.find_all('p')
for p in paragraphs:
    print(p.get_text())
 
# 例如,提取所有的链接地址
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

这段代码展示了如何使用urllib.request库来获取网页内容,并使用BeautifulSoup来解析网页,然后提取所有段落文本和链接地址。这是爬虫技术中的基本应用,适用于学习和小型数据抓取任务。

2024-08-24



# 使用for循环打印0到4的数字
for i in range(5):
    print(i)
 
# 使用for循环打印0到10的偶数
for i in range(0, 11, 2):
    print(i)
 
# 使用for循环遍历字符串中的每个字符
for char in "Hello":
    print(char)
 
# 使用for循环遍历列表中的每个元素
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

这段代码展示了如何使用Python的for循环来进行不同的操作,包括打印数字、偶数、字符串和列表中的元素。

2024-08-24



from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
from starlette.websockets import WebSocketDisconnect
import asyncio
import uvicorn
 
app = FastAPI()
 
# 假设minimax_decision函数是一个使用大型Minimax算法的函数
async def minimax_decision(state):
    # 这里应该是Minimax算法的实现
    return "决策结果"
 
# 这里是WebSocket路由的处理函数
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            response = await minimax_decision(data)
            await websocket.send_text(response)
    except WebSocketDisconnect:
        print("Client disconnected")
 
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

这个代码示例展示了如何在FastAPI应用中使用WebSocket与客户端进行实时通信,并在服务器端调用一个异步的Minimax算法“大型模型”来生成决策。注意,这里的minimax_decision函数是假设存在的,它应该接收状态信息,并返回基于Minimax算法的决策。在实际应用中,你需要替换这个函数以适应你的具体情况。

2024-08-24



import requests
import pandas as pd
import time
 
def get_lng_lat(address, key):
    """
    根据地址获取经纬度
    :param address: 地址
    :param key: 高德开放平台的API Key
    :return: 经纬度列表
    """
    base = 'https://restapi.amap.com/v3/geocode/geo?'
    parameters = {
        'key': key,
        'address': address
    }
    response = requests.get(base, params=parameters)
    data = response.json()
    if data.get('status') == '1':
        geo = data.get('geocodes')[0].get('location')
        return geo.split(',')
    else:
        return ['NA', 'NA']
 
def batch_get_coordinates(df, column, key):
    """
    批量获取经纬度
    :param df: DataFrame对象
    :param column: 地址列名
    :param key: 高德开放平台的API Key
    :return: 包含经纬度的DataFrame
    """
    df['lng'] = df[column].apply(lambda x: get_lng_lat(x, key)[0])
    df['lat'] = df[column].apply(lambda x: get_lng_lat(x, key)[1])
    return df
 
# 示例使用
df = pd.DataFrame({'address': ['北京市朝阳区', '上海市浦东新区', '广州市天河区']})
key = '您的高德开放平台API Key'
df_result = batch_get_coordinates(df, 'address', key)
print(df_result)

这段代码首先定义了一个函数get_lng_lat,它接受一个地址和高德开放平台的API Key,然后向高德地图API发送请求,并返回对应的经纬度列表。接着定义了一个函数batch_get_coordinates,它接受一个DataFrame和地址所在的列名,以及API Key,然后对于DataFrame中的每一行地址,它都会调用get_lng_lat函数来获取对应的经纬度,并将结果添加到DataFrame中。最后,提供了一个使用示例,展示了如何使用这两个函数来批量获取一系列地址的经纬度信息。