scrapy Crawl_spider
命令行输入:scrapy genspider --list 可以看到scrapy给我们提供的爬虫模板:
basic
crawl
csvfeed
xmlfeed
一般都是用默认模板生成的spider,如果需要选择模本可以用命令:
scrapy genspider -t crawl ....
关于pacharm中python的模块导入问题,正在编辑的模块如果希望作为导入模块的根目录可以右键项目文件然后如下图:
这样就可以直接导入项目中的文件作为模块了。
但是有个问题:如果是使用命令行模式的话,就不会自动将当前的项目文件夹作为root source, 于是可以通过自己进入settings文件(因为settings是scrapy命令的主入口)中设置。
import sys
sys.path.insert(0, '项目所在目录') # 第一个参数为优先级
但是此种方式添加的是绝对路径,可以用一种更加灵活的方式处理此问题:
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
crawlspdier
一些函数:
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
关于 itemloader
item loader 中的 rom scrapy.loader.processors import TakeFirst
TakeFirst()的用法为从列表中间取出第一个非空值,注意不是第一个值,而是非空值。
Compose
用给定多个函数组合构成processor,每个输入值传入到一个函数,在输出到第二个函数,类推,
Mapcompose
与compose类似,迭代处理一个列表值中的所有元素,遍历然后依次处理。
SelectJmes
用于查询json中的元素,传入key,返回value。不过需要先安装jmespath包
安装之后就可以使用这个processor了。
实例如下:
from scrapy.loader.processors import SelectJmes
processor = SelectJmes('foo')
print(processor({'foo':'bar'}))
运行结果: bar