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

 # -*- coding: utf-8 -*-

 # Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class CrawlNovelItem(scrapy.Item):
# Primary fields
title = scrapy.Field()
author = scrapy.Field()
classify = scrapy.Field()
recommend = scrapy.Field()
chapter_urls = scrapy.Field() # Calculated fields
chapter = scrapy.Field() # Housekeeping fields
url = scrapy.Field()
project = scrapy.Field()
spider = scrapy.Field()
server = scrapy.Field()
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

 # -*- coding: utf-8 -*-
import scrapy from crawl_novel.items import CrawlNovelItem class BasicSpider(scrapy.Spider):
name = 'basic'
allowed_domains = ['www']
start_urls = ['http://www.biquge.info/22_22559/'] def parse(self, response):
'''
self.log("title: %s" % response.xpath('//h1[1]/text()').extract())
self.log("author: %s" % response.xpath('//*[@id="info"]/p[1]/text()').extract())
self.log("classify: %s" % response.xpath('//*[@id="info"]/p[2]/text()').extract())
self.log("recommend: %s" % response.xpath('//*[@id="listtj"]//text()').extract())
self.log("chapter_urls %s" % response.xpath('//*[@id="list"]//a').extract())
'''
# 填充item
item = CrawlNovelItem()
item['title'] = response.xpath('//h1[1]/text()').extract()
item['author'] = response.xpath('//*[@id="info"]/p[1]/text()').extract()
item['classify'] = response.xpath('//*[@id="info"]/p[2]/text()').extract()
item['recommend'] = response.xpath('//*[@id="listtj"]//text()').extract()
     item['chapter_urls'] = response.xpath('//*[@id="list"]//a/@href').extract()
return item

清理——item装载器、添加管理字段,并对数据进行格式化和清洗

使用ItemLoader以代替那些杂乱的extract()和xpath()操作

使用MapCompose参数

使用lambda表达式

 # -*- coding: utf-8 -*-
import datetime
import socket
import urlparse import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose, Join from crawl_novel.items import CrawlNovelItem class BasicSpider(scrapy.Spider):
name = 'basic'
allowed_domains = ['www']
start_urls = ['http://www.biquge.info/22_22559/'] def parse(self, response):
# 定义装载器
l = ItemLoader(item=CrawlNovelItem(), response=response)
# 使用处理器
# 去除首位空白符,使结果按照收尾标题格式
l.add_xpath('title', '//h1[1]/text()', MapCompose(unicode.strip, unicode.title))
l.add_xpath('author', '//*[@id="info"]/p[1]/text()', MapCompose(unicode.strip))
l.add_xpath('classify', '//*[@id="info"]/p[2]/text()', MapCompose(unicode.strip))
# 将多个结果连接在一起
l.add_xpath('recommend', '//*[@id="listtj"]//text()', Join())
# 使用lambda表达式(以response.url为基础,将相对路径i转化为绝对路径)
l.add_xpath('chapter_urls', '//*[@id="list"]//a/@href', MapCompose(lambda i: urlparse.urljoin(response.url, i)))
# 添加管理字段
l.add_value('url', response.url)
l.add_value('project', self.settings.get('BOT_NAME'))
l.add_value('spider', self.name)
l.add_value('server', socket.gethostname())
l.add_value('date', datetime.datetime.now()) return l.load_item()

创建contract,检验代码可用性

使用scrapy check + 文件名 执行

  e.g. scrapy check basic

     def parse(self, response):
"""This function parses a property page. @url http://www.biquge.info/22_22559/
@returns items 1
@scrapes title author classify recommend chapter_urls
@scrapes url project spider server date
"""
# 定义装载器
l = ItemLoader(item=CrawlNovelItem(), response=response)
……

python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说的更多相关文章

  1. Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说

    注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...

  2. Python爬取笔趣阁小说,有趣又实用

    上班想摸鱼?为了摸鱼方便,今天自己写了个爬取笔阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 1. 首先导入相关的模块 import os import requests from ...

  3. scrapy框架爬取笔趣阁

    笔趣阁是很好爬的网站了,这里简单爬取了全部小说链接和每本的全部章节链接,还想爬取章节内容在biquge.py里在加一个爬取循环,在pipelines.py添加保存函数即可 1 创建一个scrapy项目 ...

  4. scrapy框架爬取笔趣阁完整版

    继续上一篇,这一次的爬取了小说内容 pipelines.py import csv class ScrapytestPipeline(object): # 爬虫文件中提取数据的方法每yield一次it ...

  5. 爬虫入门实例:利用requests库爬取笔趣小说网

    w3cschool上的来练练手,爬取笔趣看小说http://www.biqukan.com/, 爬取<凡人修仙传仙界篇>的所有章节 1.利用requests访问目标网址,使用了get方法 ...

  6. python入门学习之Python爬取最新笔趣阁小说

    Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...

  7. Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题

    解决下载(或叫:爬取)到的网页乱码问题 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 20 ...

  8. python网络爬虫(12)去哪网酒店信息爬取

    目的意义 爬取某地的酒店价格信息,示例使用selenium在Firefox中的使用. 来源 少部分来源于书.python爬虫开发与项目实战 构造 本次使用简易的方案,模拟浏览器访问,然后输入字段,查找 ...

  9. 用python爬虫简单爬取 笔趣网:类“起点网”的小说

    首先:文章用到的解析库介绍 BeautifulSoup: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能. 它是一个工具箱,通过解析文档为用户提供 ...

随机推荐

  1. Process.start: how to get the output?

    1: Synchronous example static void runCommand() { Process process = new Process(); process.StartInfo ...

  2. 【Leetcode】【Medium】Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  3. 如何使用Flashfxp上传下载文件

    一.首先您本地电脑需要安装flashfxp软件,您可以通过百度搜索下载. 二.我们打开flashfxp,然后在右上角点击“会话”,再点击“快速连接”,如下图. 三.弹出“如下图”窗口.请输入FTP连接 ...

  4. 虚拟机装ubuntu (kylin) 时常遇问题

    在想保留Windows操作系统的同时还能用Linux进行学习和开发,安装双系统或安装虚拟机都是不错的选择,依个人情况而定. (P.S:此行留给后期会写的双系统博客) 这篇文章收集了自己在用VMware ...

  5. libevent-signal(1)

    现在已经知道,libevent有三种事件类型,分别是时钟事件,信号事件,i/o事件.今天就分析一下信号事件,下面是一个简单的信号事件demo #include <sys/types.h> ...

  6. getResource和getResourceAsStream

    1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...

  7. 字符串拼接+和concat的区别

    +和concat都可以用来拼接字符串,但在使用上有什么区别呢,先来看看这个例子. public static void main(String[] args) { // example1 String ...

  8. 「FJ2014集训 采药人的路径」

    题目 考虑一下把\(0\)看成\(-1\),那么就是找到一条边权和为\(0\)的路径,且这条路径可以被分成两段,边权和都是\(0\) 没有第二个限制就是点分裸题了 其实有了第二个限制还是点分裸题 考虑 ...

  9. Kali-linux攻击WordPress和其他应用程序

    今天越来越多的企业利用SAAS(Software as a Service)工具应用在他们的业务中.例如,他们经常使用WordPress作为他们网站的内容管理系统,或者在局域网中使用Drupal框架. ...

  10. 用@ExceptionHandler 来进行异常处理

    有时候我们想统一处理一个Controller中抛出的异常怎么搞呢? 直接在Controller里面加上用@ExceptionHandler标注一个处理异常的方法像下面这样子 @ExceptionHan ...