命令行输入:scrapy genspider --list 能够看到scrapy给咱们提供的爬虫模板:css
basic
crawl
csvfeed
xmlfeedpython
通常都是用默认模板生成的spider,若是须要选择模本能够用命令:正则表达式
scrapy genspider -t crawl ....json
关于pacharm中python的模块导入问题,正在编辑的模块若是但愿做为导入模块的根目录能够右键项目文件而后以下图:数组
这样就能够直接导入项目中的文件做为模块了。dom
可是有个问题:若是是使用命令行模式的话,就不会自动将当前的项目文件夹做为root source, 因而能够经过本身进入settings文件(由于settings是scrapy命令的主入口)中设置。scrapy
import sys
sys.path.insert(0, '项目所在目录') # 第一个参数为优先级
可是此种方式添加的是绝对路径,能够用一种更加灵活的方式处理此问题:ide
import os
import sys base_dir=os.path.dirname(os.path.abspath(os.path.dirname(__file__))) sys.path.insert(0, os.path.join(base_dir, '当前项目名称')) #将路径加入到python path当中。使其能够直接import
rules函数
爬取的规则属性,包含一个或多个Rule对象的列表,每一个Rule都对爬取网站的动做作了定义,Criwlspider将读取rules每个Rule并进行解析网站
parse_start_url(),是一个可重写的方法,当start_urls里面对应的Request返回Response时,该方法被调用,它会分析Response并返回item或者Request对象。
Rule 定义:
def __init__(self, allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(),
tags=('a', 'area'), attrs=('href',), canonicalize=False, unique=True, process_value=None, deny_extensions=None, restrict_css=(), strip=True):
allow 是一个正则表达式列表,定义从当前页面提取符合匹配的连接。deny相反,allow_domains定义了域名,只有符合该域名的才跟进。deny_domains相反,restrict_xpath和restrict_xpath表示限定allow查找的区域。tags=('a', 'area')表示从哪些标签中找连接。attrs=('href'),从标签中找什么属性的连接。callback:回调函数,每次提取到链接时候,调用该函数,注意要避免使用parse做为回调函数。由于Crawlspider使用的parse()方法来实现其逻辑的,若是覆盖了parse()方法,Crawlspider将运行失败。
ca_kwargs:字典,包含传递给回调函数的参数。
follow:指定提取的连接是否须要跟进。若是callback参数为None,则follow默认为Ture,不然默认为False
process_links:指定的处理函数,从Llink_extract中获取到链接时候,被调用,主要用于判别连接和过滤。
process_reuquest:指定处理函数,跟进该Rule提取到的每一个Ruquest时,该函数被调用,对Request进行处理,返回Request或者None
item loader 中的 rom scrapy.loader.processors import TakeFirst
TakeFirst()的用法为从列表中间取出第一个非空值,注意不是第一个值,而是非空值。
用给定多个函数组合构成processor,每一个输入值传入到一个函数,在输出到第二个函数,类推,
与compose相似,迭代处理一个列表值中的全部元素,遍历而后依次处理。
用于查询json中的元素,传入key,返回value。不过须要先安装jmespath包
安装以后就可使用这个processor了。
实例以下:
from scrapy.loader.processors import SelectJmes
processor = SelectJmes('foo')
print(processor({'foo':'bar'}))
运行结果: bar