爬虫第二课:定义函数

  • 定义函数

定义函数就是封装一部分代码,设置参数,输入相应的参数就会返回相应的结果。如果一个爬虫的代码超过五十行,那么如果不定义函数,每一行代码就会看起来很凌乱,如果定义一个函数的话,界面的结构就会很清晰。每次使用直接调用函数就可以了,不需要重复敲代码。
比如:
定义一个啷个数之和减去两个数之差的函数:

def func(x,y):
    a = x + y
    b = x - y
    result = a - b
    return result

下次如果任意给出两个数,计算它们的和减去他们的差,直接调用func()函数就好了,不需要再一步一步的写计算步骤。

  • 爬虫应用

在爬虫的思路中,需要获得url,发送请求获得响应,提取数据。有时发送请求不只是发送一次请求,提取数据不仅是提取一次数据,需要多次提取。那这是就需要要定义相对应的函数,比如定义一个发送请求的函数。如下图所示:

def get_page(url):                #定义一个发送请求的函数,起名为get_page()。
    try:                          #try和except 是为了保证程序能够一直运行下去的。
        r=requests.get(url,headers=headers)   #通过requests库的get函数向服务器发送请求。
        r.raise_for_status()           #根据服务器返回的状态码来判断是否请求成功,若成功就返回函数运行结果,若失败跳到except那行,执行except下面的语句。
        r.encoding=r.apparent_encoding     #防止乱码
        return r.text   #返回服务器给出响应的文本信息
    except Exception as e: #若try里面的内容执行成功,这行代码就会被跳过。
        print(e)    #将运行失败的原因打印出来,

这是一个通用的代码,每一行代码的意思我已经标注出了它们的含义。每次写爬虫代码的时候,基本上都可以把这段代码复制上去,有时候需要稍加修改一点,那就是如果我们请求的网页数据是动态生成的,那么return后面的r.text需要改成r.json()。大多数时候是根本不需要修改的。

  • yield和return的区别
    一般函数的最后都是用return将函数的结果返回出来,有时也会用到yield。用yield的时候就是当函数内有循环的时候,直接写yield比较方便,返回的数据类型是个列表。下面看一下两个函数:
def func1():  #函数一
	list1=[]
    for i in range(1, 5):
    	list1.append(i)
    return list1

def func2():  函数二
    for i in range(1, 5):
        yield i

函数一和函数二返回的结果是一样的,都返回一个列表[1,2,3,4]。但是要注意return和yield的位置,在函数一中,return的位置放在了循环的外面,在函数二中,yield放在了循环的里面。如果return放在了循环的里面,程序就会出错。

  • 函数像什么

    首先你要明白函数的作用,函数是实现特定功能的,你往函数里输入一个对象,它就会给你返回一个对象。就像一个家具加工厂一样,你往加工厂里输入木材,加工厂就会输出家具。你想让羽毛变成羽绒服,那你就把羽毛送到羽绒服加工厂,羽绒服加工厂就会输出羽绒服。函数就像这些加工厂一样,能实现一个特定的功能。

  • 在python里定义一个函数

Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号‘:’,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
我们以自定义一个求绝对值的my_abs函数为例:

def my_abs(x):
	if x>0:
		return x
	else:
		return -x

在函数my_abs()中输入对象x,如果x>0,则返回x。如果x<0,则返回-x。
请自行测试并调用my_abs看看返回结果是否正确.

  • python的内置函数
    Python中有很多已经写好的函数,不需要自己写代码,可以直接使用,如下图所示
    在这里插入图片描述
    Python的内置函数很多,但爬虫需要用的并不多,不需要每个内置函数都要掌握,最长用的就那么几个,不常用的函数只要知道它的存在就行,需要的临时百度一下用法就可以了。
    常用的内置函数比如sum(),是用来求和的,sorted()是用来排序的。Zip()是用来合并两个列表以便同时循环,enumerate()是在for循环基础上,遍历元素的同时给出索引号。

猜你喜欢

转载自blog.csdn.net/weixin_41779359/article/details/86227792
今日推荐