使用cmd创建一个scrapy项目:
scrapy startproject project_name (project_name 必须以字母开头,只能包含字母、数字以及下划线)
项目目录层级如下:
声明Item
声明我们可能用到的所有字段,包括管理字段等。管理字段可以让我们清楚何时(date)、何地(url server)及如何(spider)执行爬去,此外,还可以自动完成诸如使item失效、规划新的抓取迭代或是删除来自有问题的爬虫的item。
管理字段
Python表达式
url
response.url
例:‘http://www.baidu.com’
project
self.ettings.get('BOT_NAME')
例:‘crawl_novel’
spider
self.name
例:‘basic’
server
socket.gethostname()
例:‘scrapyserverl’
date
datetime.datetime.now()
例:‘datetime.datetime(2019,1,21……)’
1 #-*- coding: utf-8 -*-
2
3 #Define here the models for your scraped items
4 #5 #See documentation in:
6 #https://doc.scrapy.org/en/latest/topics/items.html
7
8 importscrapy9
10
11 classCrawlNovelItem(scrapy.Item):12 #Primary fields
13 title =scrapy.Field()14 author =scrapy.Field()15 classify =scrapy.Field()16 recommend =scrapy.Field()17 chapter_urls =scrapy.Field()18
19 #Calculated fields
20 chapter =scrapy.Field()21
22 #Housekeeping fields
23 url =scrapy.Field()24 project =scrapy.Field()25 spider =scrapy.Field()26 server =scrapy.Field()27 date = scrapy.Field()
编写爬虫并填充item
使用scrapy genspider 命令
scrapy genspider -l 查看可用模板
scrapy genspider -t 使用任意其他模板创建爬虫
e.g. scrapy genspider basic www spiders目录中新增一个basic.py文件,并限制只能爬取www域名下的url
使用 scrapy crawl 命令运行爬虫文件
e.g. scrapy crawl basic (basic是spider下的爬虫文件)
使用 scrapy parse命令用不同页面调试代码
e.g. scrapy parse --spider=basic http://www.……
使用scrapy crawl basic -o +文件名.文件类型 保存文件
e.g. scrapy crawl basic -o items.json(items.csv、items.j1、items.xml)
basic.py
1 #-*- coding: utf-8 -*-
2 importscrapy3
4 from crawl_novel.items importCrawlNovelItem5
6
7 classBasicSpider(scrapy.Spider):8 name = 'basic'
9 allowed_domains = ['www']10 start_urls = ['http://www.biquge.info/22_22559/']11
12 defparse(self, response):13 '''
14 self.log("title: %s" % response.xpath('//h1[1]/text()').extract())15 self.log("author: %s" % response.xpath('//*[@id="info"]/p[1]/text()').extract())16 self.log("classify: %s" % response.xpath('//*[@id="info"]/p[2]/text()').extract())17 self.log("recommend: %s" % response.xpath('//*[@id="listtj"]//text()').extract())18 self.log("chapter_urls %s" % response.xpath('//*[@id="list"]//a').extract())19 '''
20 #填充item
21 item =CrawlNovelItem()22 item['title'] = response.xpath('//h1[1]/text()').extract()23 item['author'] = response.xpath('//*[@id="info"]/p[1]/text()').extract()24 item['classify'] = response.xpath('//*[@id="info"]/p[2]/text()').extract()25 item['recommend'] = response.xpath('//*[@id="listtj"]//text()').extract()26 item['chapter_urls'] = response.xpath('//*[@id="list"]//a/@href').extract()27 return item
清理——item装载器、添加管理字段,并对数据进行格式化和清洗
使用ItemLoader以代替那些杂乱的extract()和xpath()操作
使用MapCompose参数
使用lambda表达式
1 #-*- coding: utf-8 -*-
2 importdatetime3 importsocket4 importurlparse5
6 importscrapy7 from scrapy.loader importItemLoader8 from scrapy.loader.processors importMapCompose, Join9
10 from crawl_novel.items importCrawlNovelItem11
12
13 classBasicSpider(scrapy.Spider):14 name = 'basic'
15 allowed_domains = ['www']16 start_urls = ['http://www.biquge.info/22_22559/']17
18 defparse(self, response):19 #定义装载器
20 l = ItemLoader(item=CrawlNovelItem(), response=response)21 #使用处理器
22 #去除首位空白符,使结果按照收尾标题格式
23 l.add_xpath('title', '//h1[1]/text()', MapCompose(unicode.strip, unicode.title))24 l.add_xpath('author', '//*[@id="info"]/p[1]/text()', MapCompose(unicode.strip))25 l.add_xpath('classify', '//*[@id="info"]/p[2]/text()', MapCompose(unicode.strip))26 #将多个结果连接在一起
27 l.add_xpath('recommend', '//*[@id="listtj"]//text()', Join())28 #使用lambda表达式(以response.url为基础,将相对路径i转化为绝对路径)
29 l.add_xpath('chapter_urls', '//*[@id="list"]//a/@href', MapCompose(lambdai: urlparse.urljoin(response.url, i)))30 #添加管理字段
31 l.add_value('url', response.url)32 l.add_value('project', self.settings.get('BOT_NAME'))33 l.add_value('spider', self.name)34 l.add_value('server', socket.gethostname())35 l.add_value('date', datetime.datetime.now())36
37 return l.load_item()
创建contract,检验代码可用性
使用scrapy check + 文件名 执行
e.g. scrapy check basic
1 defparse(self, response):2 """This function parses a property page.3
4 @url http://www.biquge.info/22_22559/5 @returns items 16 @scrapes title author classify recommend chapter_urls7 @scrapes url project spider server date8 """
9 #定义装载器
10 l = ItemLoader(item=CrawlNovelItem(), response=response)11 ……