zoukankan      html  css  js  c++  java
  • 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         ……
  • 相关阅读:
    文件包含漏洞
    命令执行漏洞详解
    CSRF跨站请求伪造
    XSS跨站脚本攻击详解
    SQL盲注
    字符型注入、数字型注入、搜索型注入
    AWVS13扫描类型profile_id对照表
    Cobalt Strike 和 Metasploit Framework 联动
    msf常用命令
    上传嵌入式python环境进行渗透测试
  • 原文地址:https://www.cnblogs.com/jpapplication/p/10298045.html
Copyright © 2011-2022 走看看