中企动力 > 头条 > python获取参数

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python获取参数

Python爬虫入门并不难,甚至进阶也很简单 流量视频课程

img

仇雨文

关注

互联网的数据爆炸式的增长,而利用 Python 爬虫我们可以获取大量有价值的数据:

1.爬取数据,进行市场调研和商业分析

爬取知乎优质答案,筛选各话题下最优质的内容; 抓取房产网站买卖信息,分析房价变化趋势、做不同区域的房价分析;爬取招聘网站职位信息,分析各行业人才需求情况及薪资水平。

2.作为机器学习、数据挖掘的原始数据

比如你要做一个推荐系统,那么你可以去爬取更多维度的数据,做出更好的模型。

3.爬取优质的资源:图片、文本、视频

爬取商品(店铺)评论以及各种图片网站,获得图片资源以及评论文本数据。

掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现。

但建议你从一开始就要有一个具体的目标,在目标的驱动下,你的学习才会更加精准和高效。这里给你一条平滑的、零基础快速入门的学习路径:

1.了解爬虫的基本原理及过程

2.Requests+Xpath 实现通用爬虫套路

3.了解非结构化数据的存储

4.应对特殊网站的反爬虫措施

5.Scrapy 与 MongoDB,进阶分布式

01

了解爬虫的基本原理及过程

大部分爬虫都是按“发送请求——获得页面——解析页面——抽取并储存内容”这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。

简单来说,我们向服务器发送请求后,会得到返回的页面,通过解析页面之后,我们可以抽取我们想要的那部分信息,并存储在指定的文档或数据库中。

在这部分你可以简单了解 HTTP 协议及网页基础知识,比如 POST\GET、HTML、CSS、JS,简单了解即可,不需要系统学习。

02

学习 Python 包并实现基本的爬虫过程

Python中爬虫相关的包很多:urllib、requests、bs4、scrapy、pyspider 等,建议你从requests+Xpath 开始,requests 负责连接网站,返回网页,Xpath 用于解析网页,便于抽取数据。

如果你用过 BeautifulSoup,会发现 Xpath 要省事不少,一层一层检查元素代码的工作,全都省略了。掌握之后,你会发现爬虫的基本套路都差不多,一般的静态网站根本不在话下,小猪、豆瓣、糗事百科、腾讯新闻等基本上都可以上手了。

来看一个爬取豆瓣短评的例子:

选中第一条短评,右键-“检查”,即可查看源代码

把短评信息的XPath信息复制下来

我们通过定位,得到了第一条短评的 XPath 信息:

如果我们想爬取很多条短评,那么自然应该去获取(复制)更多这样的 XPath:

