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

python应用:爬虫框架Scrapy系统学习第二篇——windows下安装scrapy

Scrapy学习第四课

Python学习---爬虫学习[scrapy框架初识]

Python Scrapy爬虫框架实战应用

Python Scrapy爬虫框架实战应用