安装scrapy
不同操作系统安装操作不同,可以直接看官方文档
创建一个项目
在命令行输入
scrapy startproject tutorial
进入项目目录创建一个spider
cd tutorialscrapy genspider quotes domain.com
import scrapyclass QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = 'quotes-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Saved file %s' % filename)
运行scrapy,在项目顶级目录下输入命令
scrapy crawl quotes
在QuotesSpider这个类里,name指明spider的名称,在start_requests函数里发出请求,用parse函数处理请求返回的结果,start_requests函数可以替换为start_urls列表,scrapy会自动帮我们发出请求,并默认用parse函数处理,还可以设置一些其它参数,详见
选择器用法
scrapy内置css选择器和xpath选择器,当然你也可以选择使用其他的解析库,比如BeautifulSoup,我们简单用scrapy shell展示一下scrapy内置选择器的用法,在命令行中输入
scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
示例代码
Example website
# 获取标题# selector可以去掉# extract返回的是列表response.selector.xpath('//title/text()').extract_first()response.selector.css('title::text').extract_first()# 获取a标签里href参数内容response.xpath('//a/@href').extract()response.css('a::attr(href)').extract()# 混合获取img标签的src属性response.xpath('//div[@id="images"]').css('img::attr(src)').extract()# 获取a标签中包含image的href属性response.xpath('//a[contains(@href, "image")]/@href').extract()response.css('a[href*=image]::attr(href)').extract()# 使用正则表达式response.css('a::text').re('Name\:(.*)')response.css('a::text').re_first('Name\:(.*)')# 添加default参数指定默认提取信息response.css('aa').extract_first(default='')
Item Pipeline用法
通过parse处理函数返回的Item可以用Item Pipeline进行加工处理,主要是数据清洗,格式化。
# 过滤掉相同的itemclass DuplicatePipeline(object): def __init__(self): self.items = set() def process_item(self, item, spider): if item['id'] in self.items: raise DropItem('Duplicate item found: %s' % item['id']) else: self.items.add(item['id']) return item
需要在settings里的注册一下自定义的Pipeline
ITEM_PIPELINES = { 'tutorial.pipelines.TutorialPipeline': 300, 'tutorial.pipelines.DuplicatePipeline': 200,}
数字越小,优先级越高