观察第1、2、3条短评的 XPath,你会发现规律,只有

  • 后面的序号不一样,恰好与短评的序号相对应。那如果我们想爬取这个页面所有的短评信息,那么不要这个序号就好了呀。

    通过XPath信息,我们就可以用简单的代码将其爬取下来了:

    爬取的该页面所有的短评信息

    当然如果你需要爬取异步加载的网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化爬取,这样,知乎、时光网、猫途鹰这些动态的网站也基本没问题了。

    你还需要了解 Python 的基础知识,比如:

    文件读写操作:用来读取参数、保存爬取内容

    list(列表)、dict(字典):用来序列化爬取的数据

    条件判断(if/else):解决爬虫中的判断是否执行

    循环和迭代(for ……while):用来循环爬虫步骤

    03

    非结构化数据的存储

    爬回来的数据可以直接用文档形式存在本地,也可以存入数据库中。

    开始数据量不大的时候,你可以直接通过 Python 的语法或 pandas 的方法将数据存为text、csv这样的文件。还是延续上面的例子:

    用Python的基础语言实现存储:

    用pandas的语言来存储:

    这两段代码都可将爬下来的短评信息存储起来,把代码贴在爬取代码后面即可。

    存储的该页的短评数据

    当然你可能发现爬回来的数据并不是干净的,可能会有缺失、错误等等,你还需要对数据进行清洗,可以学习 pandas 包,掌握以下知识点就好:

    缺失值处理:对缺失数据行进行删除或填充

    重复值处理:重复值的判断与删除

    空格和异常值处理:清楚不必要的空格和极端、异常数据

    数据分组:数据划分、分别执行函数、数据重组

    04

    掌握各种技巧,应对特殊网站的反爬措施

    爬取一个页面的的数据是没问题了,但是我们通常是要爬取多个页面。

    这个时候就要看看在翻页的时候url是如何变化了,还是以短评的页面为例,我们来看多个页面的url有什么不同:

    通过前四个页面,我们就能够发现规律了,不同的页面,只是在最后标记了页面的序号。我们以爬取5个页面为例,写一个循环更新页面地址就好了。

    当然,爬虫过程中也会经历一些绝望啊,比如被网站封IP、比如各种奇怪的验证码、userAgent访问限制、各种动态加载等等。

    遇到这些反爬虫的手段,当然还需要一些高级的技巧来应对,常规的比如访问频率控制、使用代理IP池、抓包、验证码的OCR处理等等。

    比如我们经常发现有的网站翻页后url并不变化,这通常就是异步加载。我们用开发者工具取分析网页加载信息,通常能够得到意外的收获。

    通过开发者工具分析加载的信息

    比如很多时候如果我们发现网页不能通过代码访问,可以尝试加入userAgent 信息,甚至是浏览器的 cookie 信息。

    浏览器中的userAgent信息

    在代码中加入userAgent信息

    往往网站在高效开发和反爬虫之间会偏向前者,这也为爬虫提供了空间,掌握这些应对反爬虫的技巧,绝大部分的网站已经难不到你了。

    05

    Scrapy 与 MongoDB,进阶分布式

    掌握前面的技术,一般量级的数据和代码基本没有问题了,但是在遇到非常复杂的情况,可能仍然会力不从心,这个时候,强大的 scrapy 框架就非常有用了。

    scrapy 是一个功能非常强大的爬虫框架,它不仅能便捷地构建request,还有强大的 selector 能够方便地解析 response,然而它最让人惊喜的还是它超高的性能,让你可以将爬虫工程化、模块化。

    分布式爬取租房信息

    爬取的数据量大了,自然会需要数据库,MongoDB 可以方便你去存储大规模的数据。因为这里要用到的数据库知识其实非常简单,主要是数据如何入库、如何进行提取,在需要的时候再学习就行。

    MongoDB 存储职位信息

    分布式这个东西,听起来非常吓人,但其实就是利用多线程的原理让多个爬虫同时工作,需要你掌握 Scrapy + MongoDB + Redis 这三种工具。

    Scrapy 用于做基本的页面爬取,MongoDB 用于存储爬取的数据,Redis 则用来存储要爬取的网页队列,也就是任务队列。

    这个时候,你已经可以去写分布式爬虫了。

    你看,这一条学习路径下来,你已然可以成为老司机了,非常的顺畅。所以在一开始的时候,尽量不要系统地去啃一些东西,找一个实际的项目(开始可以从豆瓣、小猪这种简单的入手),直接开始就好。

    因为爬虫这种技术,既不需要你系统地精通一门语言,也不需要多么高深的数据库技术,高效的姿势就是从实际的项目中去学习这些零散的知识点,你能保证每次学到的都是最需要的那部分。

    当然唯一麻烦的是,在具体的问题中,如何找到具体需要的那部分学习资源、如何筛选和甄别,是很多初学者面临的一个大问题。

    不过不用担心,我们卓越准备了一门非常系统的Python课程,除了为你提供一条清晰的学习路径,我们甄选了最实用的学习资源以及庞大的主流Python案例库。短时间的学习,你就能够很好地掌握Python这门编程语言。

    推荐:

    《python视频教程0基础从入门到精通》 https://shimo.im/docs/Kr1P9b8k6X00ytct

  • Python编程入门之函数可变参数 行业视频课程

    img

    无施

    关注

    Finally, the least frequently used option is to specify that a function can be called with an arbitrary number of arguments. These arguments will be wrapped up in a tuple (see Tuples and Sequences). Before the variable number of arguments, zero or more normal arguments may occur.最后,最不常用的选项是指定函数可以用任意数量的参数来调用。这些参数将被封装在一个元组中(参见Tuples和序列)。在变量数目可变之前,可能出现零个或多个正常参数。

    defwrite_multiple_items(file,separator,*args):file.write(separator.join(args))

    Normally, these variadic arguments will be last in the list of formal parameters, because they scoop up all remaining input arguments that are passed to the function. Any formal parameters which occur after the *args parameter are ‘keyword-only’ arguments, meaning that they can only be used as keywords rather than positional arguments.通常,这些变量参数将在正式参数列表中最后一个,因为它们获取传递给函数的所有剩余输入参数。在*args参数之后出现的任何正式参数都是“仅关键字”参数,这意味着它们只能用作关键字而不是位置参数。

    >>> defconcat(*args,sep="/"):... returnsep.join(args)...>>> concat("earth","mars","venus")'earth/mars/venus'>>>concat("earth","mars","venus",sep=".")'earth.mars.venus'

    python之函数默认参数及注意点 行业视频课程

    img

    半死鱼

    关注

    前言

    在python中,函数的参数有多种类型,有默认参数、可变参数、关键字参数、命名关键字参数等,本文主要深入讲解默认参数。对于默认参数,其实在功能上就是为了简化函数调用。

    默认参数

    1、格式

    2、说明及注意点

    a. 在使用缺省参数后,对于函数的必填参数必须在前,默认参数在后。

    b. 默认参数在一个函数中可以有多个。

    c. 当一个函数中的某个参数的改动不大,就可以考虑将这个参数设置为默认参数,比如说一个人的民族,这种参数就可以设置为缺省参数。

    案例a

    小总结:从上图可以看出,对于num2这个参数如果你要传入的参数是100,则可传可不传,都是可以的。这个也是默认参数给我们带来的方便之处。

    python中print语句

    结论:其实在python中的print语句就是采用了缺省参数。

    使用可变类型作为缺省参数

    1、代码举例

    结论:上图中的程序运行结果是[10],[20], 但是实际上结果是[10],[10,20]。问题的原因主要在于scores的类型是一个列表,本身是一个可变类型,那么对于列表的append方法添加元素的时候并不会对socres进行重新创建一个新的列表,那么也就是说,你两次append元素,其实都是对同一个列表进行操作。

    总结

    对于默认参数,如果是不可变类型,那么多次对函数的调用是没有问题的。

    对于默认参数,如果是可变参数,那么对于参数的传递,就要特别考虑结果是正确性,所以对于这种情况,就必须在调用函数的时候就要重新初始化一次列表。

    Python函数学习之参数列表解包 推广视频课程

    img

    嵇太君

    关注

    The reverse situation occurs when the arguments are already in a list or tuple but need to be unpacked for a function call requiring separate positional arguments. For instance, the built-in range() function expects separate start and stop arguments. If they are not available separately, write the function call with the *-operator to unpack the arguments out of a list or tuple:当参数已经在列表或元组中时,相反的情况发生,但需要为需要单独位置参数的函数调用解包。例如,内置的Range()函数需要单独的开始和停止参数。如果它们单独不可用,则用*-运算符编写函数调用,以从列表或元组中解开参数:

    >>> list(range(3, 6)) # normal call with separate arguments

    [3, 4, 5]

    >>> args = [3, 6]

    >>> list(range(*args)) # call with arguments unpacked from a list

    [3, 4, 5]

    In the same fashion, dictionaries can deliver keyword arguments with the **-operator:以同样的方式,字典可以用**运算符传递关键字参数 即**-操作符来解包参数:

    >>> def parrot(voltage, state='a stiff', action='voom'):

    ... print("-- This parrot wouldn't", action, end=' ')

    ... print("if you put", voltage, "volts through it.", end=' ')

    ... print("E's", state, "!")

    ...

    >>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}

    >>>parrot(**d)

    -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

    Python 环境下的自动化机器学习超参数调优 推广视频课程

    img

    刘念柏

    关注

    选自Medium,作者:William Koehrsen,机器之心编译。

    机器学习算法的性能高度依赖于超参数的选择,对机器学习超参数进行调优是一项繁琐但却至关重要的任务。本文介绍了一个使用「Hyperopt」库对梯度提升机(GBM)进行贝叶斯超参数调优的完整示例,并着重介绍了其实现过程。

    由于机器学习算法的性能高度依赖于超参数的选择,对机器学习超参数进行调优是一项繁琐但至关重要的任务。手动调优占用了机器学习算法流程中一些关键步骤(如特征工程和结果解释)的时间。网格搜索和随机搜索则不会干涉这些步骤,但是需要大量的运行时间,因为它们浪费了时间去评估搜索空间中并不太可能找到最优点的区域。如今越来越多的超参数调优过程都是通过自动化的方法完成的,它们旨在使用带有策略的启发式搜索(informed search)在更短的时间内找到最优超参数,除了初始设置之外,并不需要额外的手动操作。

    贝叶斯优化是一种基于模型的用于寻找函数最小值的方法。近段时间以来,贝叶斯优化开始被用于机器学习超参数调优,结果表明,该方法在测试集上的表现更加优异,但需要的迭代次数小于随机搜索。此外,现在一些 Python 库的出现使得对任意的机器学习模型实现贝叶斯超参数调优变得更加简单。

    本文将介绍一个使用「Hyperopt」库对梯度提升机(GBM)进行贝叶斯超参数调优的完整示例。在本文作者早先的一篇文章中,他已经对这个方法背后的概念进行了概述,所以本文将着重介绍实现过程。和大多数机器学习的主题类似,读者并不需要理解所有的细节,但是了解基本的原理可以帮助读者更有效地使用这项技术!

    本文所有的代码都可以以 Jupyter Notebook 的形式在 GitHub 上获取(https://github/WillKoehrsen/hyperparameter-optimization)。

    本文目录:

    贝叶斯优化方法优化问题的四个组成部分目标函数域空间优化算法结果的历史数据优化搜索结果搜索结果的可视化搜索的演化过程继续搜索结语

    贝叶斯优化方法

    简单地说,贝叶斯优化通过基于过去对目标的评估结果建立一个代理函数(概率模型)找到使得目标函数最小的值。代理函数比目标函数更易于优化,因此下一个待评估的输入值是通过对代理函数应用某种标准(通常为预期提升)来选择的。贝叶斯方法不同于随机搜索或网格搜索,后两者都使用了过去的评估结果来选择接下来待评估的值。它们的思想是:通过根据过去表现良好的值选择下一个输入值来限制评价目标函数的高昂开销。

    对于超参数优化来说,其目标函数为使用一组超参数的机器学习模型的验证误差。它的目标是找出在验证集上产生最小误差的超参数,并希望将这些结果泛化到测试集上去。对目标函数评估的开销是巨大的,因为它需要训练带有一组特定超参数的机器学习模型。理想情况下,我们希望找到这样一方法,它既能探索搜索空间,又能限制耗时的超参数评估。贝叶斯超参数调优使用一个不断更新的概率模型,通过从过去的结果中进行推理,使搜索过程「专注」于有可能达到最优的超参数。

    Python 环境下有一些贝叶斯优化程序库,它们目标函数的代理算法有所区别。在本文中,我们将使用「Hyperopt」库,它使用树形 Parzen 评估器(TPE,https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf)作为搜索算法,其他的 Python 库还包含「Spearmint」(高斯过程代理)和「SMAC」(随即森林回归)。目前在这个领域有大量有趣的研究,所以如果你对某一个库不是很满意,你可以试试其他的选项!针对某个问题的通用结构(本文将使用的结构)可以在各个库间进行转换,其句法差异非常小。

    优化问题的四个组成部分

    贝叶斯优化问题有四个组成部分:

    1. 目标函数:我们想要最小化的对象,这里指带超参数的机器学习模型的验证误差

    2. 域空间:待搜索的超参数值

    3. 优化算法:构造代理模型和选择接下来要评估的超参数值的方法

    4. 结果的历史数据:存储下来的目标函数评估结果,包含超参数和验证损失

    通过以上四个步骤,我们可以对任意实值函数进行优化(找到最小值)。这是一个强大的抽象过程,除了机器学习超参数的调优,它还能帮我们解决其他许多问题。

    数据集

    在本文的示例中,我们将使用 Caravan Insurance 数据集(https://kaggle/uciml/caravan-insurance-challenge),它的目标是预测客户是否会购买一份保险产品。这是一个监督分类问题,带有 5800 个用于训练的观测值和 4000 个测试点。由于这是一个不平衡的分类问题,本文使用的评价性能的指标是受试者工作特征曲线下的面积(ROC AUC),ROC AUC 的值越高越好,其值为 1 代表模型是完美的。数据集如下所示:

    数据集(CARAVAN)是带标签的

    由于 Hyperopt 要做的是取最小值,我们将从目标函数中返回「1-ROC AUC」,从而提高 ROC AUC。

    梯度提升模型

    在本文中,我们对梯度提升机(GBM)的细节知识不做过多探讨,下面是我们需要理解的基本知识:GBM 是一种基于使用依次训练的弱学习器(多为决策树)构建强学习器的集成增强方法。GBM 中有许多超参数,它们控制着整个集成结构和单棵决策树。我们在这里使用的一种最有效的选择决策树数量的方法(称为评估器)是早停止(early stopping)。LightGBM 提供了一种 Python 环境下的快速简单的 GBM 实现。

    想了解更多 GBM 的细节,这里有一篇高屋建瓴的文章:https://medium/mlreview/gradient-boosting-from-scratch-1e317ae4587d一篇技术论文:https://brage.bibsys.no/xmlui/bitstream/handle/11250/2433761/16128_FULLTEXT.pdf

    抛开必要的背景知识不谈,让我们将用于超参数调优的贝叶斯优化问题的四个组成部分一一列举出来。

    具体实现请参见机器之心(wxID:almosthuman2014):https://mp.weixin.qq/s/hDTmSpht1M3Xc26bavPcK

    Python下单元测试框架与unittest单元测试框架实现参数化(附源码) 公司视频课程

    img

    断缘

    关注

     GitHub地址:https://github/wolever/nose-parameterized

    当我们在使用TestNG时,发现它有一个非常好用的参数化功能。当你的测试用例有固定的参数和断言结果时,它可以相似用例的节省用例的个数。

      例子如下:

    import static org.testng.Assert.assertEquals;

    import org.testng.annotations.DataProvider;

    import org.testng.annotations.Test;

    /**

    * Created by fnngj on 2017/3/19.

    */

    public class Demo {

    // 定义测试数据

    @DataProvider(name = "data")

    public Object[][] Users() {

    return new Object[][] {

    { 1, 1, 2},

    { 2, 2, 5},

    { 3, 3, 6},

    };

    }

    @Test(dataProvider="data")

    public void testAdd(int a,int b,int c) {

    assertEquals(a + b, c);

    }

    }

    相对而言,Python下面单元测试框架要弱上少,尤其是Python自带的unittest测试框架,不支持参数化,不支持多线程执行用例,不支持HTML测试报告的生成...。好再,部分不足我们可以通过unittest扩展来满足需求。比如现在要介绍一个参数化的扩展。

      在没有参数化功能的情况下,我们的用例需要这样编写。

    import unittest

    class TestAdd(unittest.TestCase):

    def test_add_01(self):

    self.assertEqual(1 + 2, 3)

    def test_add_02(self):

    self.assertEqual(2 + 2, 5)

    def test_add_03(self):

    self.assertEqual(3 + 3, 6)

    if __name__ == '__main__':

    unittest.main()

    nose-parameterized是一个针对Python单元测试框架实现参数化的扩展。同时支持不同的单元测试框架。

    GitHub地址:https://github/wolever/nose-parameterized

      然后,unittest就可以像TestNG一样写用例了。

    import unittest

    from nose_parameterized import parameterized

    class TestAdd(unittest.TestCase):

    @parameterized.expand([

    ("01",1, 1, 2),

    ("02",2, 2, 5),

    ("03",3, 3, 6),

    ])

    def test_add(self, name, a, b, c):

    self.assertEqual(a + b, c)

    if __name__ == '__main__':

    unittest.main(verbosity=2)

    执行结果:

    test_add_0_01 (__main__.TestAdd) ... ok

    test_add_1_02 (__main__.TestAdd) ... FAIL

    test_add_2_03 (__main__.TestAdd) ... ok

    当相同入参和断言结果的用例越多,这种写法用起来越爽!

    以上是全部内容,只是善于分享,不足之处请包涵!爬虫基本的原理就是,获取源码,进而获取网页内容。一般来说,只要你给一个入口,通过分析,可以找到无限个其他相关的你需要的资源,进而进行爬取。

    我也写了很多其他的非常简单的入门级的爬虫详细教程,

    关注后,点击我的头像,就可以查看到。

    欢迎大家一起留言讨论和交流,谢谢!

    img

    在线咨询

    建站在线咨询

    img

    微信咨询

    扫一扫添加
    动力姐姐微信

    img
    img

    TOP