python爬虫框架feapde的使用简介


Posted in Python onApril 20, 2021

1. 前言

大家好,我是安果!

众所周知,Python 最流行的爬虫框架是 Scrapy,它主要用于爬取网站结构性数据

今天推荐一款更加简单、轻量级,且功能强大的爬虫框架:feapder

项目地址:

https://github.com/Boris-code/feapder

2. 介绍及安装

和 Scrapy 类似,feapder 支持轻量级爬虫、分布式爬虫、批次爬虫、爬虫报警机制等功能

内置的 3 种爬虫如下:

  • AirSpider

轻量级爬虫,适合简单场景、数据量少的爬虫

  • Spider

分布式爬虫,基于 Redis,适用于海量数据,并且支持断点续爬、自动数据入库等功能

  • BatchSpider

分布式批次爬虫,主要用于需要周期性采集的爬虫

在实战之前,我们在虚拟环境下安装对应的依赖库

# 安装依赖库
pip3 install feapder

3. 实战一下

我们以最简单的 AirSpider 来爬取一些简单的数据

目标网站:aHR0cHM6Ly90b3BodWIudG9kYXkvIA==

详细实现步骤如下( 5 步)

3-1  创建爬虫项目

首先,我们使用「 feapder create -p 」命令创建一个爬虫项目

# 创建一个爬虫项目
feapder create -p tophub_demo

3-2  创建爬虫 AirSpider

命令行进入到 spiders 文件夹目录下,使用「 feapder create -s 」命令创建一个爬虫

cd spiders

# 创建一个轻量级爬虫
feapder create -s tophub_spider 1

其中

  • 1 为默认,表示创建一个轻量级爬虫 AirSpider
  • 2 代表创建一个分布式爬虫 Spider
  • 3 代表创建一个分布式批次爬虫 BatchSpider

3-3  配置数据库、创建数据表、创建映射 Item

以 Mysql 为例,首先我们在数据库中创建一张数据表

# 创建一张数据表
create table topic
(
    id         int auto_increment
        primary key,
    title      varchar(100)  null comment '文章标题',
    auth       varchar(20)   null comment '作者',
    like_count     int default 0 null comment '喜欢数',
    collection int default 0 null comment '收藏数',
    comment    int default 0 null comment '评论数'
);

然后,打开项目根目录下的 settings.py 文件,配置数据库连接信息

# settings.py

MYSQL_IP = "localhost"
MYSQL_PORT = 3306
MYSQL_DB = "xag"
MYSQL_USER_NAME = "root"
MYSQL_USER_PASS = "root"

最后,创建映射 Item( 可选 )

进入到 items 文件夹,使用「 feapder create -i 」命令创建一个文件映射到数据库

PS:由于 AirSpider 不支持数据自动入库,所以这步不是必须

3-4  编写爬虫及数据解析

第一步,首先使「 MysqlDB 」初始化数据库

from feapder.db.mysqldb import MysqlDB

class TophubSpider(feapder.AirSpider):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.db = MysqlDB()

第二步,在 start_requests 方法中,指定爬取主链接地址,使用关键字「download_midware 」配置随机 UA

import feapder
from fake_useragent import UserAgent

def start_requests(self):
    yield feapder.Request("https://tophub.today/", download_midware=self.download_midware)

def download_midware(self, request):
    # 随机UA
    # 依赖:pip3 install fake_useragent
    ua = UserAgent().random
    request.headers = {'User-Agent': ua}
    return request

第三步,爬取首页标题、链接地址

使用 feapder 内置方法 xpath 去解析数据即可

def parse(self, request, response):
    # print(response.text)
    card_elements = response.xpath('//div[@class="cc-cd"]')

    # 过滤出对应的卡片元素【什么值得买】
    buy_good_element = [card_element for card_element in card_elements if
                        card_element.xpath('.//div[@class="cc-cd-is"]//span/text()').extract_first() == '什么值得买'][0]

    # 获取内部文章标题及地址
    a_elements = buy_good_element.xpath('.//div[@class="cc-cd-cb nano"]//a')

    for a_element in a_elements:
        # 标题和链接
        title = a_element.xpath('.//span[@class="t"]/text()').extract_first()
        href = a_element.xpath('.//@href').extract_first()

        # 再次下发新任务,并带上文章标题
        yield feapder.Request(href, download_midware=self.download_midware, callback=self.parser_detail_page,
                              title=title)

第四步,爬取详情页面数据

上一步下发新的任务,通过关键字「 callback 」指定回调函数,最后在 parser_detail_page 中对详情页面进行数据解析

def parser_detail_page(self, request, response):
    """
    解析文章详情数据
    :param request:
    :param response:
    :return:
    """
    title = request.title

    url = request.url

    # 解析文章详情页面,获取点赞、收藏、评论数目及作者名称
    author = response.xpath('//a[@class="author-title"]/text()').extract_first().strip()

    print("作者:", author, '文章标题:', title, "地址:", url)

    desc_elements = response.xpath('//span[@class="xilie"]/span')

    print("desc数目:", len(desc_elements))

    # 点赞
    like_count = int(re.findall('\d+', desc_elements[1].xpath('./text()').extract_first())[0])
    # 收藏
    collection_count = int(re.findall('\d+', desc_elements[2].xpath('./text()').extract_first())[0])
    # 评论
    comment_count = int(re.findall('\d+', desc_elements[3].xpath('./text()').extract_first())[0])

    print("点赞:", like_count, "收藏:", collection_count, "评论:", comment_count)

3-5  数据入库

使用上面实例化的数据库对象执行 SQL,将数据插入到数据库中即可

# 插入数据库
sql = "INSERT INTO topic(title,auth,like_count,collection,comment) values('%s','%s','%s','%d','%d')" % (
title, author, like_count, collection_count, comment_count)

# 执行
self.db.execute(sql)

4. 最后

本篇文章通过一个简单的实例,聊到了 feapder 中最简单的爬虫 AirSpider

关于 feapder 高级功能的使用,后面我将会通过一系列实例进行详细说明

源码地址:https://github.com/xingag/spider_python/tree/master/feapder

以上就是python爬虫框架feapde的使用简介的详细内容,更多关于python爬虫框架feapde的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
利用Python生成文件md5校验值函数的方法
Jan 10 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python模拟事件触发机制详解
Jan 19 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Python之修改图片像素值的方法
Jul 03 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 Python
python实现大文本文件分割成多个小文件
Apr 20 #Python
Python绘制分类图的方法
Pytest allure 命令行参数的使用
在pyCharm中下载第三方库的方法
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 #Python
深入理解python多线程编程
Apr 18 #Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 #Python
You might like
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
js表格分页实现代码
2009/09/18 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
微信小程序模拟cookie的实现
2018/06/20 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
python中的闭包函数
2018/02/09 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Wallis官网:英国女装零售商
2020/01/21 全球购物
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
空气的环保标语
2014/06/12 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers