Python实现的PM2.5空气质量爬虫教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了如何利用Python编程语言开发一个网络爬虫,用于从公开的气象或环保网站上抓取特定城市的PM2.5空气质量指数数据。Python因其简洁的语法和强大的库支持而适合此类任务。开发者可能使用了requests库进行网络请求、BeautifulSoup或lxml进行HTML解析、pandas进行数据处理和存储,以及datetime库处理时间信息。文章还可能讨论了如何记录数据采集时间,爬虫开发的法律和伦理要求,以及Scrapy框架的使用。读者将通过这段代码学习到网络爬虫的开发流程、数据处理技术,并了解如何处理和分析环境数据。 Python实现的PM2.5空气质量爬虫教程_第1张图片

1. Python网络爬虫开发概述

爬虫定义与重要性

网络爬虫(Web Crawler)是一种自动化脚本或程序,用于从互联网上抓取信息。它们模仿人类用户的行为,访问网页,解析内容,并将数据保存至本地或数据库中。在数据挖掘、信息聚合、搜索引擎等领域,爬虫扮演着至关重要的角色。

Python在网络爬虫中的优势

Python语言因其简洁的语法和强大的第三方库支持,成为开发网络爬虫的首选语言。Python的requests库简化了网络请求的发送和处理过程,而BeautifulSoup和lxml等库则极大地提高了HTML和XML文档的解析效率。加之其丰富的数据处理库,如pandas和numpy,Python在数据抓取、清洗、分析和存储等方面提供了全方位的工具。

爬虫开发的基本步骤

一个基本的爬虫开发流程通常包括以下几个步骤:确定目标站点并分析其结构、使用requests库发送网络请求、利用解析库提取所需数据、数据清洗和存储、以及后期的维护和更新。在进行开发时,还需注意遵守相关法律法规,如robots.txt协议,以及在数据采集时保护用户隐私。

# 示例代码:使用requests获取网页内容
import requests

url = 'http://example.com'
response = requests.get(url)
print(response.text)

以上代码展示了如何使用requests库发送GET请求并获取网页内容。这仅为爬虫开发过程中的第一步,后续需要根据内容进行解析和处理。

2. 使用requests库进行网络请求

在数据采集的过程中,与目标服务器进行通信是不可或缺的一步。Python的requests库是一个强大、简洁的HTTP库,它能够支持多种身份验证方法,可以发送各种类型的HTTP请求,并能够处理HTTP错误和重定向等。本章节将带你深入了解如何使用requests库进行网络请求,包括基本使用方法、异常处理技巧以及高级特性。

2.1 requests库的基本使用

requests库的安装非常简单,可以使用pip进行安装:

pip install requests

安装完成之后,我们就可以使用requests库发送请求了。

2.1.1 发送GET请求

GET请求是最简单的HTTP请求方式,用于从服务器检索数据。使用requests库发送GET请求非常直观:

import requests

response = requests.get('https://api.github.com/events')
print(response.text)

以上代码会输出GitHub事件流的JSON格式数据。在发送GET请求时,经常需要向服务器传递一些参数:

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://api.github.com/events', params=params)
print(response.url)

这里, params 字典中的键值对会被自动编码为URL查询字符串。

2.1.2 发送POST请求

与GET请求不同的是,POST请求通常用于向服务器提交数据。在requests库中,可以通过传递一个 data 参数来实现:

data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.text)

此外,发送POST请求时,还可以发送JSON格式的数据:

json_data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', json=json_data)
print(response.text)
2.1.3 处理HTTP头部和Cookies

在很多情况下,我们需要在请求中添加特定的HTTP头部或者处理Cookies。这可以通过修改请求头或使用会话(Session)对象来实现:

headers = {'User-Agent': 'My User Agent 1.0'}
session = requests.Session()
response = session.get('https://httpbin.org/headers', headers=headers)
print(response.text)

在上面的代码中,我们创建了一个会话对象 session ,并在请求中添加了一个自定义的 User-Agent 头部。使用会话对象发送请求的好处是,Session对象会在多个请求之间保持某些参数。若需要处理Cookies,requests库同样提供了简便的方法:

response = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response = session.get('https://httpbin.org/cookies')
print(response.text)

在上述代码中,我们首先使用 session.get 发送一个包含Cookies的请求,然后获取该网站设置的Cookies。

2.2 网络请求的异常处理

在进行网络请求时,可能会遇到各种异常情况,如网络错误、超时、服务端错误等。正确的异常处理是保证爬虫程序稳定运行的关键。在requests库中,异常处理可以通过Python标准的try-except语句块来实现。

2.2.1 常见异常及错误处理方法
try:
    response = requests.get('https://this-is-not-a-valid-url.com')
except requests.exceptions.RequestException as e:
    print(e)

在上面的代码块中,我们尝试访问一个不存在的URL,并捕获了可能发生的异常。 RequestException 是requests库所有错误的基类。

2.2.2 设置重试机制

对于一些暂时性的网络故障,我们可能希望自动重试请求,而不是直接抛出异常。我们可以通过 requests.adapters.HTTPAdapter 来实现这一功能:

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

retry_strategy = Retry(
    total=3,
    status_forcelist=[429, 500, 502, 503, 504],
    method_whitelist=["HEAD", "GET", "OPTIONS"]
)

adapter = HTTPAdapter(max_retries=retry_strategy)

session = requests.Session()
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get('https://httpbin.org/get')
print(response.text)

在这个例子中,我们创建了一个重试策略,设置了最大重试次数为3次,并且只有在遇到429或5XX系列错误时才会触发重试。

2.2.3 日志记录技巧

日志记录是跟踪爬虫程序运行情况的有效手段。在requests库中,我们可以利用Python的 logging 模块来记录日志。

import requests
import logging
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.WARNING)
requests_log.addHandler(logging.NullHandler())

logging.basicConfig(level=logging.INFO)

try:
    response = requests.get('https://httpbin.org/get')
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    logging.error(f"Http Error: {errh}")
except requests.exceptions.ConnectionError as errc:
    logging.error(f"Error Connecting: {errc}")
except requests.exceptions.Timeout as errt:
    logging.error(f"Timeout Error: {errt}")
except requests.exceptions.RequestException as err:
    logging.error(f"OOps: Something Else: {err}")

在这个代码块中,我们首先设置了requests包中urllib3的日志记录级别为WARNING,然后添加了一个 NullHandler 。通过 basicConfig 设置了全局日志级别为INFO,并在try-except块中记录了不同类型的异常。

通过以上示例和解释,我们可以看到requests库在网络爬虫开发中扮演着非常重要的角色,它不仅简单易用,而且功能丰富,能够帮助开发者有效地进行网络请求。在下一节中,我们将深入了解如何使用Python解析网页内容,这是爬虫开发中必不可少的一步。

3. 解析网页内容

3.1 BeautifulSoup库的解析技巧

3.1.1 解析HTML文档结构

