1.盘点用jQuery框架实现“for循环”的网站网站四种方式!
2.Pandas也能爬虫?爬取网页数据并存储至本地数据库
3.写爬虫是遍历遍历什么意思?
4.PyTorch - DataLoader 源码解析(一)
盘点用jQuery框架实现“for循环”的四种方式!
本文主要探讨jQuery框架中实现元素遍历的源码源码四种常见方法,适合高级开发者使用。网站网站让我们通过实例来理解这些技巧。遍历遍历1. JavaScript基础遍历
首先,源码源码RemoteViewer 易语言 源码你可以使用JavaScript的网站网站for循环直接遍历元素。例如,遍历遍历遍历中的源码源码标签,忽略内容为“上海”的网站网站项:javascript
// JavaScript遍历示例
var listItems = document.querySelectorAll('ul li');
for (var i = 0; i < listItems.length; i++) {
if (listItems[i].textContent !== '上海') {
alert(listItems[i].textContent);
}
}
2. jQuery的.each()方法
jQuery提供了`.each()`函数,用于遍历元素集合。遍历遍历例如,源码源码带有索引和元素对象的网站网站参数形式:javascript
// jQuery.each()示例
$('ul li').each(function(index, element) {
if (element.textContent !== '上海') {
console.log(index, element.textContent);
}
});
3. $.each()函数
另一种是$.each(),与`.each()`类似,遍历遍历但语法略有不同:javascript
// $.each()示例
$.each($('ul li'),源码源码 function(index, element) {
// ...
});
4. for...of循环(jQuery 3.0+)
在jQuery 3.0及以上版本中,使用for...of语法更加简洁:javascript
// for...of循环示例
for (let li of $('ul li')) {
if (li.textContent !== '上海') {
console.log(li.textContent);
}
}
完整源码
以上就是四种遍历方式的详细示例,通过实践这些方法,你可以更好地掌握jQuery在遍历元素上的灵活性。Pandas也能爬虫?爬取网页数据并存储至本地数据库
read_html函数,用于简单爬取静态网页中的表格数据,但只适用于table格式的数据,而非所有表格都能用read_html爬取。有的查看cookie源码网站表面看似表格,实则在网页源代码中为列表形式,read_html对此无能为力。
为解决这一问题,可以结合pymysql库与SQL数据库,实现数据的读取与存储。整个流程如下:首先利用read_html抓取网页数据,然后通过pymysql库建立连接,将数据存储至本地数据库,最后使用read_sql读取数据库中的数据。
具体步骤如下:
1. 使用read_html抓取数据:学习read_html()函数的参数,使用该函数抓取新浪财经数据中心的表格数据。在代码中通过Shift+Tab调用代码提示功能,了解read_html常用参数。通过右键点击检查元素,确认新浪财经数据中心的数据为表格型数据。使用read_html爬取数据,返回结果为DataFrame组成的list,通过索引[0]即可获取爬取的表格数据。若数据中心包含多页数据,通过构造网址链接并使用for循环遍历,依次使用read_html爬取数据,并用concat函数合并表格数据。网络拓扑源码
2. pymysql建立连接:使用pymysql库与数据库建立连接,输入数据库地址、用户名、密码、数据库名与端口号,获取游标对象。执行SQL命令,如'USE demo',创建一张空表test_table,包含多个字段。向表中插入从网页爬取的数据,迭代读取每行数据,转化数据类型,保存在values内。关闭游标,提交,关闭数据库连接。
3. read_sql数据库查询:利用Python从数据库查询数据,通过pymysql库建立连接,使用read_sql命令读取数据库数据。read_sql函数中的sql参数用于执行SQL语法查询数据,查询结果可直接通过代码获取。矢量绘图 源码
总结,通过read_html与pymysql库结合,实现了网页数据的抓取与数据库的存储,再利用read_sql实现数据库数据的查询。这一过程需要读者熟练掌握并灵活运用相关知识,如对数据分析有兴趣,欢迎关注,持续分享数据分析知识,提供在线问答平台,点击下方卡片提问。
写爬虫是什么意思?
爬虫(Crawler)是指在互联网上抓取信息的程序。简单来说,就是让计算机自动化地从互联网上获取数据。爬虫可以遍历整个互联网,通过读取源代码获取信息并抓取数据,然后对数据进行分析处理。在互联网各种信息迅速发展的时候,爬虫成为了一种高效率的信息抓取方式。
爬虫在各种领域都有广泛的应用。比如在电商中,商家可以通过爬虫来获取竞争对手的价格信息来制定更有竞争力的价格。在科研领域,启航宗谱源码爬虫可以抓取各种文献来进行分析和研究。而在金融领域,爬虫可以用于大数据分析和预测分析等,使金融决策更加合理科学。
虽然爬虫可以带来方便和效率,但是也存在一些问题。由于爬虫可以轻易地获取大量数据,所以也会导致信息的泛滥和难以判断数据的真假。同时,爬虫行为也容易被识别甚至屏蔽,有时可能会对被抓取网站带来一定的影响。因此,在使用和开发爬虫的过程中,需要遵循相关规定和道德准则。
PyTorch - DataLoader 源码解析(一)
本文为作者基于个人经验进行的初步解析,由于能力有限,可能存在遗漏或错误,敬请各位批评指正。
本文并未全面解析 DataLoader 的全部源码,仅对 DataLoader 与 Sampler 之间的联系进行了分析。以下内容均基于单线程迭代器代码展开,多线程情况将在后续文章中阐述。
以一个简单的数据集遍历代码为例,在循环中,数据是如何从 loader 中被取出的?通过断点调试,我们发现循环时,代码进入了 torch.utils.data.DataLoader 类的 __iter__() 方法,具体内容如下:
可以看到,该函数返回了一个迭代器,主要由 self._get_iterator() 和 self._iterator._reset(self) 提供。接下来,我们进入 self._get_iterator() 方法查看迭代器的产生过程。
在此方法中,根据 self.num_workers 的数量返回了不同的迭代器,主要区别在于多线程处理方式不同,但这两种迭代器都是继承自 _BaseDataLoaderIter 类。这里我们先看单线程下的例子,进入 _SingleProcessDataLoaderIter(self)。
构造函数并不复杂,在父类的构造器中执行了大量初始化属性,然后在自己的构造器中获得了一个 self._dataset_fetcher。此时继续单步前进断点,发现程序进入到了父类的 __next__() 方法中。
在分析代码之前,我们先整理一下目前得到的信息:
下面是 __next__() 方法的内容:
可以看到最后返回的是变量 data,而 data 是由 self._next_data() 生成的,进入这个方法,我们发现这个方法由子类负责实现。
在这个方法中,我们可以看到数据从 self._dataset_fecther.fetch() 中得到,需要依赖参数 index,而这个 index 由 self._next_index() 提供。进入这个方法可以发现它是由父类实现的。
而前面的 index 实际上是由这个 self._sampler_iter 迭代器提供的。查找 self._sampler_iter 的定义,我们发现其在构造函数中。
仔细观察,我们可以在倒数第 4 行发现 self._sampler_iter = iter(self._index_sampler),这个迭代器就是这里的 self._index_sampler 提供的,而 self._index_sampler 来自 loader._index_sampler。这个 loader 就是最外层的 DataLoader。因此我们回到 DataLoader 类中查看这个 _index_sampler 是如何得到的。
我们可以发现 _index_sampler 是一个由 @property 装饰得到的属性,会根据 self._auto_collation 来返回 self.batch_sampler 或者 self.sampler。再次整理已知信息,我们可以得到:
因此,只要知道 batch_sampler 和 sampler 如何返回 index,就能了解整个流程。
首先发现这两个属性来自 DataLoader 的构造函数,因此下面先分析构造函数。
由于构造函数代码量较大,因此这里只关注与 Sampler 相关的部分,代码如下:
在这里我们只关注以下部分:
代码首先检查了参数的合法性,然后进行了一轮初始化属性,接着判断了 dataset 的类型,处理完特殊情况。接下来,函数对参数冲突进行了判断,共判断了 3 种参数冲突:
检查完参数冲突后,函数开始创建 sampler 和 batch_sampler,如下图所示:
注意,仅当未指定 sampler 时才会创建 sampler;同理,仅在未指定 batch_sampler 且存在 batch_size 时才会创建 batch_sampler。
在 DataLoader 的构造函数中,如果不指定参数 batch_sampler,则默认创建 BatchSampler 对象。该对象需要一个 Sampler 对象作为参数参与构造。这也是在构造函数中,batch_sampler 与 sampler 冲突的原因之一。因为传入一个 batch_sampler 时,说明 sampler 已经作为参数完成了 batch_sampler 的构造,若再将 sampler 传入 DataLoader 是多余的。
以第一节中的简单代码为例,此时并未指定 Sampler 和 batch_sampler,也未指定 batch_size,默认为 1,因此在 DataLoader 构造时,创建了一个 SequencialSampler,并传入了 BatchSampler 进行构建。继续第一节中的断点,可以发现:
具体使用 sampler 还是 batch_sampler 来生成 index,取决于 _auto_collation,而从上面的代码发现,只要存在 self.batch_sampler 就永远使用 batch_sampler 来生成。batch_sampler 与 sampler 冲突的原因之二:若不设置冲突,那么使用者试图同时指定 batch_sampler 与 sampler 后,尤其是在使用者继承了新的 Sampler 子类后, sampler 在获取数据的时候完全没有被使用,这对开发者来说是一个困惑的现象,容易引起不易察觉的 BUG。
继续断点发现程序进入了 BatchSampler 的 __iter__() 方法,代码如下:
从代码中可以发现,程序不停地从 self.sampler 中获取 idx 加入列表,直到填满一个 batch 的量,并将这一整个 batch 的 index 返回到迭代器的 _next_data()。
此处由 self._dataset_fetcher.fetch(index) 来获取真正的数据,进入函数后看到:
这里依然根据 self.auto_collation(来自 DataLoader._auto_collation)进行分别处理,但是总体逻辑都是通过 self.dataset[] 来调用 Dataset 对象的 __getitem__() 方法。
此处的 Dataset 是来自 torchvision 的 DatasetFolder 对象,这里读取文件路径中的后,经过转换变为 Tensor 对象,与标签 target 一起返回。参数中的 index 是由迭代器的 self._dataset_fetcher.fetch() 传入。
整个获取数据的流程可以用以下流程图简略表示:
注意:
另附:
对于一条循环语句,在执行过程中发生了以下事件: