命令行工具

命令行工具为feapder内置支持的,可方便快速的创建项目、爬虫、item、以及调试请求等,使用方法如下:

1.查看支持的命令行

打开命令行窗口,输入feapder

  1. >feapder
  2. feapder 1.1.3
  3. Usage:
  4. feapder <command> [options] [args]
  5. Available commands:
  6. create create projectfeapderitem and so on
  7. shell debug response
  8. zip zip project
  9. Use "feapder <command> -h" to see more info about a command

可见feapder支持createshellzip三种命令

2. feapder create

使用feapder create 可快速创建项目、爬虫、item等,具体支持的命令可输入feapder create -h 查看使用帮助

  1. > feapder create -h
  2. usage: cmdline.py [-h] [-p] [-s] [-i] [-t] [-init] [-j] [-sj] [-c] [--params] [--setting] [--host] [--port] [--username] [--password] [--db]
  3. 生成器
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. -p , --project 创建项目 feapder create -p <project_name>
  7. -s , --spider 创建爬虫 feapder create -s <spider_name>
  8. -i , --item 创建item feapder create -i <table_name> 支持模糊匹配 feapder create -i %table_name%
  9. -t , --table 根据json创建表 feapder create -t <table_name>
  10. -init 创建__init__.py feapder create -init
  11. -j, --json 创建json
  12. -sj, --sort_json 创建有序json
  13. -c, --cookies 创建cookie
  14. --params 解析地址中的参数
  15. --setting 创建全局配置文件feapder create --setting
  16. --host mysql 连接地址
  17. --port mysql 端口
  18. --username mysql 用户名
  19. --password mysql 密码
  20. --db mysql 数据库名

具体使用方法如下:

1. 创建爬虫项目

命令

  1. feapder create -p <project_name>

示例:

  1. feapder create -p first-project

生成如下:

-w354

  • items: 文件夹存放与数据库表映射的item
  • spiders: 文件夹存放爬虫脚本
  • main.py: 运行入口
  • setting.py: 爬虫配置文件

若项目比较简单,不需要这个层次结构管理,也可不创建项目,直接创建爬虫

2. 创建爬虫

命令

  1. feapder create -s <spider_name>

示例:创建名为first_spider的爬虫

  1. feapder create -s first_spider
  2. 请选择爬虫模板
  3. > AirSpider
  4. Spider
  5. TaskSpider
  6. BatchSpider

输入命令后,可以按上下键选择爬虫模板,如选择 AirSpider爬虫模板,生成first_spider.py, 内容如下:

  1. import feapder
  2. class FirstSpider(feapder.AirSpider):
  3. def start_requests(self):
  4. yield feapder.Request("https://www.baidu.com")
  5. def parse(self, request, response):
  6. print(response)
  7. if __name__ == "__main__":
  8. FirstSpider().start()

若在项目下创建,建议先进入到spiders目录下,再创建爬虫

3. 创建 item

item为与数据库表的映射,与数据入库的逻辑相关。 在使用此命令前,需在数据库中创建好表,且setting.py中配置好数据库连接地址

命令

  1. feapder create -i <item_name>

输出:

  1. 请选择Item类型
  2. > Item
  3. Item 支持字典赋值
  4. UpdateItem
  5. UpdateItem 支持字典赋值

示例

  1. 建表

    1. CREATE TABLE `spider_data` (
    2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3. `title` varchar(255) DEFAULT NULL,
    4. PRIMARY KEY (`id`)
    5. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
  1. 配置setting.py, 连接方式换成自己数据库的

    -w799

  1. 进入items目录,执行命令

    1. feapder create -i spider_data

生成如下:

  1. from feapder import Item
  2. class SpiderDataItem(Item):
  3. """
  4. This class was generated by feapder.
  5. command: feapder create -i spider_data.
  6. """
  7. def __init__(self, *args, **kwargs):
  8. # self.id = None
  9. self.title = None

若字段有默认值或者自增,则默认注释掉,可按需打开

若不配置setting.py, 可在命令行中指定数据库连接信息

  1. feapder create -i spider_data --host localhost --db feapder --username feapder --password feapder123

也可在环境变量中配置数据库连接信息, 以mac电脑为例

  1. > vim ~/.bash_profile
  2. export MYSQL_IP='xxx'
  3. export MYSQL_PORT='xxx'
  4. export MYSQL_DB='xxx'
  5. export MYSQL_USER_NAME='xxx'
  6. export MYSQL_USER_PASS='xxx'
  7. > source ~/.bash_profile

这样,以后所有的项目setting.py中均可不配置mysql连接信息

若item字段过多,不想逐一赋值,可选择支持字典赋值的Item类型创建

命令行工具 - 图3

生成:

  1. from feapder import Item
  2. class SpiderDataItem(Item):
  3. """
  4. This class was generated by feapder.
  5. command: feapder create -i spider_data 1.
  6. """
  7. def __init__(self, *args, **kwargs):
  8. # self.id = kwargs.get('id')
  9. self.title = kwargs.get('title')

这样当我们请求回来的json数据时,可直接赋值,如

  1. response_data = {"title":" 测试"} # 模拟请求回来的数据
  2. item = SpiderDataItem(**response_data)

4. 创建json或有序json

此命令和快速将 xxx:xxx 这种字符串格式转为json格式,常用于将网页或者抓包工具抓取出来的header、cookie转为json

用法示例:

  1. 输入命令,回车

    1. > feapder create -j
    2. 请输入需要转换的内容: xxx:xxx格式,支持多行)
  1. copy 请求头,粘贴到提示下方

    命令行工具 - 图4

  2. 输出如下:

    -w1394

sort_json 与json命令类似,只不过该命令生成的json是按照key排序的有序字典, 命令为

  1. feapder create -sj