解析网页内容是网络爬虫的核心任务之一。通过使用Python的 BeautifulSoup 库,可以方便地解析HTML文档结构。该库提供了一系列简单、易用的方法,让开发者能够通过不同的选择器查找页面元素,提取信息。

from bs4 import BeautifulSoup

html_doc = """

  
    The Dormouse's story
  
  
    

The Dormouse's story

... soup = BeautifulSoup(html_doc, 'html.parser')

在上面的代码中,我们首先从 bs4 模块导入 BeautifulSoup 类。然后定义了一个HTML文档的字符串 html_doc 。接着,我们创建了一个 BeautifulSoup 对象 soup ,这个对象包含了HTML文档的内容,并指定了解析器 html.parser

通过 soup.title 可以直接访问到 </code> 标签, <code> soup.p </code> 可以访问到第一个 <code> <p> </code> 标签, <code> soup.a </code> 则访问到第一个 <code> <a> </code> 标签。此外,使用 <code> .find() </code> 和 <code> .find_all() </code> 方法可以灵活地选取文档中的特定部分。 </p> <h4> 3.1.2 提取特定数据 </h4> <p> 提取网页中的特定数据是数据抓取的重要一环。 <code> BeautifulSoup </code> 提供了多种方法来帮助我们定位和提取数据: </p> <pre><code class="language-python"># 提取title标签的内容 title_tag = soup.title print(title_tag.text) # 输出: The Dormouse's story # 提取所有p标签 paragraphs = soup.find_all('p') for p in paragraphs: print(p.text) </code></pre> <p> 上述代码展示了如何提取页面中的 <code> <title> </code> 标签和所有 <code> <p> </code> 标签。使用 <code> .text </code> 属性可以获取标签内的文本内容,而 <code> .find_all() </code> 方法则可以帮助我们找到页面中所有的 <code> <p> </code> 标签。 </p> <h4> 3.1.3 数据清洗与转换 </h4> <p> 在提取网页数据后,往往需要进行数据清洗和转换,以便更易于分析和使用。 <code> BeautifulSoup </code> 提供了简单的方式来实现这一点: </p> <pre><code class="language-python"># 使用字符串替换清理数据 print(paragraphs[0].text.replace('\n', '').replace('\xa0', ' ')) # 使用正则表达式进行更复杂的替换 import re for p in paragraphs: p.string.replace_with(re.sub('\s+', ' ', p.string)) </code></pre> <p> 通过上述代码,我们先用字符串的 <code> .replace() </code> 方法替换掉不需要的空白字符,例如换行符 <code> \n </code> 和不间断空格 <code> \xa0 </code> 。接着,使用 <code> re </code> 模块中的 <code> sub() </code> 方法和正则表达式 <code> \s+ </code> 来替换多个连续空格为单个空格,这样数据就被进一步清洗和格式化了。 </p> <h3> 3.2 lxml库的高级应用 </h3> <h4> 3.2.1 lxml与性能优化 </h4> <p> <code> lxml </code> 是另一个强大的库,它基于libxml2和libxslt库,提供了高效的HTML和XML的解析能力。它支持XPath选择器,并且比 <code> BeautifulSoup </code> 在处理大型文档时更加高效。 </p> <pre><code class="language-python">import requests from lxml import etree # 使用requests获取网页内容 url = 'https://example.com' response = requests.get(url) html_content = response.content # 使用lxml解析HTML内容 tree = etree.HTML(html_content) </code></pre> <p> 在上述代码中,我们首先使用 <code> requests </code> 库获取网页内容,然后通过 <code> lxml.etree.HTML() </code> 方法解析这些内容。由于 <code> lxml </code> 的底层实现优化,使其在处理大型文档时速度更快,更节省内存。 </p> <h4> 3.2.2 XPath选择器的使用 </h4> <p> <code> XPath </code> 是一种在XML文档中查找信息的语言。使用 <code> lxml </code> 的XPath支持,可以快速定位和提取数据。 </p> <pre><code class="language-python"># 使用XPath找到所有的链接 for link in tree.xpath('//a'): href = link.xpath('@href') text = link.xpath('text()') print(href[0], text[0]) </code></pre> <p> 上面的代码段使用 <code> .xpath() </code> 方法来提取所有的 <code> <a> </code> 标签的href属性和标签内的文本。 <code> XPath </code> 表达式 <code> '//a' </code> 表示选择所有 <code> <a> </code> 标签。 </p> <h4> 3.2.3 处理JavaScript动态生成的内容 </h4> <p> 有时候,网站内容是通过JavaScript动态生成的,这意味着使用简单的HTTP请求无法直接获取到这些数据。 <code> lxml </code> 提供了 <code> lxml.html.tostring() </code> 函数,结合 <code> Selenium </code> 或 <code> Scrapy-splash </code> 等工具,可以处理这类内容。 </p> <pre><code class="language-python">from selenium import webdriver from lxml import html driver = webdriver.Chrome('path/to/chromedriver') driver.get('https://example.com') source = driver.page_source driver.quit() tree = html.fromstring(source) # 之后可以使用XPath等方法提取所需数据 </code></pre> <p> 上述代码中,我们首先使用 <code> Selenium </code> 来模拟浏览器操作,获取页面的源代码。然后,将源代码转换成 <code> lxml </code> 可以解析的形式,之后就可以像处理常规HTML文档一样提取所需数据。 </p> <p> 在接下来的章节中,我们将深入探讨如何利用 <code> lxml </code> 库处理复杂的网页内容,并结合实际案例展示其在解析性能优化方面的优势。 </p> <h2> 4. 数据处理和存储 </h2> <p> 数据处理和存储是网络爬虫开发中的重要环节。爬取的数据需要经过处理和清洗才能转换成有用的信息,而这些信息最终需要存储在合适的地方,以便进一步的分析和使用。本章节将深入探讨如何使用pandas库处理数据,以及如何记录和处理时间信息。 </p> <h3> 4.1 pandas库的强大功能 </h3> <p> pandas是一个功能强大的Python数据分析库,提供了大量高级数据结构和数据分析工具。它非常适合处理表格数据,能够快速的筛选、整理、分析数据,并将数据导出到各种格式的文件中。 </p> <h4> 4.1.1 数据的筛选与整理 </h4> <p> 在处理爬取的数据时,常常需要进行数据的筛选和整理。pandas提供了多种方式来实现这一点。 </p> <pre><code class="language-python">import pandas as pd # 假设df是一个pandas DataFrame对象,其中包含了爬取的数据 # 筛选年龄大于30的记录 filtered_df = df[df['age'] > 30] # 按照性别分组,并计算每组的平均年龄 average_ages = df.groupby('gender')['age'].mean() </code></pre> <p> 在上述代码中,我们首先筛选出了年龄大于30的记录。接着,我们按照性别进行了分组,并计算了每个性别组的平均年龄。这些操作都是通过pandas的内建函数来实现的,操作简单而功能强大。 </p> <h4> 4.1.2 数据分析与可视化 </h4> <p> pandas提供了丰富的函数来进行数据分析,并且可以与matplotlib和seaborn等可视化库无缝集成,使得数据的展示变得直观和美观。 </p> <pre><code class="language-python">import matplotlib.pyplot as plt # 假设我们有一个销售额的数据序列 sales = pd.Series([234, 356, 430, 478, 567]) # 绘制折线图展示销售额 sales.plot(kind='line') plt.title('Sales Data') plt.xlabel('Month') plt.ylabel('Sales Amount') plt.show() </code></pre> <p> 以上代码展示了一个简单的销售数据的折线图。通过这种方式,我们可以直观地观察数据随时间的变化趋势。 </p> <h4> 4.1.3 数据的导出与存储 </h4> <p> 数据处理完成后,我们通常需要将其导出到外部存储器中。pandas支持多种格式的输出,包括CSV、Excel、JSON等。 </p> <pre><code class="language-python"># 将数据导出到CSV文件 df.to_csv('output.csv', index=False) # 将数据导出到Excel文件 df.to_excel('output.xlsx', index=False) </code></pre> <p> 在上述代码中,我们分别将pandas DataFrame对象导出到了CSV和Excel文件中。参数 <code> index=False </code> 表示在导出时不包含行索引。 </p> <h3> 4.2 记录时间信息 </h3> <p> 在许多情况下,时间信息对于数据分析至关重要。pandas中的datetime模块可以用来处理时间数据,让我们能够方便地进行时间的格式化、处理和分析。 </p> <h4> 4.2.1 datetime模块的应用 </h4> <p> datetime模块是Python标准库的一部分,pandas对其进行了扩展,使其更适合数据分析任务。 </p> <pre><code class="language-python">import pandas as pd # 创建一个包含日期时间的序列 dates = pd.Series(pd.date_range('20230101', periods=10)) # 提取年、月、日信息 years = dates.dt.year months = dates.dt.month days = dates.dt.day # 使用resample方法按照月对日期进行重采样 monthly_dates = dates.dt.to_period('M') </code></pre> <p> 在这个例子中,我们创建了一个包含连续10个日期时间的序列,并提取了年、月、日信息。此外,我们使用了 <code> resample </code> 方法按月对日期进行了重采样。 </p> <h4> 4.2.2 时间数据的格式化与处理 </h4> <p> 在处理时间数据时,我们经常需要将时间数据转换为特定的字符串格式或从字符串中解析出时间数据。 </p> <pre><code class="language-python"># 将时间数据格式化为特定字符串 formatted_dates = dates.dt.strftime('%Y-%m-%d') # 解析字符串为时间数据 date_strings = ['2023-01-01', '2023-01-02', '2023-01-03'] parsed_dates = pd.to_datetime(date_strings) </code></pre> <p> 在上述代码中,我们首先将日期时间序列格式化为 <code> YYYY-MM-DD </code> 格式的字符串,然后将字符串序列转换为时间数据。 </p> <h4> 4.2.3 时间序列分析 </h4> <p> 时间序列分析是数据分析中的一个重要领域。pandas提供了强大的时间序列分析工具,包括时间的频率转换、滑动窗口统计、周期性分解等。 </p> <pre><code class="language-python"># 生成一个时间序列并进行重采样计算月平均值 date_range = pd.date_range('20230101', periods=365, freq='D') series = pd.Series(range(365), index=date_range) monthly_series = series.resample('M').mean() </code></pre> <p> 上述代码生成了一个包含连续365天数据的时间序列,并将其按照月份进行了重采样,计算了每个月的平均值。 </p> <p> 通过本章的介绍,我们了解了使用pandas库处理数据的强大功能,以及如何使用datetime模块进行时间数据的处理和分析。这些技能对于数据科学家和工程师而言至关重要,无论是在数据处理还是爬虫开发的其他方面,都提供了强大的支持。在下一章节中,我们将探讨爬虫开发中的法律和伦理问题,这是每位开发者在设计和运行爬虫时必须考虑的重要议题。 </p> <h2> 5. 爬虫开发中的法律与伦理 </h2> <p> 随着网络数据的重要性日益增加,网络爬虫技术被广泛应用于各种数据抓取任务中。然而,在这一技术迅速发展的背后,爬虫的法律与伦理问题成为了我们必须面对的挑战。本章节将详细探讨在开发爬虫时需要注意的法律与伦理问题,为开发者提供指导和建议。 </p> <h3> 5.1 遵循robots.txt协议 </h3> <h4> 5.1.1 了解robots.txt的作用 </h4> <p> <code> robots.txt </code> 文件是网站根目录下的一个文本文件,用于告诉网络爬虫哪些页面可以抓取,哪些不可以。它是互联网上普遍接受的一个非强制性协议,其内容被各大搜索引擎遵循。尽管 <code> robots.txt </code> 不能强制阻止爬虫抓取数据,但遵守 <code> robots.txt </code> 是爬虫开发者的基本道德准则。 </p> <h4> 5.1.2 编写友好的爬虫 </h4> <p> 友好型爬虫意味着在抓取数据时尊重目标网站的 <code> robots.txt </code> 协议,以及避免对网站服务器造成不必要的压力。在编写爬虫程序时,可以通过阅读 <code> robots.txt </code> 来确保不访问被禁止的页面。如果网站使用了标准的robots.txt格式,可以使用Python标准库中的robotparser模块来解析文件,并根据解析结果决定是否访问某个URL。 </p> <pre><code class="language-python">import urllib.robotparser rp = urllib.robotparser.RobotFileParser() rp.set_url('https://example.com/robots.txt') rp.read() user_agent = 'MyCrawler' url = 'https://example.com/page' if rp.can_fetch(user_agent, url): print("访问允许") else: print("访问禁止") </code></pre> <h4> 5.1.3 案例分析:合法与非法爬取 </h4> <p> 在实际操作中,一些爬虫无视 <code> robots.txt </code> 协议,抓取了本不允许抓取的内容。这不仅可能违反了网站的使用协议,还可能触犯法律。例如,抓取并公开个人隐私信息可能违反数据保护法。因此,进行爬虫开发时,应进行法律风险评估,并在法律允许的范围内进行数据采集。 </p> <h3> 5.2 法律法规遵守 </h3> <h4> 5.2.1 国内外网络爬虫相关法律 </h4> <p> 不同国家和地区对网络爬虫的法律规范存在差异。例如,欧盟的通用数据保护条例(GDPR)对个人数据的处理提出了严格要求。在美国,虽然没有像GDPR这样的全面数据保护法律,但某些特定类型的个人信息(如健康信息)仍受到法律保护。开发者需要了解并遵守所在国家和目标网站所在国家的相关法律法规。 </p> <h4> 5.2.2 数据采集的合法边界 </h4> <p> 确定数据采集的合法边界是一个复杂的过程。通常,这需要对法律条文进行解读,并考虑数据的性质和使用目的。在商业环境中,合法采集的数据可以是公开可用的、经过授权的,或者是遵循透明采集原则采集的。开发者在采集数据之前,应该明确数据的来源、用途以及是否有可能侵犯隐私或版权。 </p> <h4> 5.2.3 防止爬虫滥用的措施 </h4> <p> 为了防止爬虫滥用行为,除了法律法规的约束外,还需要技术措施的辅助。例如,可以设置反爬虫机制,如IP限制、验证码、动态令牌等。同时,开发者可以加入爬虫社区,遵守开发准则,例如设置合理的请求频率、提供联系邮箱等,使得爬虫行为更加规范化和文明化。 </p> <p> 通过对爬虫开发中法律与伦理的深入分析,我们可以看到,作为开发者,不仅要具备扎实的技术能力,还要有高度的社会责任感。合理合法地采集和使用网络数据,不仅是对他人权利的尊重,也是保护自身免受法律风险的重要措施。在接下来的章节中,我们将探讨如何使用Scrapy框架进行高效的数据抓取,并进一步了解如何将爬虫与数据分析技术相结合,以实现更深入的数据洞察。 </p> <h2> 6. Scrapy框架的使用与优势 </h2> <p> Scrapy 是一个快速的高层次的屏幕抓取和网络爬虫框架,用于抓取网站数据并提取结构化数据。它适用于各种规模的项目,从简单的数据抓取任务到复杂的、多源爬虫,甚至爬取整个网站。 </p> <h3> 6.1 Scrapy框架的安装和配置 </h3> <h4> 6.1.1 安装Scrapy </h4> <p> Scrapy的安装十分直接,通常可以通过Python的包管理工具pip来完成。打开命令行,输入以下命令: </p> <pre><code class="language-bash">pip install scrapy </code></pre> <p> 安装完成后,可以通过执行 <code> scrapy version </code> 来验证安装是否成功。 </p> <h4> 6.1.2 创建项目和设置环境 </h4> <p> 创建一个Scrapy项目非常简单。在命令行中,运行以下命令开始一个新的Scrapy项目: </p> <pre><code class="language-bash">scrapy startproject myproject </code></pre> <p> 这将创建一个名为 <code> myproject </code> 的文件夹,其中包含了项目的骨架代码。项目创建后,进入项目目录,并开始定义你的爬虫: </p> <pre><code class="language-bash">cd myproject scrapy genspider example example.com </code></pre> <p> 这里创建了一个名为 <code> example </code> 的爬虫,用于爬取 <code> example.com </code> 网站。 </p> <h4> 6.1.3 开发第一个Scrapy爬虫 </h4> <p> 一个基本的Scrapy爬虫由两部分组成:Item和Spider。Item用于定义如何提取数据,而Spider负责抓取数据。 </p> <pre><code class="language-python">import scrapy class MyItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field() age = scrapy.Field() # ... class ExampleSpider(scrapy.Spider): name = 'example' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] def parse(self, response): # 提取数据的代码 pass </code></pre> <p> 在上面的代码中, <code> MyItem </code> 类定义了要提取的数据结构, <code> ExampleSpider </code> 类定义了爬虫的起点和数据提取的处理方式。 </p> <h3> 6.2 Scrapy的中间件和管道 </h3> <h4> 6.2.1 中间件的自定义和使用 </h4> <p> 中间件是Scrapy的一个重要概念,允许我们修改Scrapy请求和响应的处理过程。下面是一个简单的中间件示例: </p> <pre><code class="language-python">class MyMiddleware(object): def process_request(self, request, spider): # 请求处理的代码 pass def process_response(self, request, response, spider): # 响应处理的代码 return response </code></pre> <p> 在你的爬虫项目中定义中间件后,需要在 <code> settings.py </code> 文件中启用它们: </p> <pre><code class="language-python">SPIDER_MIDDLEWARES = { 'myproject.myMiddleware.MyMiddleware': 543, } </code></pre> <h4> 6.2.2 管道的编写和数据处理 </h4> <p> 管道(Pipelines)用于处理爬取的item,可以用来清洗、验证和存储数据。一个管道可能像这样: </p> <pre><code class="language-python">class MyPipeline(object): def process_item(self, item, spider): # 数据处理的代码 return item def open_spider(self, spider): # 爬虫开启时执行的代码 pass def close_spider(self, spider): # 爬虫关闭时执行的代码 pass </code></pre> <p> 同样,要在 <code> settings.py </code> 中启用管道: </p> <pre><code class="language-python">ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline': 300, } </code></pre> <h4> 6.2.3 性能优化策略 </h4> <p> Scrapy提供多种方式来优化性能,例如: </p> <ul> <li> 控制并发请求数量: <code> CONCURRENT_REQUESTS </code> </li> <li> 设置下载延迟: <code> DOWNLOAD_DELAY </code> </li> <li> 使用代理和IP池:通过中间件设置多个代理进行轮换 </li> </ul> <h3> 6.3 Scrapy与数据处理分析技术结合 </h3> <h4> 6.3.1 Scrapy与pandas结合 </h4> <p> 当爬取的数据需要进行更复杂的数据分析时,可以将Scrapy和pandas结合使用。一个例子如下: </p> <pre><code class="language-python">import scrapy import pandas as pd class DataFrameSpider(scrapy.Spider): name = 'dfspider' start_urls = ['http://example.com'] def parse(self, response): df = pd.read_html(response.body.decode('utf-8'))[0] df.columns = ['name', 'age'] # 修改列名以匹配数据 return df.to_dict('records') </code></pre> <h4> 6.3.2 分析与可视化环境搭建 </h4> <p> 结合Scrapy和数据分析与可视化环境,可以使用Jupyter Notebook来创建和分享数据分析报告。例如,创建一个Notebook来分析和可视化爬取的数据: </p> <pre><code class="language-python">import pandas as pd import matplotlib.pyplot as plt # 假设df是爬取的数据集 df = pd.read_csv('data.csv') # 创建直方图 plt.hist(df['age'], bins=20) plt.show() </code></pre> <h4> 6.3.3 大数据处理框架的融合应用 </h4> <p> 对于大数据量的处理,可以将Scrapy和大数据框架如Apache Spark结合起来。示例如下: </p> <pre><code class="language-python">from pyspark.sql import SparkSession from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings spark = SparkSession.builder \ .appName("ScrapyAndSpark") \ .getOrCreate() process = CrawlerProcess(get_project_settings()) process.crawl(DataFrameSpider) process.start() # 获取数据并进行转换 rdd = spark.sparkContext.parallelize(process.crawled_data) df = rdd.toDF() df.show() </code></pre> <p> 这样,你就可以利用Spark强大的分布式处理能力来处理Scrapy爬取的大数据。 </p> <p> 在后续的章节中,我们将深入探讨如何利用Scrapy进行大规模数据抓取,并探讨如何将爬虫数据高效地导入数据库,进行存储和分析。 </p> <p> 本文还有配套的精品资源,点击获取 <img alt="menu-r.4af5f7ec.gif" src="http://img.e-com-net.com/image/info8/b382ea984dff45babbf94bb96ef7b607.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" width="0" height="0"> </p> <p> 简介:本文介绍了如何利用Python编程语言开发一个网络爬虫,用于从公开的气象或环保网站上抓取特定城市的PM2.5空气质量指数数据。Python因其简洁的语法和强大的库支持而适合此类任务。开发者可能使用了requests库进行网络请求、BeautifulSoup或lxml进行HTML解析、pandas进行数据处理和存储,以及datetime库处理时间信息。文章还可能讨论了如何记录数据采集时间,爬虫开发的法律和伦理要求,以及Scrapy框架的使用。读者将通过这段代码学习到网络爬虫的开发流程、数据处理技术,并了解如何处理和分析环境数据。 </p> <p> 本文还有配套的精品资源,点击获取 <img alt="menu-r.4af5f7ec.gif" src="http://img.e-com-net.com/image/info8/b382ea984dff45babbf94bb96ef7b607.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" width="0" height="0"> </p> <p></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1925647906975576064"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Python实现的PM2.5空气质量爬虫教程)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950233451282100224.htm" title="python 读excel每行替换_Python脚本操作Excel实现批量替换功能" target="_blank">python 读excel每行替换_Python脚本操作Excel实现批量替换功能</a> <span class="text-muted">weixin_39646695</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%AF%BBexcel%E6%AF%8F%E8%A1%8C%E6%9B%BF%E6%8D%A2/1.htm">读excel每行替换</a> <div>Python脚本操作Excel实现批量替换功能大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet,Cell这三个最根本的元素~明确需求原始excel如下我们的目标是把下面excel工作表的sheet1表页A列的内容“替换我吧”批量替换为B列的“我用来替换的</div> </li> <li><a href="/article/1950233199242178560.htm" title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a> <span class="text-muted">十除以十等于一</span> <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div> </li> <li><a href="/article/1950233167633903616.htm" title="男士护肤品哪个牌子好?十大男士护肤品排行榜" target="_blank">男士护肤品哪个牌子好?十大男士护肤品排行榜</a> <span class="text-muted">高省APP珊珊</span> <div>很多男生意识到护肤的必要性,开始着手护肤,但不知道该选哪个男士护肤品品牌使用好。目前市面上很多男士护肤品品牌,可谓琳琅满目,让人眼花缭乱。男士挑选护肤品时,根据自己皮肤需求去正规渠道挑选合适的知名护肤品比较放心靠谱。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入</div> </li> <li><a href="/article/1950233072825856000.htm" title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div> </li> <li><a href="/article/1950233040592629760.htm" title="2022-10-20" target="_blank">2022-10-20</a> <span class="text-muted">体力劳动者</span> <div>不因感觉稍纵即逝就不加记录。在女儿睡觉后我记下今天的小故事。接手新班级后,今天是第二次收到家长的感谢信(微信)。是我表扬次数最多的两位学生家长致来的感谢,他们明显感受到孩子自信、阳光了不少,写作业由被动变为了主动,家庭氛围也由鸡飞狗跳变成了其乐融融。在被顽皮的学生气得头晕之后,我感到了久违的价值感,责任感甚至使命感,我回复家长这样一句话:我们也需要家长的反馈好让我们的教育工作更有劲头。我也认识到,</div> </li> <li><a href="/article/1950232912192401408.htm" title="程翔授《评价一篇记叙文》" target="_blank">程翔授《评价一篇记叙文》</a> <span class="text-muted">行吟斯基</span> <div>桂林十一中高一2中学生自读程老师学生文章板书课题师巡看。看完举手。问:它是记叙文。不商量。独立打分。学生评价打分。师:高低都正常,不受干扰。师巡,略评。打完举手。调查:分层次举手——高分先举手。最低分。最高95分。最低45分。女:差距太大!师:同一篇,相差55分。若是你的文章,愿落谁手?男:身临其境感觉。师:你有此经历?没也没关系。女:不优美……,结尾无升华……无感悟……师:辞藻不美?(师追问)男</div> </li> <li><a href="/article/1950232910862807040.htm" title="《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单" target="_blank">《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单</a> <span class="text-muted">windy天意晚晴</span> <div>《玉骨遥》里,朱颜就是时影的命劫之人。重明与时影早就知道,他们一直瞒着大司命,如今大司命也知道了真相。可是大司命却没有杀朱颜,而是给朱颜下了诛心咒,还说时影的命劫已经破了,真的如此吗?1、计划总是赶不上变化的大司命从目前剧情来说,大司命还不如时影,他信心十足的事情总会有纰漏。他不让时影见命劫之女,结果时影还是遇上了。他想让时影走火入魔,一心复仇,结果时影在朱颜的劝说下放下了仇恨。大司命让时影开山收</div> </li> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950232782412247040.htm" title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a> <span class="text-muted">懒cici</span> <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div> </li> <li><a href="/article/1950232783670538240.htm" title="自律打卡第四天:比昨天进步一点点" target="_blank">自律打卡第四天:比昨天进步一点点</a> <span class="text-muted">花儿的念想</span> <div>今天新闻我们县城又确诊了一例,截止目前已经确诊的三例了,打开,看了一篇简友写的武汉的真实情况,有病住不了院,还没等到床位已经去世的消息,心里更加的难受,武汉尚且这样,如果是我们这没有高速没有火车的十八线的小县城发生这种情况,那情况将是更加的不堪设想,不敢想,唯有祈求灾难早点快去,平安才是最大的福气。突然觉得我的自律打卡,比昨天进步一点点。更希望疫情战争每一天都要比昨天好一点,希望一觉醒来听到的是好</div> </li> <li><a href="/article/1950232781174927360.htm" title="15个小技巧,让我的Windows电脑更好用了!" target="_blank">15个小技巧,让我的Windows电脑更好用了!</a> <span class="text-muted">曹元_</span> <div>01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们</div> </li> <li><a href="/article/1950232316974526464.htm" title="(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析" target="_blank">(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析</a> <span class="text-muted"></span> <div>数据如何从子公司流转到合并报表的全过程,即数据采集→合并引擎→报表输出,特别是HANA内存计算如何优化传统ETL瓶颈。SAPGroupReporting(GR)核心模块功能及数据流向的架构解析,涵盖核心组件、数据处理流程和关键集成点,适用于S/4HANA1809+版本:一、核心功能模块概览模块功能关键事务码/FioriApp数据采集(DataCollection)整合子公司财务数据(SAP/非SA</div> </li> <li><a href="/article/1950232316408295424.htm" title="9、汇编语言编程入门:从环境搭建到简单程序实现" target="_blank">9、汇编语言编程入门:从环境搭建到简单程序实现</a> <span class="text-muted">神经网络酱</span> <a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/MEPIS/1.htm">MEPIS</a><a class="tag" taget="_blank" href="/search/GNU%E5%B7%A5%E5%85%B7%E9%93%BE/1.htm">GNU工具链</a> <div>汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载</div> </li> <li><a href="/article/1950232275262173184.htm" title="月光下的罪恶(5)" target="_blank">月光下的罪恶(5)</a> <span class="text-muted">允歌玖沐</span> <div>5.被孤立顾纨是转校过来的,进入学校后,回头率很高“诶诶诶,你看那女生,哪个系的?”“不知道没见过。”“看那样,一看就是个胆小的货。”顾纨当做没听到,更狠的话她都听过,更何况女生们耍心眼?“他爸爸是做黑生意的,估计女儿也不是什么好的,你以后离他一家子远点。”她走向自己要上课的教室,一进门,所有人的目光看向她,顾纨若无其事的走进教室,开始上课。下课,一群人站起来,但是很显然,她周围的一圈人都不愿意和</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950231640819167232.htm" title="贝多芬诞辰250周年纪念" target="_blank">贝多芬诞辰250周年纪念</a> <span class="text-muted">万千星河赴远方</span> <div>就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极</div> </li> <li><a href="/article/1950231513744338944.htm" title="IK分词" target="_blank">IK分词</a> <span class="text-muted">初心myp</span> <div>实现简单的分词功能,智能化分词添加依赖配置:4.10.4org.apache.lucenelucene-core${lucene.version}org.apache.lucenelucene-analyzers-common${lucene.version}org.apache.lucenelucene-queryparser${lucene.version}org.apache.lucenel</div> </li> <li><a href="/article/1950231508648259584.htm" title="三件事—小白猫·雨天·八段锦" target="_blank">三件事—小白猫·雨天·八段锦</a> <span class="text-muted">咸鱼月亮</span> <div>1.最近楼下出现一只非常漂亮的粘人小白猫,看着不像是流浪猫,非常亲人。眼睛比蓝球的还大,而且是绿色的,很漂亮。第一次遇到它,它就跟我到电梯口,如果我稍微招招手,肯定就跟我进电梯了。后来我喂过它几次,好可惜不能养它,一只蓝球就是我的极限了。2.下雨天就心烦,好奇怪。明明以前我超爱看窗外的雨和听雨声,看来近来的心情不够宁静了。3.最近在练八段锦,从第一次就爱上了这个运动,很轻松缓慢,但是却出汗。感觉可</div> </li> <li><a href="/article/1950231509906550784.htm" title="25-1-2019" target="_blank">25-1-2019</a> <span class="text-muted">树藤与海岛呢</span> <div>hello八月来报道了今天看到了一篇文章就只想记下那两句话:良田千顷不过一日三餐广夏万间只睡卧榻三尺大概的意思就是要珍惜当下不要等来不及的时候才珍惜分享今天的两餐最近没有时间运动呢下个月补回好了说完了哈哈goodnight图片发自App图片发自App</div> </li> <li><a href="/article/1950231381485350912.htm" title="《极简思维》第三部分" target="_blank">《极简思维》第三部分</a> <span class="text-muted">小洋苏兮</span> <div>整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别</div> </li> <li><a href="/article/1950231308781285376.htm" title="力扣热题100-------54. 螺旋矩阵" target="_blank">力扣热题100-------54. 螺旋矩阵</a> <span class="text-muted">海航Java之路</span> <a class="tag" taget="_blank" href="/search/%E5%8A%9B%E6%89%A3/1.htm">力扣</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn</div> </li> <li><a href="/article/1950231254427299840.htm" title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a> <span class="text-muted">香尧</span> <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</div> </li> <li><a href="/article/1950230873060208640.htm" title="你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。" target="_blank">你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。</a> <span class="text-muted">霖霖z</span> <div>打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪</div> </li> <li><a href="/article/1950230804957294592.htm" title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a> <span class="text-muted">国服冰</span> <a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div> </li> <li><a href="/article/1950230678696161280.htm" title="C++ 计数排序、归并排序、快速排序" target="_blank">C++ 计数排序、归并排序、快速排序</a> <span class="text-muted">每天搬一点点砖</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>计数排序:是一种基于哈希的排序算法。他的基本思想是通过统计每个元素的出现次数,然后根据统计结果将元素依次放入排序后的序列中。这种排序算法适用于范围较小的情况,例如整数范围在0到k之间计数排序步骤:1初始化一个长度为最大元素值加1的计数数组,所有元素初始化为02遍历原始数组,将每个元素值作为索引,在计数数组中对应位置加13将数组清空4遍历计数器数组,按照数组中的元素个数放回到元数组中计数排序的优点和</div> </li> <li><a href="/article/1950230114205757440.htm" title="现在发挥你的优势" target="_blank">现在发挥你的优势</a> <span class="text-muted">爱生活的佑嘉</span> <div>来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习</div> </li> <li><a href="/article/1950229985633562624.htm" title="2023-11-02" target="_blank">2023-11-02</a> <span class="text-muted">一帆f</span> <div>发现浸润心田的感觉:今天一个机缘之下突然想分享我的婆媳关系,我一边分享一边回忆我之前和儿媳妇关系的微妙变化,特别是分享到我能感受到儿媳妇的各种美好,现在也能心平气和的和老公平等对话,看到自己看到老公,以己推人以人推己自然而然的换位思考,心中有一种美好的能量在涌动,一种浸润心田的感觉从心胸向全身扩散,美好极了……我很想记住这种感觉,赶紧把它写下来以留纪念,也就是当我看见他人的美好,美好的美妙的浸润心</div> </li> <li><a href="/article/1950229986984128512.htm" title="贫穷家庭的孩子考上985以后会怎样?" target="_blank">贫穷家庭的孩子考上985以后会怎样?</a> <span class="text-muted">Mellisa蜜思言</span> <div>我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我</div> </li> <li><a href="/article/1950229922647699456.htm" title="实时数据流计算引擎Flink和Spark剖析" target="_blank">实时数据流计算引擎Flink和Spark剖析</a> <span class="text-muted">程小舰</span> <a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin</div> </li> <li><a href="/article/1950229040682037248.htm" title="48. 旋转图像 - 力扣(LeetCode)" target="_blank">48. 旋转图像 - 力扣(LeetCode)</a> <span class="text-muted">Fiee-77</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a> <div>题目:给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2:输入:matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,</div> </li> <li><a href="/article/39.htm" title="java Illegal overloaded getter method with ambiguous type for propert的解决" target="_blank">java Illegal overloaded getter method with ambiguous type for propert的解决</a> <span class="text-muted">zwllxs</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>好久不来iteye,今天又来看看,哈哈,今天碰到在编码时,反射中会抛出 Illegal overloaded getter method with ambiguous type for propert这么个东东,从字面意思看,是反射在获取getter时迷惑了,然后回想起java在boolean值在生成getter时,分别有is和getter,也许我们的反射对象中就有is开头的方法迷惑了jdk,</div> </li> <li><a href="/article/166.htm" title="IT人应当知道的10个行业小内幕" target="_blank">IT人应当知道的10个行业小内幕</a> <span class="text-muted">beijingjava</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a> <div>10. 虽然IT业的薪酬比其他很多行业要好,但有公司因此视你为其“佣人”。   尽管IT人士的薪水没有互联网泡沫之前要好,但和其他行业人士比较,IT人的薪资还算好点。在接下的几十年中,科技在商业和社会发展中所占分量会一直增加,所以我们完全有理由相信,IT专业人才的需求量也不会减少。   然而,正因为IT人士的薪水普遍较高,所以有些公司认为给了你这么多钱,就把你看成是公司的“佣人”,拥有你的支配</div> </li> <li><a href="/article/293.htm" title="java 实现自定义链表" target="_blank">java 实现自定义链表</a> <span class="text-muted">CrazyMizzz</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>1.链表结构   链表是链式的结构 2.链表的组成    链表是由头节点,中间节点和尾节点组成    节点是由两个部分组成:       1.数据域       2.引用域 3.链表的实现 &nbs</div> </li> <li><a href="/article/420.htm" title="web项目发布到服务器后图片过一会儿消失" target="_blank">web项目发布到服务器后图片过一会儿消失</a> <span class="text-muted">麦田的设计者</span> <a class="tag" taget="_blank" href="/search/struts2/1.htm">struts2</a><a class="tag" taget="_blank" href="/search/%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87/1.htm">上传图片</a><a class="tag" taget="_blank" href="/search/%E6%B0%B8%E4%B9%85%E4%BF%9D%E5%AD%98/1.htm">永久保存</a> <div>  作为一名学习了android和j2ee的程序员,我们必须要意识到,客服端和服务器端的交互是很有必要的,比如你用eclipse写了一个web工程,并且发布到了服务器(tomcat)上,这时你在webapps目录下看到了你发布的web工程,你可以打开电脑的浏览器输入http://localhost:8080/工程/路径访问里面的资源。但是,有时你会突然的发现之前用struts2上传的图片</div> </li> <li><a href="/article/547.htm" title="CodeIgniter框架Cart类 name 不能设置中文的解决方法" target="_blank">CodeIgniter框架Cart类 name 不能设置中文的解决方法</a> <span class="text-muted">IT独行者</span> <a class="tag" taget="_blank" href="/search/CodeIgniter/1.htm">CodeIgniter</a><a class="tag" taget="_blank" href="/search/Cart/1.htm">Cart</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6%E3%80%80/1.htm">框架 </a> <div>今天试用了一下CodeIgniter的Cart类时遇到了个小问题,发现当name的值为中文时,就写入不了session。在这里特别提醒一下。 在CI手册里也有说明,如下: $data = array( 'id' => 'sku_123ABC', 'qty' => 1, '</div> </li> <li><a href="/article/674.htm" title="linux回收站" target="_blank">linux回收站</a> <span class="text-muted">_wy_</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%9B%9E%E6%94%B6%E7%AB%99/1.htm">回收站</a> <div>今天一不小心在ubuntu下把一个文件移动到了回收站,我并不想删,手误了。我急忙到Nautilus下的回收站中准备恢复它,但是里面居然什么都没有。     后来我发现这是由于我删文件的地方不在HOME所在的分区,而是在另一个独立的Linux分区下,这是我专门用于开发的分区。而我删除的东东在分区根目录下的.Trash-1000/file目录下,相关的删除信息(删除时间和文件所在</div> </li> <li><a href="/article/801.htm" title="jquery回到页面顶端" target="_blank">jquery回到页面顶端</a> <span class="text-muted">知了ing</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>html代码: <h1 id="anchor">页面标题</h1> <div id="container">页面内容</div> <p><a href="#anchor" class="topLink">回到顶端</a><</div> </li> <li><a href="/article/928.htm" title="B树、B-树、B+树、B*树" target="_blank">B树、B-树、B+树、B*树</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/B%E6%A0%91/1.htm">B树</a> <div>原文地址: http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right); &nb</div> </li> <li><a href="/article/1055.htm" title="数据库连接池" target="_blank">数据库连接池</a> <span class="text-muted">alafqq</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0/1.htm">数据库连接池</a> <div>http://www.cnblogs.com/xdp-gacl/p/4002804.html @Anthor:孤傲苍狼 数据库连接池 用MySQLv5版本的数据库驱动没有问题,使用MySQLv6和Oracle的数据库驱动时候报如下错误: java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connec</div> </li> <li><a href="/article/1182.htm" title="java泛型" target="_blank">java泛型</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java%E6%B3%9B%E5%9E%8B/1.htm">java泛型</a> <div>泛型 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,任意化的缺点就是要实行强制转换,这种强制转换可能会带来不安全的隐患   泛型的特点:消除强制转换 确保类型安全 向后兼容   简单泛型的定义:      泛型:就是在类中将其模糊化,在创建对象的时候再具体定义 class fan</div> </li> <li><a href="/article/1309.htm" title="javascript闭包[两个小测试例子]" target="_blank">javascript闭包[两个小测试例子]</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>一.程序一 <script> var name = "The Window"; var Object_a = {   name : "My Object",   getNameFunc : function(){ var that = this;     return function(){     </div> </li> <li><a href="/article/1436.htm" title="探索JUnit4扩展:假设机制(Assumption)" target="_blank">探索JUnit4扩展:假设机制(Assumption)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Assumption/1.htm">Assumption</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>一.假设机制(Assumption)概述        理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏得很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员当初设计测试用例时真正目的,</div> </li> <li><a href="/article/1563.htm" title="【Gson四】范型POJO的反序列化" target="_blank">【Gson四】范型POJO的反序列化</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a> <div>在下面这个例子中,POJO(Data类)是一个范型类,在Tests中,指定范型类为PieceData,POJO初始化完成后,通过 String str = new Gson().toJson(data); 得到范型化的POJO序列化得到的JSON串,然后将这个JSON串反序列化为POJO   import com.google.gson.Gson; import java.</div> </li> <li><a href="/article/1690.htm" title="【Spark八十五】Spark Streaming分析结果落地到MySQL" target="_blank">【Spark八十五】Spark Streaming分析结果落地到MySQL</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a> <div>几点总结: 1. DStream.foreachRDD是一个Output Operation,类似于RDD的action,会触发Job的提交。DStream.foreachRDD是数据落地很常用的方法 2. 获取MySQL Connection的操作应该放在foreachRDD的参数(是一个RDD[T]=>Unit的函数类型),这样,当foreachRDD方法在每个Worker上执行时,</div> </li> <li><a href="/article/1817.htm" title="NGINX + LUA实现复杂的控制" target="_blank">NGINX + LUA实现复杂的控制</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/nginx+lua/1.htm">nginx lua</a> <div>安装lua_nginx_module 模块 lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty Centos和debian的安装就简单了。。 这里说下freebsd的安装: fetch http://www.lua.org/ftp/lua-5.1.4.tar.gz tar zxvf lua-5.1.4.tar.gz cd lua-5.1.4 ma</div> </li> <li><a href="/article/1944.htm" title="java-递归判断数组是否升序" target="_blank">java-递归判断数组是否升序</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class IsAccendListRecursive { /*递归判断数组是否升序 * if a Integer array is ascending,return true * use recursion */ public static void main(String[] args){ IsAccendListRecursiv</div> </li> <li><a href="/article/2071.htm" title="Netty源码学习-DefaultChannelPipeline2" target="_blank">Netty源码学习-DefaultChannelPipeline2</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div>Netty3的API http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html 里面提到ChannelPipeline的一个“pitfall”: 如果ChannelPipeline只有一个handler(假设为handlerA)且希望用另一handler(假设为handlerB) 来</div> </li> <li><a href="/article/2198.htm" title="Java工具之JPS" target="_blank">Java工具之JPS</a> <span class="text-muted">chinrui</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>JPS使用     熟悉Linux的朋友们都知道,Linux下有一个常用的命令叫做ps(Process Status),是用来查看Linux环境下进程信息的。同样的,在Java Virtual Machine里面也提供了类似的工具供广大Java开发人员使用,它就是jps(Java Process Status),它可以用来</div> </li> <li><a href="/article/2325.htm" title="window.print分页打印" target="_blank">window.print分页打印</a> <span class="text-muted">ctrain</span> <a class="tag" taget="_blank" href="/search/window/1.htm">window</a> <div> function init() { var tt = document.getElementById("tt"); var childNodes = tt.childNodes[0].childNodes; var level = 0; for (var i = 0; i < childNodes.length; i++) { </div> </li> <li><a href="/article/2452.htm" title="安装hadoop时 执行jps命令Error occurred during initialization of VM" target="_blank">安装hadoop时 执行jps命令Error occurred during initialization of VM</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/jps/1.htm">jps</a> <div>在安装hadoop时,执行JPS出现下面错误   [slave16]root@192.168.11.10:/tmp/hsperfdata_hdfs# jps Error occurred during initialization of VM java.lang.Error: Properties init: Could not determine current working</div> </li> <li><a href="/article/2579.htm" title="PHP开发大型项目的一点经验" target="_blank">PHP开发大型项目的一点经验</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a> <div>一、变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候。变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆。变量的命名尽量规范化,不要与PHP中的关键字相冲突。 二、函数 PHP自带了很多函数,这给我们程序的编写带来了很多的方便。当然,在大型程序中我们往往自己要定义许多个函数,几十</div> </li> <li><a href="/article/2706.htm" title="android笔记之--向网络发送GET/POST请求参数" target="_blank">android笔记之--向网络发送GET/POST请求参数</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>使用GET方法发送请求 private static boolean sendGETRequest (String path, Map<String, String> params) throws Exception{ //发送地http://192.168.100.91:8080/videoServi</div> </li> <li><a href="/article/2833.htm" title="linux复习笔记 之bash shell (3) 通配符" target="_blank">linux复习笔记 之bash shell (3) 通配符</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/linux+%E9%80%9A%E9%85%8D%E7%AC%A6/1.htm">linux 通配符</a><a class="tag" taget="_blank" href="/search/linux%E9%80%9A%E9%85%8D%E7%AC%A6/1.htm">linux通配符</a> <div>转载请出自出处: http://eksliang.iteye.com/blog/2104387 在bash的操作环境中有一个非常有用的功能,那就是通配符。 下面列出一些常用的通配符,如下表所示 符号 意义 * 万用字符,代表0个到无穷个任意字符 ? 万用字符,代表一定有一个任意字符 [] 代表一定有一个在中括号内的字符。例如:[abcd]代表一定有一个字符,可能是a、b、c</div> </li> <li><a href="/article/2960.htm" title="Android关于短信加密" target="_blank">Android关于短信加密</a> <span class="text-muted">gqdy365</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>关于Android短信加密功能,我初步了解的如下(只在Android应用层试验):     1、因为Android有短信收发接口,可以调用接口完成短信收发;         发送过程:APP(基于短信应用修改)接受用户输入号码、内容——>APP对短信内容加密——>调用短信发送方法Sm</div> </li> <li><a href="/article/3087.htm" title="asp.net在网站根目录下创建文件夹" target="_blank">asp.net在网站根目录下创建文件夹</a> <span class="text-muted">hvt</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/Web+Forms/1.htm">Web Forms</a> <div>假设要在asp.net网站的根目录下建立文件夹hovertree,C#代码如下: string m_keleyiFolderName = Server.MapPath("/hovertree"); if (Directory.Exists(m_keleyiFolderName)) { //文件夹已经存在 return; } else { try { D</div> </li> <li><a href="/article/3214.htm" title="一个合格的程序员应该读过哪些书" target="_blank">一个合格的程序员应该读过哪些书</a> <span class="text-muted">justjavac</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E4%B9%A6%E7%B1%8D/1.htm">书籍</a> <div>编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。” 很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网友介绍这个程序员书单,不过都是推荐数</div> </li> <li><a href="/article/3341.htm" title="单实例实践" target="_blank">单实例实践</a> <span class="text-muted">跑龙套_az</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a> <div>   1、内部类 public class Singleton { private static class SingletonHolder { public static Singleton singleton = new Singleton(); } public Singleton getRes</div> </li> <li><a href="/article/3468.htm" title="PO VO BEAN 理解" target="_blank">PO VO BEAN 理解</a> <span class="text-muted">q137681467</span> <a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/DTO/1.htm">DTO</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>PO:      全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录。 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。     BO:     全称是 business object:业务对象 主要作用是把业务逻辑封装为一个对象。这个对</div> </li> <li><a href="/article/3595.htm" title="战胜惰性,暗自努力" target="_blank">战胜惰性,暗自努力</a> <span class="text-muted">金笛子</span> <a class="tag" taget="_blank" href="/search/%E5%8A%AA%E5%8A%9B/1.htm">努力</a> <div>偶然看到一句很贴近生活的话:“别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得吊儿郎当,和你一样会抱怨,而只有你自己相信这些都是真的,最后也只有你一人继续不思进取。”很多句子总在不经意中就会戳中一部分人的软肋,我想我们每个人的周围总是有那么些表现得“吊儿郎当”的存在,是否你就真的相信他们如此不思进取,而开始放松了对自己的要求随波逐流呢? 我有个朋友是搞技术的,平时嘻嘻哈哈,以</div> </li> <li><a href="/article/3722.htm" title="NDK/JNI二维数组多维数组传递" target="_blank">NDK/JNI二维数组多维数组传递</a> <span class="text-muted">wenzongliang</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a><a class="tag" taget="_blank" href="/search/NDK/1.htm">NDK</a> <div>多维数组和对象数组一样处理,例如二维数组里的每个元素还是一个数组 用jArray表示,直到数组变为一维的,且里面元素为基本类型,去获得一维数组指针。给大家提供个例子。已经测试通过。 Java_cn_wzl_FiveChessView_checkWin( JNIEnv* env,jobject thiz,jobjectArray qizidata) { jint i,j; int s</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>