尊重原创版权: https://www.gewuweb.com/hot/16192.html
有人可以用Python同时抓取多个站点!怎么做到的?
尊重原创版权: https://www.gewuweb.com/sitemap.html
你好,我是悦创。
本篇将开启我自己啃代理池的心得,将逐步放送,因为代理池搭建较为复杂,这里我就尽可能把代理池分成几篇来讲,同时也保证,在我其他篇放出来之前,每一篇都是你们的新知识。
学习就像看小说一样,一次一篇就会显得额外的轻松! 当你把学习当作某个娱乐的事情来做,你会发现不一样的世界!
我们无法延长生命长度,但是我们延长生命宽度,学习编程就是扩展生命最有力的武器!
1. 看完之后你会得到什么
- 返回 yield;
- eval 的使用;
- 多个代理网站同时抓取;
- 使用异步测试代理是否可用;
- Python 的元类编程简单介绍;
- 正则表达式、PyQuery 提取数据;
- 模块化编程;
废话不多说,马上步入正题!
2. 你需要的准备
在学习本篇文章时,希望你已经具备如下技能或者知识点:
- Python 环境(推荐 Python 3.7+);
- Python 爬虫常用库;
- Python 基本语法;
- 面向对象编程;
- yield、eval 的使用;
- 模块化编程;
3. 课前预习知识点
对于代理池的搭建呢,虽然我已经尽可能地照顾到绝大多数地小白,把代理地的搭建呢,进行了拆分,不过对于培训机构或者自学不是特别精进的小伙伴来说还是有些难度的,对于这些呢?我这里也给大家准备了知识点的扫盲。以下内容节选自我个人博客文章,这里为了扫盲就提供必要部分,想看完整的文章可以点击此链接:https://www.aiyc.top/archives/605.html
3.1 Python 的元类编程
原类,然而我啥也不懂。只能靠百度和谷歌了,主要还是用谷歌来查啦,百度前几条永远是广告准确度也不行(个人观点),
也顺便参考了几个博客:廖雪峰网站,添加了一点自己的观点和理解。
3.1.1 type()
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。 比方说我们要定义一个 Hello 的 class,就写一个
hello.py 模块(这里我实际创建的是: the_test_code_project.py 模块):
1
2
3
|
class Hello(object):
def hello(self, name='world'):
print('Hello, %s.' % name)
—|—
当 Python 解释器载入 hello 模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个 Hello 的 class
对象,测试如下:
1
2
3
4
5
|
if __name__ == '__main__':
h = Hello()
h.hello()
print(type(Hello))
print(type(h))
—|—
运行结果如下:
1
2
3
|
Hello, world.
<class 'type'>
<class '__main__.Hello'>
—|—
其中,上面的输出结果: main.Hello 等价于 <class ‘the_test_code_project.Hello’>
运行的方式不同显示的方式也不同,但含义是一样的。
type() 函数可以查看一个类型或变量的类型,为了让小白更轻松,我也写了个例子:
1
2
3
4
5
6
7
8
9
10
11
12
|
number = 12
string = 'Hello AIYC!'
float_number = 12.1
list_data = [1, '2', 3.5, 'AIYC'] # 可变
tuples = (1, '2', 3.5, 'AIYC') # 不可变
if __name__ == '__main__':
print(type(number))
print(type(string))
print(type(float_number))
print(type(list_data))
print(type(tuples))
—|—
运行结果:
1
2
3
4
5
|
<class 'int'>
<class 'str'>
<class 'float'>
<class 'list'>
<class 'tuple'>
—|—
Hello 是一个 class,它的类型就是 type ,而 h 是一个实例,它的类型就是 class Hello 。 我们说 class
的定义是运行时动态创建的,而创建 class 的方法就是使用 type() 函数。 type()
函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过 type() 函数创建出 Hello 类,而无需通过 class
Hello(object)… 的定义:
1
2
3
4
5
6
|
def fn(self, name='world'): # 先定义函数
print('Hello, %s.' % name)
Hello = type('Hello', (object,), dict(hello=fn)) # 创建 Hello class
# Hello = type('Class_Name', (object,), dict(hello=fn)) # 创建 Hello class
# type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
—|—
我们接下来来调用一下代码,看输出的结果如何:
1
2
3
4
5
|
if __name__ == '__main__':
h = Hello()
h.hello()
print(type(Hello))
print(type(h))
—|—
这里推荐写成: if name == ‘main’: 使代码更加的规范。 运行结果:
1
2
3
|
Hello, world.
<class 'type'>
<class '__main__.Hello'>
—|—
要创建一个 class 对象, type() 函数依次传入 3 个参数:
- class 的名称;
- 继承的父类集合,注意 Python 支持多重继承,如果只有一个父类,别忘了 tuple 的单元素写法;(这个个 tuple 单元素写法起初本人不太理解,然后一查并认真观察了一下上面的代码就想起来 tuple 单元素写法需要加逗号(,),就是你必须这么写: tuple_1 = (1,) 而不能这么写: tuple_2 = (1) , tuple_2 = (1) 的写法,Python 会自动认为是一个整数而不是一个元组)
- class 的方法名称与函数绑定,这里我们把函数 fn 绑定到方法名 hello 上。
通过 type() 函数创建的类和直接写 class 是完全一样的,因为 Python 解释器遇到 class 定义时,仅仅是扫描一下 class
定义的语法,然后调用 type() 函数创建出 class。(直接 Class 创建也是) 正常情况下,我们都用 class Xxx…
来定义类,但是, type()
函数也允许我们动态创建出类来,也就是说,动态语言本身支持运行期动态创建类,这和静态语言有非常大的不同,要在静态语言运行期创建类,必须构造源代码字