python爬取系统_python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说...

使用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 ……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值