5. 根据json创建表

有时,我们需要解析的字段特别多,手动建表太麻烦,此命令可根据json内容的key创建表,根据value推断字段类型

运行前,请参考创建item过程,将数据库配置好

命令:

  1. feapder create -t <table_name>

用的示例:

  1. > feapder create -t test
  2. 请输入表数据 json格式 {"name":"张三"}
  3. 等待输入:
  4. {"name":"张三"}
  5. 请设置注释 回车跳过
  6. name : varchar(255) -> comment
  7. 是否添加batch_date 字段 y/n):n
  8. 请设置唯一索引, 多个逗号间隔
  9. 等待输入:
  10. id
  11. CREATE TABLE `feapder`.`test` (
  12. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id 自动递增',
  13. `name` varchar(255) COMMENT '',
  14. `gtime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '抓取时间',
  15. PRIMARY KEY (`id`),
  16. UNIQUE `idx` USING BTREE (`id`) comment ''
  17. ) COMMENT='';
  18. test 创建成功

创建过程会提示添加字段注释、唯一索引等。batch_date用于记录采集批次的,不用可输入n。看到创建成功后,我们去数据库里就可以看到表了

6. 创建init

该命令用于创建_init.py的,并自动会引入当前目录下的所有py文件到\all_

示例如下:

  1. feapder create -init

观察生成的_init_.py文件,已自动包含当前目录下的py文件 -w880

3. feapder shell

下载调试器,可方便测试抽取规则是否正确,输入feapder shell -h查看使用帮助

  1. > feapder shell -h
  2. 下载调试器
  3. usage: feapder shell [options] [args]
  4. optional arguments:
  5. -u, --url 抓取指定url
  6. -c, --curl 抓取curl格式的请求

由提示可以看出,支持url及curl两种方式

  1. 以url为例,请求百度:

    请求

    1. > feapder shell -u https://www.baidu.com
    2. MainThread|2020-06-21 23:21:37,208|request.py|get_response|line:283|DEBUG|
    3. -------------- None.parser request for ----------------
    4. url = https://www.baidu.com
    5. method = GET
    6. body = {'proxies': None, 'timeout': 22, 'stream': True, 'verify': False, 'headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'}}
    7. <Response [200]>
    8. Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
    9. Type 'copyright', 'credits' or 'license' for more information
    10. IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help.
  1. now you can use response
  2. In [1]:
  3. 测试抽取titlexpath是否正确
  4. In [1]: response.xpath('//title/text()').extract_first()
  5. Out[1]: '百度一下,你就知道'
  6. 可以看出,我们可以直接使用response response支持xpath表达式
  7. 若想查看都支持哪些函数,可输入`response.` 然后敲两次`tab键`,如下:
  8. ![-w1738](http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/06/21/15927532396490.jpg)
  1. 以curl为例,请求百度(通常用来测试post接口比较方便)

    1. 打开浏览器检查工具,复制需要测试的接口为curl格式 -w569

    2. 测试 输入feapder shell --, 粘贴刚刚复制的curl

      1. > feapder shell --curl 'https://www.baidu.com/' \
      2. -H 'Connection: keep-alive' \
      3. -H 'Pragma: no-cache' \
      4. -H 'Cache-Control: no-cache' \
      5. -H 'Upgrade-Insecure-Requests: 1' \
      6. -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' \
      7. -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
      8. -H 'Sec-Fetch-Site: none' \
      9. -H 'Sec-Fetch-Mode: navigate' \
      10. -H 'Sec-Fetch-User: ?1' \
      11. -H 'Sec-Fetch-Dest: document' \
      12. -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' \
      13. -H 'Cookie: PSTM=1589621705; BAIDUID=BC3B63E7833EB3D77970A2CF9AE7F4A2:FG=1; BIDUPSID=016405978E2364A4AFD0227A36DA60DE; BD_UPN=123253; BDUSS=nl2a3EzNGp-aGdham5xanhVYjZLbXNWTENBRWl0VTJuLTVEUGJOa2VodjhGTzVlRVFBQUFBJCQAAAAAAAAAAAEAAACCgXjpQm9yaXMwNjIxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyHxl78h8ZeW; delPer=0; BD_CK_SAM=1; BD_HOME=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=1; ZD_ENTRY=google; H_PS_PSSID=1442_31672_21102_32046_31321_30823_32107_26350; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm' \
      14. --compressed
      15. MainThread|2020-06-21 23:29:48,773|request.py|get_response|line:283|DEBUG|
      16. -------------- None.parser request for ----------------
      17. url = https://www.baidu.com/
      18. method = POST
      19. body = {'data': {}, 'headers': {'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Cookie': 'PSTM=1589621705; BAIDUID=BC3B63E7833EB3D77970A2CF9AE7F4A2:FG=1; BIDUPSID=016405978E2364A4AFD0227A36DA60DE; BD_UPN=123253; BDUSS=nl2a3EzNGp-aGdham5xanhVYjZLbXNWTENBRWl0VTJuLTVEUGJOa2VodjhGTzVlRVFBQUFBJCQAAAAAAAAAAAEAAACCgXjpQm9yaXMwNjIxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyHxl78h8ZeW; delPer=0; BD_CK_SAM=1; BD_HOME=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=1; ZD_ENTRY=google; H_PS_PSSID=1442_31672_21102_32046_31321_30823_32107_26350; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm'}, 'proxies': None, 'timeout': 22, 'stream': True, 'verify': False}
      20. <Response [200]>
      21. Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
      22. Type 'copyright', 'credits' or 'license' for more information
      23. IPython 7.14.0 -- An enhanced Interactive Python. Type '?' for help.
      24. now you can use response
      25. In [1]: