前言
今天讲述很多大厂都在用的feapder框架,前面更新了十四个从零开始学python的系列文章,分别是 :
1.编程语法必修篇
2.网络编程篇
3.多线程/多进程/协程篇
4.MySQL数据库篇
5.Redis数据库篇
6.MongoDB数据库篇
7.机器学习篇
8.全栈开发篇
9.Numpy/pandas/matplotlib篇
10.Hadoop篇
11.Spark篇
12.爬虫工程师篇
13.爬虫工程师自动化和抓包篇
14.scrapy框架篇
本系列文根据以下学习路线展开讲述:
一丶feapder任务调度机制
Feapder是一个基于Python的开源网络爬虫框架,具有任务调度、请求管理、数据解析等功能。其中,任务调度机制是Feapder框架的核心组成部分之一,用于管理和调度爬虫任务的执行。
任务调度机制的核心概念是任务队列(Task Queue),它用于存储待执行的任务,并按照指定的优先级和调度策略来决定任务的执行顺序。Feapder框架使用Redis作为任务队列的存储后端,并通过调度器(Scheduler)来管理任务队列的操作。
下面是Feapder框架任务调度机制的详细解释:
1.任务队列(Task Queue):
Feapder使用Redis作为任务队列的存储后端。任务队列中存储了待执行的任务,每个任务包含了要爬取的网址、爬虫名称、优先级等信息。当爬虫启动时,它会从任务队列中获取待执行的任务,并开始执行。
2.调度器(Scheduler):
调度器是任务调度机制的核心组件,用于管理任务队列。它负责从任务队列中获取待执行的任务,并根据任务的优先级和调度策略来确定任务的执行顺序。调度器还负责将已执行的任务返回给任务队列,以便可以对其进行后续处理。
Feapder框架中的调度器实现了多个调度策略,包括先进先出(FIFO)、优先级(Priority)和随机(Random)等。开发者可以根据实际需求选择适合的调度策略。
3.爬虫任务(Spider Task):
爬虫任务是任务调度机制的核心对象,表示待执行的爬虫任务。每个爬虫任务包含了要爬取的网址、待执行的爬虫名称、任务优先级等信息。爬虫任务由调度器从任务队列中获取,并通过调度器分发给相应的爬虫执行。当爬虫完成任务后,会将任务返回给调度器,从而完成任务的生命周期。
4.爬虫执行过程:
当Feapder框架启动时,调度器会从任务队列中获取待执行的任务。然后,根据调度策略和任务优先级,将任务分发给相应的爬虫进行执行。爬虫执行任务后,会返回任务的执行结果给调度器。调度器根据任务的状态进行下一步的调度决策,继续获取下一个待执行的任务,并分发给爬虫继续执行。这样,任务的执行和调度就形成了一个循环,直到任务队列中没有待执行的任务为止。
通过任务调度机制,Feapder框架可以高效地管理和调度大量的爬虫任务,并实现灵活的任务优先级和调度策略。
二丶Feapder中间件实现异常处理
在Feapder框架中,中间件(Middleware)是一种拦截和处理请求以及响应的机制,用于在请求发送和响应解析过程中进行额外的处理。中间件可以用于实现异常处理、请求过滤、请求修改、日志记录等功能。
下面是Feapder框架中间件实现异常处理的详细解释:
1.异常处理中间件(Exception Middleware) :
异常处理中间件是一种特殊类型的中间件,用于捕获和处理爬虫请求过程中可能出现的异常情况。当请求过程中发生异常时,异常处理中间件会捕获异常并进行相应的处理,如记录日志、重试请求等。
2.异常处理中间件的实现:
在Feapder框架中,可以自定义异常处理中间件,实现自己的异常处理逻辑。可以通过继承BaseMiddleware并重写相应的方法来实现异常处理中间件。
-
process_request(request, spider) 方法用于处理请求发送之前的逻辑。在该方法中,可以对请求进行一些预处理,或者进行异常处理的初始化操作。
-
process_response(request, response, spider) 方法用于处理请求响应的逻辑。在该方法中,可以对响应进行一些处理,或者捕获和处理请求过程中可能出现的异常情况。
-
process_exception(request, exception, spider) 方法用于处理请求过程中发生的异常情况。在该方法中,可以针对特定的异常类型进行相应的处理,如记录日志、重试请求等。
3.配置异常处理中间件:
在Feapder框架的配置文件中,可以指定使用哪些中间件以及它们的顺序。对于异常处理中间件,可以将其添加到中间件列表中,并指定其顺序。Feapder框架在执行请求过程时,会按照中间件列表的顺序依次调用相应的中间件方法。
通过中间件机制,Feapder框架提供了灵活的异常处理能力。开发者可以自定义异常处理中间件,并根据自己的需求进行定制化的异常处理逻辑。
三丶框架对接selenium实现自动化
feapder是一个基于Python的爬虫框架,它提供了一些方便的工具和接口,可以帮助开发者快速构建爬虫。其中,feapder框架对接selenium实现自动化是其重要的功能之一。
Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,比如点击、输入、滚动等。在爬虫中,我们可以利用Selenium来模拟用户的操作,从而实现一些需要登录或者需要执行JavaScript代码的爬虫任务。
下面是feapder框架对接selenium实现自动化的详细步骤:
1.安装Selenium和ChromeDriver
在使用Selenium之前,需要先安装Selenium和ChromeDriver。Selenium可以通过pip安装,ChromeDriver需要根据自己的Chrome浏览器版本下载对应的驱动程序。
2.创建SeleniumDownloader
在feapder中,我们可以通过创建SeleniumDownloader来实现对接Selenium。SeleniumDownloader是一个下载器,它可以在下载网页时使用Selenium来模拟用户的操作。
from feapder.downloader import SeleniumDownloader
downloader = SeleniumDownloader(
chrome_executable_path="path/to/chromedriver",
headless=False, # 是否使用无头浏览器
load_images=False, # 是否加载图片
window_size=(1920, 1080), # 浏览器窗口大小
timeout=30, # 超时时间
)
3.创建Spider
在feapder中,我们可以通过创建Spider来实现爬虫任务。在Spider中,我们可以使用SeleniumDownloader来下载网页,并且可以在下载前或下载后执行一些自定义的操作。
from feapder import Spider
class MySpider(Spider):
def start_requests(self):
yield self.request(url="https://www.baidu.com", callback=self.parse)
def parse(self, request, response):
# 使用SeleniumDownloader下载网页
response = self.download(request, downloader_cls=SeleniumDownloader)
# 在下载前或下载后执行一些自定义的操作
driver = response.meta["driver"]
driver.execute_script("alert('Hello, world!')")
# 解析网页
...
if __name__ == "__main__":
MySpider.start()
在上面的代码中,我们使用SeleniumDownloader下载了百度首页,并在下载后执行了一个JavaScript脚本,弹出了一个提示框。
4.配置Selenium
在使用Selenium时,我们需要配置一些选项,比如浏览器窗口大小、超时时间等。在feapder中,我们可以通过在Spider中定义selenium_options属性来配置Selenium。
from selenium.webdriver.chrome.options import Options
class MySpider(Spider):
selenium_options = Options()
selenium_options.add_argument("--disable-gpu")
selenium_options.add_argument("--disable-dev-shm-usage")
selenium_options.add_argument("--disable-extensions")
selenium_options.add_argument("--disable-infobars")
selenium_options.add_argument("--disable-notifications")
selenium_options.add_argument("--disable-popup-blocking")
selenium_options.add_argument("--disable-setuid-sandbox")
selenium_options.add_argument("--disable-web-security")
selenium_options.add_argument("--ignore-certificate-errors")
selenium_options.add_argument("--no-sandbox")
selenium_options.add_argument("--start-maximized")
selenium_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
def start_requests(self):
...
在上面的代码中,我们定义了一些常用的Selenium选项,比如禁用GPU加速、禁用扩展、禁用通知等。
5.使用代理
在爬虫中,我们经常需要使用代理来隐藏自己的IP地址。在feapder中,我们可以通过在Spider中定义proxy_pool属性来使用代理。
class MySpider(Spider):
proxy_pool = ["http://127.0.0.1:8888", "http://127.0.0.1:8889"]
def start_requests(self):
...
在上面的代码中,我们定义了两个代理地址,feapder会自动从中选择一个代理来访问网页。
6.使用Cookie
在爬虫中,我们经常需要使用Cookie来模拟登录状态。在feapder中,我们可以通过在Spider中定义cookie_pool属性来使用Cookie。
class MySpider(Spider):
cookie_pool = [
{"name": "name1", "value": "value1", "domain": "domain1.com"},
{"name": "name2", "value": "value2", "domain": "domain2.com"},
]
def start_requests(self):
...
在上面的代码中,我们定义了两个Cookie,feapder会自动将它们添加到请求头中。
7.使用自定义的SeleniumDownloader
在feapder中,我们可以通过继承SeleniumDownloader来实现自定义的下载器。在自定义的下载器中,我们可以重写一些方法,比如before_download、after_download等,来实现一些自定义的操作。
from feapder.downloader import SeleniumDownloader
class MyDownloader(SeleniumDownloader):
def before_download(self, request):
# 在下载前执行一些自定义的操作
...
def after_download(self, request, response):
# 在下载后执行一些自定义的操作
...
class MySpider(Spider):
downloader_cls = MyDownloader
def start_requests(self):
...
在上面的代码中,我们定义了一个自定义的下载器MyDownloader,并在Spider中使用它来下载网页。
8.总结
通过以上步骤,我们可以在feapder框架中对接Selenium,实现自动化爬虫任务。在使用Selenium时,我们需要注意一些问题,比如浏览器窗口大小、超时时间、代理、Cookie等。同时,我们也可以通过自定义的SeleniumDownloader来实现一些自定义的操作。
四丶feapder分布式采集
Feapder是一个基于Python的分布式爬虫框架,它支持多种数据存储方式,包括MySQL、MongoDB、Redis等。Feapder框架的分布式采集功能可以让多个爬虫节点同时工作,提高爬取效率。
下面是Feapder框架分布式采集的详细介绍:
1.安装Feapder框架
首先需要安装Feapder框架,可以使用pip命令进行安装:
pip install feapder
2.创建爬虫项目
使用Feapder框架创建一个爬虫项目非常简单,只需要继承Feapder类并实现相应的方法即可。下面是一个简单的爬虫示例:
from feapder import Spider
class MySpider(Spider):
def start_requests(self):
yield self.request("http://www.example.com")
def parse(self, request, response):
print(response.text)
在这个示例中,我们创建了一个名为MySpider的爬虫类,它继承自Feapder类。在start_requests
方法中,我们发送了一个请求并将其返回。在parse方法中,我们打印了响应的文本内容。
3.配置分布式采集
要启用分布式采集功能,需要在配置文件中设置相应的参数。下面是一个示例配置文件:
# 配置文件
name: my_spider
log_level: INFO
redis:
host: 127.0.0.1
port: 6379
db: 0
password: ""
queue_name: my_spider
max_tasks: 100
concurrency: 10
在这个配置文件中,我们设置了Redis作为任务队列的存储方式,并指定了队列名称、最大任务数和并发数等参数。
4.启动爬虫节点
要启动爬虫节点,需要使用Feapder命令行工具。首先需要安装Feapder命令行工具:
pip install feapder-cli
然后使用feapder命令启动爬虫节点:
feapder run my_spider
在这个命令中,我们指定了要运行的爬虫名称为my_spider。
5.提交任务
要提交任务,可以使用Feapder框架提供的TaskQueue类。下面是一个示例:
from feapder import TaskQueue
queue = TaskQueue()
queue.put("http://www.example.com")
在这个示例中,我们创建了一个TaskQueue对象,并向其中提交了一个任务。
6.运行爬虫
当任务提交完成后,可以使用Feapder框架提供的run方法来运行爬虫:
from feapder import run_spider
run_spider(MySpider)
在这个示例中,我们使用run_spider方法来运行MySpider爬虫。
7.查看结果
当爬虫运行完成后,可以查看爬取的结果。Feapder框架支持多种数据存储方式,包括MySQL、MongoDB、Redis等。可以根据需要选择相应的存储方式。
以上就是Feapder框架分布式采集的详细介绍。使用Feapder框架可以轻松实现分布式爬虫,提高爬取效率。