python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说
Posted 三生石旁奈河桥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说相关的知识,希望对你有一定的参考价值。
使用cmd创建一个scrapy项目:
scrapy startproject project_name (project_name 必须以字母开头,只能包含字母、数字以及下划线<underscorce>)
项目目录层级如下:
声明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 import scrapy 9 10 11 class CrawlNovelItem(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 import scrapy 3 4 from crawl_novel.items import CrawlNovelItem 5 6 7 class BasicSpider(scrapy.Spider): 8 name = \'basic\' 9 allowed_domains = [\'www\'] 10 start_urls = [\'http://www.biquge.info/22_22559/\'] 11 12 def parse(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 import datetime 3 import socket 4 import urlparse 5 6 import scrapy 7 from scrapy.loader import ItemLoader 8 from scrapy.loader.processors import MapCompose, Join 9 10 from crawl_novel.items import CrawlNovelItem 11 12 13 class BasicSpider(scrapy.Spider): 14 name = \'basic\' 15 allowed_domains = [\'www\'] 16 start_urls = [\'http://www.biquge.info/22_22559/\'] 17 18 def parse(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(lambda i: 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 def parse(self, response): 2 """This function parses a property page. 3 4 @url http://www.biquge.info/22_22559/ 5 @returns items 1 6 @scrapes title author classify recommend chapter_urls 7 @scrapes url project spider server date 8 """ 9 # 定义装载器 10 l = ItemLoader(item=CrawlNovelItem(), response=response) 11 ……
以上是关于python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说的主要内容,如果未能解决你的问题,请参考以下文章
python应用:爬虫框架Scrapy系统学习第三篇——初识scrapy